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/125657-fileopendialog.html)

stefanmichel 9. Dez 2008 17:22


FileOpenDialog
 
Hallo,

habe hier schon gefunden, wie man den FileOpenDialog in der Detailansicht öffnet mit

Delphi-Quellcode:
 SendMessage(H, WM_COMMAND, $702C, 0);
Was muß ich noch angeben, damit in dem Dialogfeld die Dateien nach Änderungsdatum sortiert und mit der letzten Änderung ganz oben angezeigt werden (also dieselbe Wirkung, wie mit zweimal auf "geändert am" klicken) ?

Stefan

toms 14. Dez 2008 19:21

Re: FileOpenDialog
 
Hallo

Sortieren kannst du mit ListView_SortItems().

Bei mir geht's so (Win XP):

Delphi-Quellcode:
uses
  CommCtrl;

function SortFunc(Item1, Item2, Column: LPARAM):integer stdCall;
begin
  Result := 1; // -1 für absteigende Sortierung
end;

procedure TForm1.OpenDialog1FolderChange(Sender: TObject);
const
  FCIDM_SHVIEW_LARGEICON = $7029;
  FCIDM_SHVIEW_SMALLICON = $702A;
  FCIDM_SHVIEW_LIST = $702B;
  FCIDM_SHVIEW_REPORT = $702C;
  FCIDM_SHVIEW_THUMBNAIL = $702D;
  FCIDM_SHVIEW_TILE = $702E;
var
  NewStyle: DWORD;
  hCommonDialog, hParentWindow, hFileListView : HWND;
begin
  newStyle := FCIDM_SHVIEW_REPORT;

  hCommonDialog := (Sender as TCommonDialog).Handle;
  hParentWindow := FindWindowEx(GetParent(hCommonDialog),0, 'SHELLDLL_DefView',nil);
  if hParentWindow <> 0 then
  begin
    hFileListView := FindWindowEx(hParentWindow, 0, 'SysListView32', nil);
    if hFileListView <> 0 then
    begin
      SendMessage(hParentWindow, WM_COMMAND, NewStyle, 0);
      ListView_SortItems(hFileListView, SortFunc, 0);
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  OpenDialog1.Execute;
end;

stefanmichel 15. Dez 2008 10:22

Re: FileOpenDialog
 
Danke soweit,

jetzt erfolgt die Sortierung wie gewünscht absteigend, allerdings nach "Name" - welcher Parameter steuert die Sortierung nach "geändert am" ?

Stefan

ryLIX 15. Dez 2008 11:26

Re: FileOpenDialog
 
Zitat:

Zitat von stefanmichel
Danke soweit,

jetzt erfolgt die Sortierung wie gewünscht absteigend, allerdings nach "Name" - welcher Parameter steuert die Sortierung nach "geändert am" ?

Stefan

Dafür musst du wissen welche ItemID Änderungsdatum hat.
Also musst du dir mit
Code:
    int ListView_GetItemCount(

        HWND hwnd
    );
ListView_GetItemCount

Die Anzahl der Items holen.

Dann musst du halt in einer Schleife den jeweilligen Text des Items holen und checken ob es Änderungsdatum bzw Datum ist.

Wenn du Datum gefunden hast hast du auch die ItemID.

Diese musst du dann an SortFunc() übergeben als Item1.

So habe ich das ganze nun vertanden...

Macros von ListView falls du noch mehr Eigentschaften verändern möchtest.

Edit:
Versuch mal
Delphi-Quellcode:
function SortFunc(Item4, Item1, Column: LPARAM):integer stdCall;
begin
  Result := 1; // -1 für absteigende Sortierung
end;
;)

toms 15. Dez 2008 17:06

Re: FileOpenDialog
 
Zitat:

Zitat von stefanmichel
jetzt erfolgt die Sortierung wie gewünscht absteigend, allerdings nach "Name" - welcher Parameter steuert die Sortierung nach "geändert am" ?


Auf dieser Seite, ganz unten, findest du weitere Informationen (in C)

ryLIX 15. Dez 2008 17:22

Re: FileOpenDialog
 
Zitat:

Zitat von toms
Zitat:

Zitat von stefanmichel
jetzt erfolgt die Sortierung wie gewünscht absteigend, allerdings nach "Name" - welcher Parameter steuert die Sortierung nach "geändert am" ?


Auf dieser Seite, ganz unten, findest du weitere Informationen (in C)

Astrein :D da is die Funktion mal sauber Dokumentiert.
Warum findet man sowas nicht bei MS?
Oder such ich bei sowas an der falschen Stelle?

Eine Frage hätte ich noch dazu.
Item1 ist also das primäre Sortierungsargument Bsp: Änderungsdatum
Item2 ist dann das sekundäre Argument welches zum greift wenn es von Item1 mehrere mit dem gleichen Wert gibt.

Hab ich das so richtig Verstanden?

toms 15. Dez 2008 17:32

Re: FileOpenDialog
 
Item1, Item2 sind nur die zu vergleichenden Items, welche der Callback Funktion übergeben werden.
Auf die Subitems der einzelnen Items muss du dann wie im verlinkten Beispiel zugreifen.

Code:
lvitem1.iSubItem=1; // 0=filename 1=size 2=typename 3=datetime


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:50 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