Das TOpenFileName-Record


Das Record TOpenFileName wird sowohl vom Öffnen- als auch vom Speicherndialog verwendet. Es bietet uns (über Flags u.ä.) Zugriff auf die Gestaltung des jeweiligen Dialoges, und natürlich brauchen wir sie um den Dateinamen in Erfahrung zu bringen.
Es ist mit den Eigenschaften der VCL-Komponenten TOpenDialog und TSaveDialog vergleichbar, und wenn Sie bereits Erfahrungen mit diesen Komponenten haben, werden Ihnen viele Variablen von TOpenFileName bekannt vorkommen.

Wie bei einigen anderen Systemfunktionen müssen Sie das Record erst initialisieren, indem Sie ihm seine eigene Größe zuweisen:

ofn.lStructSize := SizeOf(TOpenFileName);


Wenn Sie die Dialoge bereits mit der VCL verwendet haben, dann sind Sie daran gewöhnt, dass die einzelnen Elemente des Dateifilters durch die Pipe (den senkrechten Strich) voneinander getrennt sind. Beim Aufruf der API-Funktion verwenden Sie stattdessen das Zeichen Null als Trenner, und Sie schließen die Angabe mit zwei Null-Zeichen ab:

const
  Filter = 'Textdateien (*.txt)'#0'*.txt'#0'Alle Dateien (*.*)'#0'*.*'#0#0;
{ ... }
ofn.lpstrFilter := Filter;

Benutzt ein Typ mehrere Dateiendungen, müssen diese durch ein Semikolon voneinander getrennt sein, beispielsweise:

const
  Filter = 'Pascal-Dateien (*.pas, *.dpr, *.inc)'#0'*.txt;*.dpr;*.inc'#0#0;


Und sofern wir nichts Besonders vorhaben, genügen die folgenden Flags vollkommen:

ofn.Flags       := OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES;

Bitte ziehen Sie auch die Hilfe oder das MSDN für die weiteren Möglichkeiten zu Rate. Und wenn Sie z.B. ein VCL-Programm auf API-Basis umschreiben wollen, dann ist es durchaus hilfreich, sich die Parameter der Dialog-Komponente anzusehen und mit den Erklärungen der Hilfe zu vergleichen.


Hinweis für Windows 2000 und XP

Die Syntaxdefinition zeigt bereits das erweiterte Record, das für Windows 2000 und XP genutzt werden kann. Wenn Ihre Delphi-Version aktuell genug ist, steht Ihnen dieses neue Record bereits zur Verfügung. Andernfalls ergänzen Sie bitte am Ende Ihres Records die drei neuen Membervariablen:

type
  tagOFNA = packed record
    { alte Recordvariablen }
pvReserved: pointer; dwReserved: dword; FlagsEx: dword; end;

Bei der Unicodeversion (tagOFNW) ist genau so zu verfahren. Die beiden Membervariable pvReserved und dwReserved sind bisher allerdings reserviert und müssen auf nil bzw. Null gesetzt werden. Lediglich die FlagsEx-Variable steht Ihnen zur Verfügung. Benutzen Sie hier das Flag OFN_EX_NOPLACESBAR zum Ausblenden der so genannten "Places bar" im Dialog:

ofn.FlagsEx := OFN_EX_NOPLACESBAR;

Wenn Sie mit dem neuen Record arbeiten, dann müssen Sie unter Windows 95, 98, ME und NT die alte Recordgröße initialisieren, da diese Systeme nichts mit den neuen Variablen anfangen können. Dazu dienen die folgenden Konstanten:

const
  {$EXTERNALSYM OPENFILENAME_SIZE_VERSION_400A}
  OPENFILENAME_SIZE_VERSION_400A = sizeof(TOpenFileNameA) -
    sizeof(pointer) - (2 * sizeof(dword));
  {$EXTERNALSYM OPENFILENAME_SIZE_VERSION_400W}
  OPENFILENAME_SIZE_VERSION_400W = sizeof(TOpenFileNameW) -
    sizeof(pointer) - (2 * sizeof(dword));
  {$EXTERNALSYM OPENFILENAME_SIZE_VERSION_400}
  OPENFILENAME_SIZE_VERSION_400  = OPENFILENAME_SIZE_VERSION_400A;

Der Aufruf könnte sich, betriebssystemabhängig, dann wie folgt gestalten:

if(Win2k) or (WinXP) then ofn.lStructSize := sizeof(TOpenFileName)
  else ofn.lStructSize := OPENFILENAME_SIZE_VERSION_400;


Hinweis

Diesem Tutorial liegt eine spezielle Unit bei ("CommDlg_Fragment.pas"), die das erweiterte Record und die neuen Konstanten enthält. Benutzen Sie diese Unit, wenn Ihre Delphi-Version die neuen Variablen nicht kennt.