Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TStringList CustomSort (https://www.delphipraxis.net/55129-tstringlist-customsort.html)

Killer 17. Okt 2005 10:01


TStringList CustomSort
 
Hallo

Hab mal wieder ein kleines Problem und zwar:
Ich habe eine Stringlist, in der sind Benutzernamen von Usern in nem IRC Channel, die je nach Rang ein bestimmtes Zeichen vor dem Namen haben (~ für Owner, & für Protected Op, @ für Op, % für Halfop, + für Voice). Nun hab ich die Stringlist sortieren lassen mit Sort, allerdings sind nun die mit % ganz oben, was nicht ganz der Rangordnung entspricht. Wie kann ich denn das am besten sortieren lassen mit der CustomSort? Hat da jemand nen Lösungsvorschlag? Ich steh da voll im Wald momentan :roll:

Unplugged 17. Okt 2005 10:33

Re: TStringList CustomSort
 
schreibe dir doch zur Not eine eigene Sortierfunktion?

Alternativ könntest du auch nur die Namen in der Stringliste speichern. Wenn ich mich richtig erinnere, kannst du zusätzlich auch Objekte in einer Stringlist speichern, wo du dann unter anderem auch den Status speichern kannst.


Delphi-Quellcode:
type
  TStatus = class(TObject)
  private
    FRang: Byte
  public
    property Rang: Byte read FRang write FRang;
  end;

...

procedure CreateUser;
begin
  Users := TStringList.Create;
end;

procedure NewUser(Name: string; Rang: Byte)
var
  uState: TStatus;
begin
  uState := TStatus.Create;
  uState.Rang := Rang;
  Users.AddItem(Name, uState);
end;

procedure Sortieren;
begin
  Users.Sort;
end;
Ist nur nen symbolisches Beispiel, aber sollte in der Form machbar sein.

Killer 17. Okt 2005 10:36

Re: TStringList CustomSort
 
Du hast mich nicht richtig verstanden. Ich lese die Namen nur aus dem Channel aus, also ich muss keinen neuen User oder sowas anfügen. Die User sind mit Status in der Stringlist und sollen auch nach Status sortiert werden, deshalb sollen die Owner mit ~ ganz oben sein, dann die &, @, % und schlussendlich die mit + und vielleicht gibts auch noch welche ganz ohne Status, die sollen dann ganz unten sein. Also so wie in mIRC und anderen Clients...

marabu 17. Okt 2005 10:44

Re: TStringList CustomSort
 
Hi killer,

die StringList stellt dir eine Methode CustomSort() zur Verfügung, die verwendest du so:

Delphi-Quellcode:
const
  CRANKING = '+%@&~';

function CustomCompare(List: TStringList; Index1, Index2: Integer): Integer;
var
  s1, s2: string;
  r1, r2: char;
begin
  s1 := List[index1];
  s2 := List[index2];
  r1 := s1[1];
  r2 := s2[1];
  Delete(s1, 1, 1);
  Delete(s2, 1, 1);
  if Pos(r1, CRANKING) > Pos(r2, CRANKING) then Result := -1 else
  if Pos(r1, CRANKING) < Pos(r2, CRANKING) then Result := 1 else
  Result := AnsiCompareText(s1, s2);
end;

procedure TDemoForm.SortButtonClick(Sender: TObject);
begin
  UserList.CustomSort(CustomCompare);
  ListBox.Items.Assign(UserList);
end;
Grüße vom marabu

Killer 17. Okt 2005 10:57

Re: TStringList CustomSort
 
Danke werd ich gleich heute Abend mal ausprobieren! Danke :)

Unplugged 17. Okt 2005 12:06

Re: TStringList CustomSort
 
Zitat:

Zitat von Killer
Du hast mich nicht richtig verstanden. Ich lese die Namen nur aus dem Channel aus, also ich muss keinen neuen User oder sowas anfügen. Die User sind mit Status in der Stringlist und sollen auch nach Status sortiert werden, deshalb sollen die Owner mit ~ ganz oben sein, dann die &, @, % und schlussendlich die mit + und vielleicht gibts auch noch welche ganz ohne Status, die sollen dann ganz unten sein. Also so wie in mIRC und anderen Clients...

das hab ich schon richtig verstanden.
Das hält dich aber nicht davon ab, die Benutzer in deiner eigenen Liste zu verwalten.

Killer 17. Okt 2005 12:10

Re: TStringList CustomSort
 
Ja schon, nur finde ich ist es für diesen Fall etwas overkill, aber trotzdem Danke für dein Lösungsvorschlag. Das einzige was ich mit dieser Stringlist mache, ist diese in eine ListBox zu schreiben und da sollte sie natürlich sortiert sein, deshalb das ganze.


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