This line:

Writeln(GetSaveFileNameA(@TFilename));

What does it write when you select a file vs when you click x/cancel?
:-):-)

On 11/12/2018 4:31 AM, James wrote:
I've been using the example below to use the Save-as dialog in my console 
program, and it works great, but I would like to be able to detect if the user 
pushes either the red X or the cancel button in the dialog.   I am supplying a 
suggested default name, and what's happening is if the user cancels or hits the 
red X, it just saves the file using the suggested default name, but the correct 
behavior would be to not save anything.   I'm not sure how this is normally 
done with GetSaveFileNameA.


-----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
_______________________________________________
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