// Mit diesem Code
erstellt man einen NON-VCL-Dialog zum Öffnen oder
// Speichern von Dateien, welcher in etwa dem
TOpenDialog
der VCL
// entspricht, aber zusätzlich wird
(zumindest bei D4)
eine Leiste
// mit "Verlauf", "Desktop", "Arbeitsplatz" und "Netzwerkumgebung"
// angezeigt.
// Getestet mit RS 10.4 unter W11
uses Winapi.commdlg;
function OpenSaveDialog(H: THandle; opn: boolean;
Titel, Filter, IniDir, DefaultExt: string; idx: Cardinal): string;
var
tfn: TOpenFilename;
buffer: PChar;
mp: Cardinal;
so: Integer;
begin
Result := '';
mp := MAX_PATH;
so := sizeof(tfn);
zeromemory(@tfn, so);
buffer := AllocMem(mp);
tfn.lStructSize := so;
tfn.lpstrTitle := PChar(Titel);
tfn.hwndOwner := H;
tfn.lpstrFilter := PChar(Filter);
tfn.nFilterIndex := idx;
tfn.lpstrInitialDir := PChar(IniDir);
tfn.flags := OFN_HIDEREADONLY;
tfn.lpstrFile := buffer;
tfn.nMaxFile := mp;
tfn.nMaxFileTitle := mp;
tfn.lpstrDefExt := PChar(DefaultExt);
if opn then
begin
tfn.flags := tfn.flags or OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST;
if GetOpenFileName(tfn) then
Result := tfn.lpstrFile;
end
else
begin
tfn.flags := tfn.flags or OFN_OVERWRITEPROMPT;
if GetSaveFileName(tfn) then
Result := tfn.lpstrFile;
end;
FreeMem(buffer);
end;
function OpenDialog(H: THandle; Titel, Filter, IniDir, DefaultExt: string;
idx: Cardinal): string;
begin
Result := OpenSaveDialog(H, TRUE, Titel, Filter, IniDir, DefaultExt, idx);
end;
function SaveDialog(H: THandle; Titel, Filter, IniDir, DefaultExt: string;
idx: Cardinal): string;
begin
Result := OpenSaveDialog(H, FALSE, Titel, Filter, IniDir, DefaultExt, idx);
end;
// Beispiele
procedure TForm1.Button1Click(Sender: TObject);
var
s, Filter: string;
begin
Filter := 'Alle Dateien'#0'*.*'#0 + 'Bitmap'#0'*.bmp'#0 +
'JPeg'#0'*.jpg;*.jpeg'#0;
s := OpenDialog(Handle, '* Bilder öffnen *', Filter, 'D:\Bilder', 'bmp', 2);
if s <> '' then
Image1.picture.loadfromfile(s);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
s, pfd: string;
begin
pfd := 'D:\Bilder\';
s := SaveDialog(Handle, '* Speichern *', 'Bitmap'#0'*.bmp'#0, pfd, 'bmp', 1);
if s <> '' then
Image1.picture.savetofile(s);
end;
|