[fpc-pascal] Windows programming tutorials for FPC

James james at productionautomation.net
Mon Nov 5 03:06:55 CET 2018


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-bounces at lists.freepascal.org> On Behalf Of Alexander Grotewohl
Sent: Sunday, November 4, 2018 11:48 AM
To: fpc-pascal at 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-bounces at lists.freepascal.org> On Behalf 
> Of Ewald
> Sent: Sunday, November 4, 2018 8:06 AM
> To: fpc-pascal at 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 at lists.freepascal.org 
> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
> _______________________________________________
> fpc-pascal maillist  -  fpc-pascal at lists.freepascal.org 
> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

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



More information about the fpc-pascal mailing list