Thank you for this example!  It works perfectly and I now have my console 
program putting up message boxes and opening a Save-As box as needed.

James 

-----Original Message-----
From: fpc-pascal <fpc-pascal-boun...@lists.freepascal.org> On Behalf Of 
Alexander Grotewohl
Sent: Sunday, November 4, 2018 11:48 AM
To: fpc-pascal@lists.freepascal.org
Subject: Re: [fpc-pascal] Windows programming tutorials for FPC

Program TestGetSaveFileNameA;
Uses windows, commdlg;

Var
    TFilename                                      : TOpenFileNameA;

    ret: array[0..100] of char;

Begin
    Writeln('Start');

    fillchar(TFileName, sizeof(TFileName), 0);
    TFileName.lStructSize:=sizeof(TFileName);

    TFileName.hwndOwner:=0;
    TFileName.lpstrFile:=ret;
    TFileName.lpstrFile[0]:=#0;
    TFileName.lpstrFilter:='Text Files (*.txt)'+#0+'*.txt'+#0;
    TFileName.nMaxFile:=100;
    TFileName.Flags := OFN_EXPLORER or OFN_FILEMUSTEXIST or OFN_HIDEREADONLY;
    TFileName.lpstrDefExt:='txt';

    Writeln(GetSaveFileNameA(@TFilename));
    Writeln('Finished with '+strpas(TFileName.lpstrFile));
    Readln;
End.


On 11/4/2018 11:21 AM, James wrote:
> This is very interesting, thank you for the code on how to define the 
> GetSaveFileNameA function.  I wrote a sample program to get it to work, but I 
> think I have some syntax wrong, or maybe I'm not initializing something 
> correctly.   It compiles ok, but it doesn't execute even my writeln's, I just 
> get an exit code = 1
>
> James
>
> Program TestGetSaveFileNameA;
> Uses CRT,Classes,Sysutils,windows;
> Type
>       TOpenFileNameAHookProc = function(Wnd: HWND; Msg: UINT; wParam: 
> WPARAM;
> lParam: LPARAM): UINT stdcall;
>
>       TOpenFileNameA = Packed Record
>               lStructSize: DWord;
>               hWndOwner: HWND;
>               hInstance: HINST;
>               lpstrFilter: PChar;
>               lpstrCustomFilter: PChar;
>               nMaxCustFilter: DWord;
>               nFilterIndex: DWord;
>               lpstrFile: PChar;
>               nMaxFile: DWord;
>               lpstrFileTitle: PChar;
>               nMaxFileTitle: DWord;
>               lpstrInitialDir: PChar;
>               lpstrTitle: PChar;
>               Flags: DWord;
>               nFileOffset: Word;
>               nFileExtension: Word;
>               lpstrDefExt: PChar;
>               lCustData: LPARAM;
>               lpfnHook: TOpenFileNameAHookProc;
>               lpTemplateName: PChar;
>               lpEditInfo: Pointer;            // Undocumented?
>               lpstrPrompt: PChar;
>               _Reserved1: Pointer;
>               _Reserved2: DWord;
>               FlagsEx: DWord;
>       End;
>       POpenFileNameA = ^TOpenFileNameA;
>
> Function GetSaveFileNameA(arg: POpenFileNameA): windows.bool; stdcall; 
> external 'comdlg32' name 'GetSaveFileNameA';
>
> Var
>     TFilename                                      : TOpenFileNameA;
>     PFilename                                      : POpenFileNameA;
>
> Begin
>     Writeln('Start');
>     TFilename.lpstrInitialDir:=Pchar('I:\');
>     Pfilename:=@Tfilename;
>     Writeln(GetSaveFileNameA(PFilename));
>     Writeln('Finished');
>     Readln;
> End.
>
>
>
>
>
> -----Original Message-----
> From: fpc-pascal <fpc-pascal-boun...@lists.freepascal.org> On Behalf 
> Of Ewald
> Sent: Sunday, November 4, 2018 8:06 AM
> To: fpc-pascal@lists.freepascal.org
> Subject: Re: [fpc-pascal] Windows programming tutorials for FPC
>
> On 11/03/2018 09:04 PM, James wrote:
>> So my question is, how can I use Ifilesavedialog with just FreePascal 
>> in a console application?
> First off, the IFileSaveDialog is an interface, not a simple function.
> So, you'll need to:
>       - Include the right units from freepascal (ActiveX and comobj
>             IIRC)
>       - Initialize and finalize the COM subsystem (see CoInitialize
>             and CoUninitialize)
>       - Use the CoCreateInstance to instantiate an IFileSaveDialog,
>             etc.. I've never used the IFileSaveDialog myself, so have a
>             look at
> https://msdn.microsoft.com/en-us/library/windows/desktop/bb776913%28v=
> vs.85%29.aspx#usage
>
> That's the nice thing about the GetSaveFileNameA function: one call, 
> and you're done :-)
>
> Now, if this function is not defined in the windows unit (which could 
> be the case), you can either look into some other units or simply 
> define it
> yourself:
>
> === code begin ===
> Type
>       TOpenFileNameAHookProc = function(Wnd: HWND; Msg: UINT; wParam: 
> WPARAM;
> lParam: LPARAM): UINT stdcall;
>
>       TOpenFileNameA = Packed Record
>               lStructSize: DWord;
>               hWndOwner: HWND;
>               hInstance: HINST;
>               lpstrFilter: PChar;
>               lpstrCustomFilter: PChar;
>               nMaxCustFilter: DWord;
>               nFilterIndex: DWord;
>               lpstrFile: PChar;
>               nMaxFile: DWord;
>               lpstrFileTitle: PChar;
>               nMaxFileTitle: DWord;
>               lpstrInitialDir: PChar;
>               lpstrTitle: PChar;
>               Flags: DWord;
>               nFileOffset: Word;
>               nFileExtension: Word;
>               lpstrDefExt: PChar;
>               lCustData: LPARAM;
>               lpfnHook: TOpenFileNameAHookProc;
>               lpTemplateName: PChar;
>               lpEditInfo: Pointer;            // Undocumented?
>               lpstrPrompt: PChar;
>               _Reserved1: Pointer;
>               _Reserved2: DWord;
>               FlagsEx: DWord;
>       End;
>       POpenFileNameA = ^TOpenFileNameA;
>
> Function GetSaveFileNameA(arg: POpenFileNameA): windows.bool; stdcall; 
> external 'comdlg32' name 'GetSaveFileNameA'; === code end ===
>
>
> --
> Ewald
> _______________________________________________
> fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org 
> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
> _______________________________________________
> fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org 
> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org 
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to