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

Reply via email to