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 Sortieren im VirtualStringTree (https://www.delphipraxis.net/70418-sortieren-im-virtualstringtree.html)

colder 30. Mai 2006 01:31


Sortieren im VirtualStringTree
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo,

soweit hat es ja ganz ordentlich funktioniert. Das erstellen
von Items, Folder und Root klappt. Auch das löschen der Items
funktioniert tadellos. Nur das sortieren der Items funktioniert
nicht.

Eigentlich möchte ich nur das Ordner unter Ordner stehen und darunter
dann die normalen Items. Wie ich es gerne hätte ist auf den 2 Bildern
zu sehen. Also erst einmal nach Typen sortieren. Danach wäre eine
Sortierung nach Namen wünschenswert aber nicht zwingend.

Ich habe mir das schon einmal mit dem CompareNodes angeschaut,
komme aber nicht klar.

So definiere ich meine Items:

Delphi-Quellcode:
type
  TItemType = (itRoot, itFolder, itItem);

type
  PCodeData = ^TCodeData;
  TCodeData = record
    Caption: string;
    Text: string[255];
    ItemType: TItemType;
    OpenIndex: Integer;
    CloseIndex: Integer;
  end;
Ich muß wohl irgendwie erst nach dem ItemType sortieren und dann nach dem Caption.
Kann mir bitte hier jemand einen Tipp geben?!

gruss Andreas

edmu 30. Mai 2006 06:16

Re: Sortieren im VirtualStringTree
 
Liste der Anhänge anzeigen (Anzahl: 1)
hallo,
die komponente hat eine funktion "vst.SortTree".

im anhang findest du eine pdf-datei mit nützlichen beispielen.

siehe auch:
Delphi-Source Tutorials

colder 30. Mai 2006 09:34

Re: Sortieren im VirtualStringTree
 
Hallo,

erst einmal danke für die Info. Werde mich heute mal mit dem
Thema beschäftigen.

gruss.

jbg 30. Mai 2006 12:38

Re: Sortieren im VirtualStringTree
 
Zitat:

Zitat von colder
PCodeData = ^TCodeData;
TCodeData = record
Caption: string;
Text: string[255];
ItemType: TItemType;
OpenIndex: Integer;
CloseIndex: Integer;
end;
[/delphi]

Da du hier einen AnsiString benutzt, rufst du hoffentlich im OnFreeNode auch das Finalize("Data") auf. Wenn nicht, dann sammelst dui nämlich String-Speicherlecks.

aschne1 30. Mai 2006 13:19

Re: Sortieren im VirtualStringTree
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi

Schau Dir einmal beil. Demo an, ich habe es für ein früheres Posting erstellt.
Es handelt sich nur um ein Demo und ist sicher kein "schöner Code", doch die Sort-Funktion funzt einwandfrei.

Ich hoffe, das hilft weiter.

Gruss

colder 31. Mai 2006 14:29

Re: Sortieren im VirtualStringTree
 
Hallo,

erst einmal danke für die Tipps. Habe eine Lösung für mein Problem
gefunden. Hier der Code:

Delphi-Quellcode:

type
  TItemType = (itRoot, itFolder, itItem);

type
  PCodeData = ^TCodeData;
  TCodeData = record
    Caption: string;
    Text: string;
    ItemType: TItemType;
    OpenIndex: Integer;
    CloseIndex: Integer;
  end;

...

//------------------------------------------------------------------------------
// Procedure  : tvCodeCompareNodes
//------------------------------------------------------------------------------
procedure TCodeForm.tvCodeCompareNodes(Sender: TBaseVirtualTree; Node1,
  Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer);
var
  Data1: PCodeData;
  Data2: PCodeData;
begin

  Data1 := tvCode.GetNodeData(Node1);
  Data2 := tvCode.GetNodeData(Node2);

  if (not Assigned(Data1)) or (not Assigned(Data2)) then
    Result := 0;

  if (Data1.ItemType = itFolder) and (Data2.ItemType = itFolder) then
    Result := CompareText(Data1.Caption, Data2.Caption);

  if (Data1.ItemType = itItem) and (Data2.ItemType = itItem) then
    Result := CompareText(Data1.Caption, Data2.Caption);

  if (Data1.ItemType = itFolder) and (Data2.ItemType = itItem) then
    Result := -1;

  if (Data1.ItemType = itItem) and (Data2.ItemType = itFolder) then
    Result := 1;

end;
gruss Andreas

Dale 31. Mai 2006 14:42

Re: Sortieren im VirtualStringTree
 
Hallo Andreas,

die Prozedur könnte zu einer AV führen, falls deine Knotendaten nicht existieren.

Also:

Zitat:

Zitat von colder

Delphi-Quellcode:

type
  TItemType = (itRoot, itFolder, itItem);

type
  PCodeData = ^TCodeData;
  TCodeData = record
    Caption: string;
    Text: string;
    ItemType: TItemType;
    OpenIndex: Integer;
    CloseIndex: Integer;
  end;

...

//------------------------------------------------------------------------------
// Procedure  : tvCodeCompareNodes
//------------------------------------------------------------------------------
procedure TCodeForm.tvCodeCompareNodes(Sender: TBaseVirtualTree; Node1,
  Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer);
var
  Data1: PCodeData;
  Data2: PCodeData;
begin

  Data1 := tvCode.GetNodeData(Node1);
  Data2 := tvCode.GetNodeData(Node2);

  if (not Assigned(Data1)) or (not Assigned(Data2)) then
    BEGIN               // 
      Result := 0;
      Exit;             // hier solltest du dann auch die Prozedur verlassen
    END;                // sonst bekommst du anschließend eine AV

 
  if (Data1.ItemType = itFolder) and (Data2.ItemType = itFolder) then
    Result := CompareText(Data1.Caption, Data2.Caption);

  if (Data1.ItemType = itItem) and (Data2.ItemType = itItem) then
    Result := CompareText(Data1.Caption, Data2.Caption);

  if (Data1.ItemType = itFolder) and (Data2.ItemType = itItem) then
    Result := -1;

  if (Data1.ItemType = itItem) and (Data2.ItemType = itFolder) then
    Result := 1;

end;
gruss Andreas



Alle Zeitangaben in WEZ +1. Es ist jetzt 15: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 by Thomas Breitkreuz