AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

FileOpendialog

Ein Thema von Peter Berlin · begonnen am 27. Jun 2007 · letzter Beitrag vom 8. Mär 2010
 
Muetze1
(Gast)

n/a Beiträge
 
#11

Re: FileOpendialog

  Alt 24. Sep 2009, 18: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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:29 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz