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/)
-   -   Treeview nach zwei Kriterien sortieren (https://www.delphipraxis.net/63665-treeview-nach-zwei-kriterien-sortieren.html)

Luckie 21. Feb 2006 13:21


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:
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;
...funktioniert es leider nicht. Der Treeview ist irgendwie durcheinander.

Keldorn 21. Feb 2006 14:01

Re: Treeview nach zwei Kriterien sortieren
 
Hallo

für ein Listview nutze ich folgendes
Delphi-Quellcode:
...
  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;
bei dir fehlt mir die erste Sortierung, da du den showtype nicht vergleichst

Mfg Frank

xaromz 21. Feb 2006 14:04

Re: Treeview nach zwei Kriterien sortieren
 
Hallo,

hier mal meine Lösung (ich verwende einfach den ImageIndex statt Data):
Delphi-Quellcode:
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;
Gruß
xaromz

SirThornberry 21. Feb 2006 14:13

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:
//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;
Ich bin mal davon ausgegangend as "jsShowNone" bei dir für offline steht.

[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:
//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;
[/Edit]

sonic 21. Feb 2006 14:16

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;

Luckie 21. Feb 2006 14:26

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:
Treeview1.Compare;
...geht nicht.

Keldorn 21. Feb 2006 14:28

Re: Treeview nach zwei Kriterien sortieren
 
Delphi-Quellcode:
treeview.alphasort

Luckie 21. Feb 2006 14:44

Re: Treeview nach zwei Kriterien sortieren
 
:oops:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz