Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi FileOpendialog (https://www.delphipraxis.net/94905-fileopendialog.html)

Muetze1 24. Sep 2009 18:43

Re: FileOpendialog
 
Zitat:

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;

Hansa 27. Sep 2009 19:35

Re: FileOpendialog
 
Thx Muetze,

dank den Kommentaren ist jetzt klar, was da genau los ist. :stupid: Das aus #10 angesprochene muss ich aber wohl näher erläutern : es geht darum, dieses Ansichts-Verhalten gezielt zu steuern und, ob das überhaupt geht. In Windows selbst gehts anscheinend nämlich nicht ohne weiteres. Bei mir stellt sich der Opendialog normalerweise im Detail-Stil dar. Zur Zeit jedenfalls. Gehe ich da in ein Unterverzeichnis und ändere die Ansicht in "Miniaturansicht" und dann wieder eine Ebene höher, dann gilt die Miniaturansicht auch da. Das Problem ist jetzt eben folgendes : kann die Miniaturansicht vom Programm aus für ein bestimmtes Unterverzeichnis eingestellt/geändert werden ? :shock:

waldforest 7. Mär 2010 15:44

Re: FileOpendialog
 
Hallo,
die bisher beschriebene Umstellung des Opendialogs funktioniert einwand frei.

Nun würde ich gerne die Darstellung wählen, welche der User selber im Explorer unter extras, Ordneroption, Ansicht festgelegt hat.


Ich würde gerne diesen Wert übernehmen, damit mein Opendialog in der vom User festgelegten Darstellung geöffnet wird.
Wo wird diese Festlegung hingeschrieben ?
Wie kann ich diese auslesen ?

waldforest 8. Mär 2010 06:01

Re: FileOpendialog
 
Hallo,
ich glaube den Schlüssel gefunden zu haben.
\Software\Microsoft\Windows\ShellNoRoam\Bags\326\S hell
Mode

Delphi-Quellcode:
Procedure TForm1.Button1Click(Sender: TObject);
var mode :integer ;
begin
with TRegistry.Create do begin
    RootKey := HKEY_CURRENT_USER;
    Access := KEY_READ;
    if OpenKey('\Software\Microsoft\Windows\ShellNoRoam\Bags\2\Shell', False) then
// achtung Wert 2 ändert sich
    begin
      mode := readinteger('Mode');
      case mode of
      1: Showmessage('Symbole');
      3: Showmessage('Liste');
      4: Showmessage('Details');
      6: Showmessage('Kacheln');
      else
        Showmessage('Miniaturansicht/unbestimmt');
      end;
     end
    else
          ShowMessage('Ooops...')
  end;
end;
Allerdings habe ich festegstellt, dass der Wert 2 bei \Bags\2 ändert und die letzte Ordnernummer annimmt, aus der als Basis für die Aneige genommen wurde. Gint´s ne andere Möglichkeit ???

Hierzu habe ich ergänzend folgende Infos im Netz gefunden.
Configure the default Folder Type template for all users
If having dynamic / roaming users and want and want to configure the default Folder view for all users through the registry:
[HKEY_LOCAL_MACHINE \Software \Microsoft \Windows \ShellNoRoam \Bags \AllFolders \Shell]
WFlags = 0
Mode = 4
vid = "{137E7700-3573-11CF-AE69-08002B2E1262}"


Note the following table can be used to configure the above values (WFlags should always be 0)
View Mode vid
Icons 1 {0057D0E0-3573-11CF-AE69-08002B2E1262}
List 3 {0E1FA5E0-3573-11CF-AE69-08002B2E1262}
Details 4 {137E7700-3573-11CF-AE69-08002B2E1262}
Thumbnail 5 {8BEBB290-52D0-11D0-B7F4-00C04FD706EC}
Tiles 6 {65F125E5-7BE1-4810-BA9D-D271C8432CE3}
Filmstrip 7 {8EEFA624-D1E9-445B-94B7-74FBCE2EA11A}


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:27 Uhr.
Seite 2 von 2     12   

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