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