AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Treeview nach zwei Kriterien sortieren

Ein Thema von Luckie · begonnen am 21. Feb 2006 · letzter Beitrag vom 21. Feb 2006
Antwort Antwort
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Treeview nach zwei Kriterien sortieren

  Alt 21. Feb 2006, 14:21
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?

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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

Re: Treeview nach zwei Kriterien sortieren

  Alt 21. Feb 2006, 15:01
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

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#3

Re: Treeview nach zwei Kriterien sortieren

  Alt 21. Feb 2006, 15:04
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
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Treeview nach zwei Kriterien sortieren

  Alt 21. Feb 2006, 15:13
@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]
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
sonic

Registriert seit: 14. Mär 2003
30 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Treeview nach zwei Kriterien sortieren

  Alt 21. Feb 2006, 15:16
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;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Treeview nach zwei Kriterien sortieren

  Alt 21. Feb 2006, 15:26
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.
Treeview1.Compare; ...geht nicht.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

Re: Treeview nach zwei Kriterien sortieren

  Alt 21. Feb 2006, 15:28
treeview.alphasort

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Treeview nach zwei Kriterien sortieren

  Alt 21. Feb 2006, 15:44
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:52 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