[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