Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi VirtualTreeView: Sortierung (https://www.delphipraxis.net/99195-virtualtreeview-sortierung.html)

Nils_13 8. Sep 2007 11:28


VirtualTreeView: Sortierung
 
Hi,

ich habe in einem VirtualStringTree Ordner und Dateien aufgelistet. Welcher Weg ist der schnellste, um die Ordner und Dateien voneinander zu trennen ? Die Komponente kann eine ganze Menge und ich weiß nicht, welche Ereignisse man dafür nehmen könnte.

Gruber_Hans_12345 8. Sep 2007 12:00

Re: VirtualTreeView: Sortierung
 
kommt drauf an - könntest es einfach sortieren (dazu einfach das OnCompareNode Event verwenden)

OG Karotte 8. Sep 2007 12:07

Re: VirtualTreeView: Sortierung
 
Hallo Nils,

erst einmal musst Du das Ereignis OnCompareNodes benutzen, denn jedes mal wenn das VST sortiert werden soll, wird diese Routine aufgerufen.

In OnCompareNodes vergleichst DU dann die Knoten (in Deinem Fall wohl Ordner oder Datei) und gibst das Resultat über die Prozedurvariable "RESULT" zurück. Anhand dessen setzt VT dann den Eintrag an die passende Stelle.

D.h. Du bestimmst für JEDEN Eintrag (denn diese Routine wird für jeden Knoten aufgerufen) aufgrund welcher Kriterien der Knoten an welche Stelle rutscht.

In der Hilfe ist auch ein Beispiel unter "OnCompareNodes" zu finden.

semo 8. Sep 2007 12:16

Re: VirtualTreeView: Sortierung
 
schau dir einmal die demos an die mitgeliefert werden.
wenn nicht: die stehen auch extra zum download.

da sind schöne beispiele enthalten.

Nils_13 8. Sep 2007 12:25

Re: VirtualTreeView: Sortierung
 
Ich habe es mal probiert, aber es wird nichts sortiert. Warum ?
Delphi-Quellcode:
procedure TfrmMain.VSTCompareNodes(Sender: TBaseVirtualTree; Node1,
  Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer);
var Data1, Data2 : PTreeData;
    b1, b2       : Boolean;
begin
  Data1 := Sender.GetNodeData(Node1);
  Data2 := Sender.GetNodeData(Node2);
  if Data1.fTyp = (ftDir) then
    b1 := True
  else
    b1 := False;
  if Data2.fTyp = (ftDir) then
    b2 := True
  else
    b2 := False;
  if b1  <> b2 then
  begin
    if b1 then
      Result := -1
    else
      Result := 1;
  end else
    Result := CompareText(Data1.fPfad, Data2.fPfad); // fPfad ist wenn nichts schief läuft, der komplette Pfad+Dateiname+Dateiendung
end;
In den Demos habe ich bis jetzt noch nichts gefunden, was sich damit auseinandersetzt.

DeddyH 8. Sep 2007 12:57

Re: VirtualTreeView: Sortierung
 
Ruf mal
Delphi-Quellcode:
VST.Sort;
auf.

Hawkeye219 8. Sep 2007 12:59

Re: VirtualTreeView: Sortierung
 
Hallo Nils,

du mußt entweder das Flag toAutoSort in der Eigenschaft TreeOptions.AutoOptions des Baums setzen oder - wie DeddyH geschrieben hat - das Sortieren manuell durch einen Aufruf der Methode Sort bzw. SortTree auslösen.

Auf die booleschen Variablen kannst du übrigens verzichten:

Delphi-Quellcode:
procedure TfrmMain.VSTCompareNodes(Sender: TBaseVirtualTree; Node1,
  Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer);
var
  Data1 : PNodeData;
  Data2 : PNodeData;
begin
  Data1 := Sender.GetNodeData(Node1);
  Data2 := Sender.GetNodeData(Node2);
  if (Data1.fTyp = Data2.fTyp)
    then Result := CompareText(Data1.fPfad, Data2.fPfad)
    else Result := Ord(Data2.fTyp = ftDir) - Ord(Data1.fTyp = ftDir);
end;
Gruß Hawkeye

Nils_13 8. Sep 2007 13:42

Re: VirtualTreeView: Sortierung
 
Es funktioniert, danke :)


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