Delphi-PRAXiS

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)

Peter Berlin 27. Jun 2007 21:29


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

Muetze1 27. Jun 2007 21:52

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;

Peter Berlin 27. Jun 2007 22:00

Re: FileOpendialog
 
vielen Dank es funktioniert super.
gibt es noch andere werte als $702C und wo kann ich die Bedeutung finden

Muetze1 27. Jun 2007 22:25

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: OpenDialog List View Mode

Luckie 27. Jun 2007 22:30

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:

LV_VIEW_DETAILS
LV_VIEW_ICON
LV_VIEW_LIST
LV_VIEW_SMALLICON
LV_VIEW_TILE

Muetze1 27. Jun 2007 22:34

Re: FileOpendialog
 
Zitat:

Zitat von Luckie
Hm, warum nicht einfach im PSDK gucken

Weil es nichts bringt: LV_VIEW_DETAILS ist mit 0x0001 definiert und bringt keine Wirkung. Die o.g. Codes werde nicht mit einer LVM_SETVIEW Message versendet sondern mit einer WM_COMMAND und von daher helfen die Konstanten noch nicht so richtig. Wahrscheinlich sind sie nur die unteren Bits, aber der Rest?

/EDIT: Es sind nicht die unteren Bits, die stimmen nicht überein.

Luckie 27. Jun 2007 23:04

Re: FileOpendialog
 
Zitat:

Zitat von Muetze1
Weil es nichts bringt: LV_VIEW_DETAILS ist mit 0x0001 definiert und bringt keine Wirkung. Die o.g. Codes werde nicht mit einer LVM_SETVIEW Message versendet sondern mit einer WM_COMMAND und von daher helfen die Konstanten noch nicht so richtig. Wahrscheinlich sind sie nur die unteren Bits, aber der Rest?

Das ist aber irgendwie seltsam.

achi 3.0 7. Nov 2008 07:51

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

himitsu 8. Nov 2008 16:07

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.

Hansa 24. Sep 2009 18:22

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:

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 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