![]() |
Liste von Records sortieren
Gegeben sei eine Liste von Records:
Delphi-Quellcode:
Diese Liste hat maximal 8 Einträge und soll nach 'position' sortiert werden. Das sollte eigentlich kein Problem sein. Aber ich kriege den Aufruf von TList.Sort bzw. ComparePosition um's Verrecken nicht hin! Oder geht das irgendwie ganz anders?
Type
TMyRecord = Record order : Integer; position : Integer; key : ansistring; end; TMyRecordList = TList<TMyRecord>; function ComparePosition(Item1, Item2: Pointer): Integer; begin ???? end; procedure TForm1.Button1Click(Sender: TObject); begin MyRecordList.Sort(@ComparePosition); end; Ich brauche dringend einen Denkanstoß! Gruß LP |
AW: Liste von Records sortieren
Jupp, sort sorttiert "binär",
aber willst du nach "logischem" Inhalt eines/mehrerer Felder des Records sortieren, dann brauchst du einen Comparer, welcher als Parameter an Sort übergeben wird. Zitat:
Wollte grade sagen, dass du besser die generische TList<> verwenden solltest, aber tutst du ja schon. Dann schau dir mal an, wie der Sort-Parameter definiert ist. * ein Interface (IComparer) * also nun eine Funktion suchen, welche ein IComarer zurückgibt und am Besten eine "Funktion" rein nimmt * oder selber eine Klasse schreiben, welche IComarer implementiert * oder eben nach einer fertigen Klasse für das Interface suchen, welche es implementiert (TComparer) * dafür mußt du dir also eine Instanz erstellen (irgendwas mit "Construct") ... schau einfach mal in die Generics-Units. [add] Auf die Schnelle mal etwas für ein TArray<> gefunden, aber ist prinzipiell gleich.
Delphi-Quellcode:
TArray.Sort<TComponent>(FFormDataSources, TComparer<TComponent>.Construct(function(const Left, Right: TComponent): Integer
begin Result := CompareStr(Left.Name, Right.Name); //Nach Komponentname sortieren end)); |
AW: Liste von Records sortieren
Zitat:
Delphi-Quellcode:
MyRecordArray : TArray<TMyRecord>;
TArray.Sort<TMyRecord>(MyRecordArray, TComparer<TMyRecord>.Construct( function(const Left, Right : TMyRecord) : Integer begin Result := TComparer<Integer>.Default.Compare(Left.position, Right.position); end)); |
AW: Liste von Records sortieren
|
AW: Liste von Records sortieren
Wenn der benötigte Platz im AnsiString nicht so groß ist, dann würde sogar schlicht das Ändern auf ShortString reichen.
|
AW: Liste von Records sortieren
Zitat:
Zitat:
|
AW: Liste von Records sortieren
Ach stimmt, und dann auch noch das Längenbyte! Danke für die Klärung.
|
AW: Liste von Records sortieren
Ein statisches #0-terminiertes Char-Array. (der Rest muß auch mit #0 gefüllt sein, wenn nachfolgend noch weitere Felder kommen)
Aber so schwer ist das mit dem Comparer nicht unbedingt. |
AW: Liste von Records sortieren
Zitat:
Nach langem Suchen und vielen Versuchen funktioniert's nun so:
Delphi-Quellcode:
Danke an alle für die 'Denkanstöße'.MyRecordList.Sort(IComparer<TMyRecord>( function(const L, R: TMyRecord): Integer begin Result := CompareValue(L.position, R.position); end)); Gruß LP |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:22 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