![]() |
FileOpendialog
Hallo,
weiss jemand, wie man den Opendialog sofort im der Ansicht Details starten kann?? und dann natürlich auch gleich in Datums-sortierter Ansicht? Ich hab schon überall gesucht, aber nichts gefunden |
Re: FileOpendialog
Hier der Code für die Detailansicht:
Delphi-Quellcode:
procedure TForm1.OpenDialog1FolderChange(Sender: TObject);
var H, H2: THandle; begin H := FindWindowEx(GetParent(OpenDialog1.Handle), 0, PChar('SHELLDLL_DefView'), nil); H2 := FindWindowEx(H, 0, PChar('SysListView32'), nil); if (H <> 0) and (H2 <> 0) then begin SendMessage(H, WM_COMMAND, $702C, 0); Windows.SetFocus(H2); end; end; |
Re: FileOpendialog
vielen Dank es funktioniert super.
gibt es noch andere werte als $702C und wo kann ich die Bedeutung finden |
Re: FileOpendialog
Folgende sind mir bekannt:
Windows XP: $702A - Symbole $702B - Liste $702C (ODM_VIEW_DETAIL) - Details $702D - Miniaturansicht $702E - Kacheln Windows 98: $7029 - grosse Symbole $702A - kleine Smbole $702B - Liste $702C (ODM_VIEW_DETAIL) - Details Die Deklaration bzw. Zusammensetzung des Wertes aus entsprechenden Konstanten würde mich auch freuen. /EDIT: Hier noch ein wenig was dazu: ![]() |
Re: FileOpendialog
Hm, warum nicht einfach im PSDK gucken: ms-help://MS.MSSDK.1033/MS.WinSDK.1033/shellcc/platform/commctls/listview/messages/lvm_setview.htm
Zitat:
|
Re: FileOpendialog
Zitat:
/EDIT: Es sind nicht die unteren Bits, die stimmen nicht überein. |
Re: FileOpendialog
Zitat:
|
Re: FileOpendialog
Hallo,
habe das gleiche problem gehabt und konnte es durch diesen beitrag lösen. da mein program mit touchscreen genutzt wird müsste ich die buttons und die scrolleiste auf dem opendialog auch größer machen. geht das ? danke |
Re: FileOpendialog
Die Größe der Scroll-Leiste läßt sich über die Systemeigenschaften ändern.
z.B. > Systemseuerung > Anzeige (oder Desktop > Eigenschaften) > Darstellung > [Erweitert] > Element: Bildlaufleiste (oder auf die Scrollbar klicken) > und dann nur noch die Größe einstellen für die Buttons: - entweder das Fenster zoomen - ähnlich wie beim Anzeigemodus auswählen die Button suchen und neue Größe zuweisen - oder die passende Resource ändern (dieses Fesnter liegt vordefiniert in einer der Windowseigenen DLLs und ließe sich demnach "leicht" verändern) Für Zweiteres könnte ich auch die Dialog-Element-IDs bereitstellen. Wo man dieses dann in TOpenDialog einbinden muß, weiß ich jetzt allerings nicht ... für die direkte WinAPI-Nutzung (bzw. 'ne Non-VCL-Variante) würde sich der Explorer-Hook (Window-Create-Ereignis) anbieten. |
Re: FileOpendialog
Hi,
der Quelltext von Mütze geht soweit. Da er nicht kommentiert ist und ich dementsprechend wenig verstehe, was der da macht, folgende Frage : wenn ich den File-OpenDialog exekutiere :mrgreen: dann soll einfach nur eine Liste der Dateien erscheinen. Also quasi normal. Wird nun ein Unterverzeichnis aufgemacht, dann sollen die darin befindlichen Dateien allerdings in Miniaturansicht erscheinen. Wo setze ich denn da an ? Aus der WinAPI-Beschreibung werde ich nicht recht schlau. :shock: |
Re: FileOpendialog
Zitat:
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; |
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: |
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 ? |
Re: FileOpendialog
Hallo,
ich glaube den Schlüssel gefunden zu haben. \Software\Microsoft\Windows\ShellNoRoam\Bags\326\S hell Mode
Delphi-Quellcode:
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 ???
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; 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 17:22 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