{
Today I want to display how you may use the simple functions as
alternative for TOpenDialog/TSaveDialog components.
Problem is that Borland incorrectly wrote those components and when
Microsoft add some new extended features in own dialogs,
standard TOpenDialog and TSaveDialog still use old style.
For example, when Microsoft added placebar in own dialogs,
VCL's dialog still use old style without placebars.
Personally I prefer to use applications that support all
features of installed OS.
This is a reason why I wrote the function as wrapper for Windows
API call for dialogs and now I use this function instead components.
It allow not only to use all new features from Windows,
but also reduce a size for exe-file and allow to use same function for
both TOpenDialog and TSaveDialog functionality.
For example:
1. to display the "OpenDialog" for text files
s := 'aaa.txt';
if OpenSaveFileDialog(Application.Handle, 'txt', 'Text Files|*.txt', 'c:\',
'Select text file', s, True) then
ShowMessage(s + ' file was selected for open')
2. to display the "Save dialog":
s := 'data.dbf';
if OpenSaveFileDialog(Application.Handle, 'dbf', 'dBase tables|*.dbf|All files|*.*',
'c:\', 'Select table', s, False) then
ShowMessage(s + ' table was selected for save')
See full code below. Hope you'll find this code useful.
}
uses Windows;
function OpenSaveFileDialog(ParentHandle: THandle; const DefExt, Filter, InitialDir,
Title: string; var FileName: string; IsOpenDialog: Boolean): Boolean;
function GetOpenFileName(var OpenFile: TOpenFilename): Bool; stdcall; external 'comdlg32.dll' name 'GetOpenFileNameA'; function GetSaveFileName(var OpenFile: TOpenFilename): Bool; stdcall; external 'comdlg32.dll' name 'GetSaveFileNameA';
function CharReplace(const Source: string; oldChar, newChar: Char): string; var i: Integer; begin Result := Source; for i := 1 to Length(Result) do
if Result[i] = oldChar then Result[i] := newChar end;
function OpenSaveFileDialog(ParentHandle: THandle; const DefExt, Filter, InitialDir, Title: string; var FileName: string; IsOpenDialog: Boolean): Boolean; var ofn: TOpenFileName;
szFile: array[0..MAX_PATH] of Char; begin Result := False;
FillChar(ofn, SizeOf(TOpenFileName), 0); with ofn do
begin lStructSize := SizeOf(TOpenFileName);
hwndOwner := ParentHandle;
lpstrFile := szFile;
nMaxFile := SizeOf(szFile); if (Title <> '') then lpstrTitle := PChar(Title); if (InitialDir <> '') then lpstrInitialDir := PChar(InitialDir);
StrPCopy(lpstrFile, FileName);
lpstrFilter := PChar(CharReplace(Filter, '|', #0)+#0#0); if DefExt <> '' then lpstrDefExt := PChar(DefExt); end; if IsOpenDialog then
begin
if GetOpenFileName(ofn) then
begin Result := True;
FileName := StrPas(szFile); end; end
else
begin
if GetSaveFileName(ofn) then
begin Result := True;
FileName := StrPas(szFile); end; end
end;