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;