SaveFileRequester vs. API

 


Для языка есть немало диалоговых окон, но есть один недостаток. Например, в диалоговом окне сохранения файла нет встроенного флага "перезапись существующего". Также, в окне открытия файла нет флага "файл должен существовать".  Хотелки давно озвучены на форумах, но автор так и не почесался, но умудрился наплодить массу глюков.

Обходной путь - использовать существующие функции API. Лет 20 назад, я порядочно помаялся, но смог запустить эти окна. Сейчас взял готовый пример, ввел нужные данные для структуры  OPENFILENAME, но получил ошибку. Нашел на буржуйском форуме заумный пример использования и переписал код в версии ANSI

If OpenWindow(0, 0, 0, 322, 205, "open file", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  file_save.OPENFILENAME
  file_save\lStructSize=SizeOf(OPENFILENAME)
  file_save\hwndOwner=WindowID(0); window owner
  hinst.l=GetModuleHandle_(0)
  file_save\hInstance=hinst
  file_save\lpstrFilter=?flt_save_name
  *tmpbuf1=AllocateMemory($4000)
  file_save\lpstrFile=*tmpbuf1;must be 0
  file_save\nFilterIndex=2    ; 1-hhc,2-txt
  file_save\nMaxFile=$03FF
  file_save\lpstrDefExt=0
  file_save\Flags=#OFN_HIDEREADONLY|#OFN_EXPLORER|#OFN_OVERWRITEPROMPT;|#OFN_FILEMUSTEXIST
  file_save\lpstrCustomFilter=0
  file_save\nMaxCustFilter=1023-12
  file_save\lpstrDefExt=0;?lst_ext
  
  file_save\lpstrTitle=?title
  
  id.s=GetCurrentDirectory()
  file_save\lpstrInitialDir=@id
  
  If GetSaveFileName_(@file_save)
    Debug PeekS(*tmpbuf1)
  Else
    ; CDERR_GENERALCODES      equ 0000h
    ; CDERR_STRUCTSIZE        equ 0001h
    ; CDERR_INITIALIZATION    equ 0002h
    ; CDERR_NOTEMPLATE        equ 0003h
    ; CDERR_NOHINSTANCE       equ 0004h
    ; CDERR_LOADSTRFAILURE    equ 0005h
    ; CDERR_FINDRESFAILURE    equ 0006h
    ; CDERR_LOADRESFAILURE    equ 0007h
    ; CDERR_LOCKRESFAILURE    equ 0008h
    ; CDERR_MEMALLOCFAILURE   equ 0009h
    ; CDERR_MEMLOCKFAILURE    equ 000Ah
    ; CDERR_NOHOOK            equ 000Bh
    ; CDERR_REGISTERMSGFAIL   equ 000Ch
    Debug  CommDlgExtendedError_()
  EndIf
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
FreeMemory(*tmpbuf1)
DataSection
  flt_save_name:
  Data.s"Table of Contents","*.HHC"
  Data.s"Text","*.TXT"
  Data.a 0
  
  title:
  Data.s "Dzhigurda"
  ; lst_ext:
  ;   Data.s "htm"
  ;   Data.a 0

Расписывать нет смысла, лучше почитать справку, которая объясняет назначения структуры.

Комментарии