![]() |
Treeview nach zwei Kriterien sortieren
Ich habe einen Treeview mit Chat benutzern. Diesen will ich nun sortieren: Erst die onlone Benutzer alphabetisch und dann die offline Benutzer alphabetisch. Ich habe also zwei Kriterien. Nach eine zu sortieren ist kein problem, aber nach beiden? :gruebel:
So...
Delphi-Quellcode:
...funktioniert es leider nicht. Der Treeview ist irgendwie durcheinander.
procedure TForm1.TreeView1Compare(Sender: TObject; Node1, Node2: TTreeNode;
Data: Integer; var Compare: Integer); var ShowType1, ShowType2: JabberShowType; begin if (Assigned(Node1.Data)) and (Assigned(Node2.Data)) then begin ShowType1 := PUser(Node1.Data)^.ShowType; ShowType2 := PUser(Node2.Data)^.ShowType; if (ShowType1 = jshowNone) and (AnsiCompareStr(Node1.Text, Node2.Text) < 0) then Compare := -1 else Compare := 1; end; end; |
Re: Treeview nach zwei Kriterien sortieren
Hallo
für ein Listview nutze ich folgendes
Delphi-Quellcode:
bei dir fehlt mir die erste Sortierung, da du den showtype nicht vergleichst
...
Compare := CompareText(Item1.SubItems[Sortierspalte],Item2.SubItems[Sortierspalte]); //wenn gleich, dann noch nach 2. spalte sortieren sortieren if (compare = 0) and (Sortierspalte2>0) then Compare := CompareText(Item1.SubItems[Sortierspalte2],Item2.SubItems[Sortierspalte2]); //auf und absteigend sortieren compare:=compare*Sortierordnung; Mfg Frank |
Re: Treeview nach zwei Kriterien sortieren
Hallo,
hier mal meine Lösung (ich verwende einfach den ImageIndex statt Data):
Delphi-Quellcode:
Gruß
procedure TForm1.TreeView1Compare(Sender: TObject; Node1, Node2: TTreeNode;
Data: Integer; var Compare: Integer); begin Compare := Integer(Node1.ImageIndex) - Integer(Node2.ImageIndex); if Compare = 0 then Compare := AnsiCompareStr(Node1.Text, Node2.Text); end; xaromz |
Re: Treeview nach zwei Kriterien sortieren
@lucky: Du musst zuerst prüfen ob die beiden nutzer den gleichen showtype haben. Ist dem nicht so dann ist das item kleiner welches offline ist. Wenn die Showtypes gleich sind musst du alphabetich vergleichen.
dein jetziger source stimmt also zur hälfte. Du musst also im Else-Fall noch vergleichen welcher offline ist:
Delphi-Quellcode:
Ich bin mal davon ausgegangend as "jsShowNone" bei dir für offline steht.
//If Stimmt, denn beide sind vom gleichen ShowType, somit macht alphabetic sinn
if (ShowType1 = jshowNone) and (AnsiCompareStr(Node1.Text, Node2.Text) < 0) then Compare := -1 else if (ShowType1 = jsshowNone) then Compare := -1 else Compare := 1; [Edit] Ach nein, ich seh grad das der if-zweig auch nicht ganz stimmt (zumindest nicht mit meinem ansatz). So wie es xaromz gemacht hat ist es eigentlich am besten.
Delphi-Quellcode:
[/Edit]
//If Stimmt, denn beide sind vom gleichen ShowType, somit macht alphabetic sinn
if (ShowType1 = ShowType2) then Compare := AnsiCompareStr(Node1.Text, Node2.Text) else if (ShowType1 = jsshowNone) then Compare := -1 else Compare := 1; |
Re: Treeview nach zwei Kriterien sortieren
Hallo!
Meine Lösung (eh im Prinzip dasselbe). Vielleich noch ein Hinweis das CompareStr ist Case-Sensitiv, sortiert also groß und kleinbuchstaben ausainander sprich A-Z zuerst, dann kommen erst a-z... CompareText macht das nicht. Kommt drauf an was du möchtest.
Delphi-Quellcode:
procedure TForm1.TreeView1Compare(Sender: TObject; Node1, Node2: TTreeNode;
Data: Integer; var Compare: Integer); begin Compare := 0; // Kriterium eins if (Node1.Text[1] = 'X') and (Node2.Text[1] <> 'X') then Compare := -1 else if (Node2.Text[1] = 'X') and (Node1.Text[1] <> 'X') then Compare := 1; // Kriterium zwei, wenn Compare noch 0 if Compare = 0 then begin if CompareText(Node1.Text, Node2.Text) < 0 then Compare := -1 else if CompareText(Node1.Text, Node2.Text) > 0 then Compare := 1; end; // Kriterium drei, wenn Compare noch 0 if Compare = 0 then begin //usw... end; end; |
Re: Treeview nach zwei Kriterien sortieren
Danke, danke, danke. Es reicht. ;) Es funktioniert.
Nur noch eine Kleinigkeit, wie kann ich die Sortierung manuell auslösen? Also wenn sich ein Status ändert, ändere ich den Knoten und fülle den Treeview nicht wieder komplett neu.
Delphi-Quellcode:
...geht nicht.
Treeview1.Compare;
|
Re: Treeview nach zwei Kriterien sortieren
Delphi-Quellcode:
treeview.alphasort
|
Re: Treeview nach zwei Kriterien sortieren
:oops:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:14 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