Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Windows OpenFileDialog - wie bekomme ich den? (https://www.delphipraxis.net/195755-windows-openfiledialog-wie-bekomme-ich-den.html)

Piro 22. Mär 2018 16:26

Windows OpenFileDialog - wie bekomme ich den?
 
Liste der Anhänge anzeigen (Anzahl: 2)
Moin,

der normale OpenFileDialog ist ja ganz schön aber wie bekomme ich diesen Dialog, wie man ihn von Windows kennt.

Der 1. Screenshot zeigt den Dialog den ich gerne hätte. Der 2. Screenshot zeigt den StandardDialog.

Wie rufe ich den 1. Dialog auf?

Danke im Voraus.

Sven

günni0 22. Mär 2018 16:29

AW: Windows OpenFileDialog - wie bekomme ich den?
 
TOpenDialog ?

himitsu 22. Mär 2018 16:30

AW: Windows OpenFileDialog - wie bekomme ich den?
 
1 ist nicht der Standarddialog.

Beides sind die gleichen Dialoge, aber da wurde an Beiden nachträglich unten an den Buttons/Optionen rumgepfuscht.
Bei 2 wurde "Codierung" hinzugefügt. (gibt mehrere Tutorials/Beispiele, wie man das selber machen kann)

Und links die Anzeige, das kann man in den Optionen der Dialoge einstellen.


Offiziell (in Delphi):
TOpenDialog die alte API (XP)
TFileOpenDialog die neue API (seit Vista)
aber der TOpenDialog leitet seit Vista (Delphi XE oder so) intern auf TFileOpenDialog um.

Intern grauenhaft umgeleitet ... also besser direkt TFileOpenDialog verwenden, wenn das Programm eh nicht meht auf XP und älter laufen wird.
Und da hast du dann auch direkt die aktuelleren Optionen zum richtig einstellen.

KodeZwerg 22. Mär 2018 22:08

AW: Windows OpenFileDialog - wie bekomme ich den?
 
Ich habe mir mal vor Ewigkeiten eine eigene Unit dafür angelegt, greift auf die Api zu anstelle der Delphi verbauten.
Wer mag kann damit rumspielen, der Code ist selbsterklärend.
Delphi-Quellcode:
uses Windows;

function OpenSaveFileDialog(ParentHandle: THandle; const DefExt, Filter, InitialDir,
  Title: string; var FileName: string; IsOpenDialog: Boolean): Boolean;

implementation
uses ShlObj, SysUtils;

type
  POpenFilenameA = ^TOpenFilenameA;
  POpenFilename = POpenFilenameA;
  tagOFNA = packed record
    lStructSize: DWORD;
    hWndOwner: HWND;
    hInstance: HINST;
    lpstrFilter: PAnsiChar;
    lpstrCustomFilter: PAnsiChar;
    nMaxCustFilter: DWORD;
    nFilterIndex: DWORD;
    lpstrFile: PAnsiChar;
    nMaxFile: DWORD;
    lpstrFileTitle: PAnsiChar;
    nMaxFileTitle: DWORD;
    lpstrInitialDir: PAnsiChar;
    lpstrTitle: PAnsiChar;
    Flags: DWORD;
    nFileOffset: Word;
    nFileExtension: Word;
    lpstrDefExt: PAnsiChar;
    lCustData: LPARAM;
    lpfnHook: function(Wnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): UINT stdcall;
    lpTemplateName: PAnsiChar;
  end;
  TOpenFilenameA = tagOFNA;
  TOpenFilename = TOpenFilenameA;

function GetOpenFileName(var OpenFile: TOpenFilename): Bool; stdcall; external 'comdlg32.dll' name 'GetOpenFileNameA';
function GetSaveFileName(var OpenFile: TOpenFilename): Bool; stdcall; external 'comdlg32.dll' name 'GetSaveFileNameA';

const
  OFN_DONTADDTORECENT = $02000000;
  OFN_FILEMUSTEXIST = $00001000;
  OFN_HIDEREADONLY = $00000004;
  OFN_PATHMUSTEXIST = $00000800;

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;

EWeiss 23. Mär 2018 05:14

AW: Windows OpenFileDialog - wie bekomme ich den?
 
Oder man baut sich selber was. LOL

gruss

Piro 23. Mär 2018 14:27

AW: Windows OpenFileDialog - wie bekomme ich den?
 
Cool.

Das Forum und sein Mitglieder sind einzigartig. Ich kenne ich von keinem anderen Forum.

Ich verwendet den TFileOpenDialog. Der reicht mir völlig. Hatte ich bis dato gar nicht auf dem Radar.

Gruß und schönes WE
Sven


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz