Thema: Delphi FileOpendialog

Einzelnen Beitrag anzeigen

Muetze1
(Gast)

n/a Beiträge
 
#11

Re: FileOpendialog

  Alt 24. Sep 2009, 19:43
Zitat von Hansa:
..., was der da macht, ...
Grundlegend Copy&Paste. Denn wie heisst es immer so schön? Nicht wissen sondern wissen wo was steht :wink:

Aber hier mal kommentiert:
Delphi-Quellcode:
procedure TForm1.OpenDialog1FolderChange(Sender: TObject);
var
  H, H2: THandle;
begin
    // Der OpenDialog macht ein Sub-Classing auf den Shell Open Dialog. Um nun den Shell Dialog
    // zu erhalten muss man sich den Parent des OpenDialog.Handle holen. In diesem suchen wir dann
    // ein Element der Klasse "SHELLDLL_DefView" was der Dateilistenbereich des Shell Dialoges ist.
  H := FindWindowEx(GetParent(OpenDialog1.Handle), 0, PChar('SHELLDLL_DefView'), nil);

    // Dann suchen wir innerhalb dieses Dateilistenbereiches nach einem Element der Klasse "SysListView32",
    // da ein ListView Element die Dateiliste bereitstellt.
  H2 := FindWindowEx(H, 0, PChar('SysListView32'), nil);

    // wenn wir beide Fenster gefunden haben, dann...
  if (H <> 0) and (H2 <> 0) then
  begin
      // senden wir dem ListView eine Botschaft vom Typ WM_COMMAND. Diese ist eigentlich eine Botschaft
      // welche Windows Elementen schickt bei Standardaktionen oder auch Elemente sich selbst bei Handlung
      // auf sogenannten Aktionselementen. Der Opendialog kann ein Popup öffnen wo der Nutzer die Ansichten
      // umstellen kann. Jeder dieser Einträge in dem Popup hat eine eigene WM_COMMAND ID welches dieses dann
      // an das ListView sendet. Der dahinter im Shell Dialog hinterlegte Handler erkennt anhand der ID
      // welche Ansicht ausgewählt wurde. Was für IDs vorhanden sind wurde in den folgenden Beiträgen
      // aufgeführt.
    SendMessage(H, WM_COMMAND, $702C, 0);

      // Und zuletzt wird der Fokus (das aktuell ausgewählte Aktionselement im Shell Open Dialog) auf die
      // ListView gesetzt. Dies hat nur einen kosmetischen Effekt, damit der Nutzer z.B. direkt mit dem
      // eintippen eines Namens loslegen kann und das ListView ihn dann sofort dahingeleitet. Da dies ein
      // Ereignishandler von TForm ist gibt es hier einen Namenskonflikt mit der Methode SetFocus, welche
      // hier sogar als Member eine höhere Priorität hat als die klassenlose Funktion SetFocus der Windows
      // Unit. Von daher wird hier mit "Windows." der Scope eindeutig auf die Windows Funktion gelegt.
    Windows.SetFocus(H2);
  end;
end;
  Mit Zitat antworten Zitat