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 wird nicht angesprochen? (https://www.delphipraxis.net/208436-tstringlist-customsort-wird-nicht-angesprochen.html)

Schucki 28. Jul 2021 19:32

Delphi-Version: 2010

TStringList.CustomSort wird nicht angesprochen?
 
Hallo,

ich versuche eine TStringList mit einer eigenen Sortierung zu verarbeiten, leider wird die Function nicht angesprungen. Was hab ich vergessen?
Auf...
Delphi-Quellcode:
   ...
   ShowMessage('Sortiere...');
   ---
...ist ein Breakepoint, der nicht auslöst.

Gruß Frank

Delphi-Quellcode:
function ResultCustomCompare(List: TStringList; Index1, Index2: Integer): Integer;
var
  s1, s2: string;

begin
  ShowMessage('Sortiere...');
  s1 := GetStrFromColumn(3, List[index1]) + GetStrFromColumn(4, List[index1]);
  s2 := GetStrFromColumn(3, List[index2]) + GetStrFromColumn(4, List[index2]);
  if s1 < s2 then
    Result := -1
  else
  if s1 > s2 then Result := 1
  else
    Result := 0;
end;


procedure TfrmMain.LogClick(Sender: TObject);
var strlResult: TStringList;

begin
    strlResult := TStringList.Create;
try
    strlResult.CustomSort(ResultCustomCompare);
    strlResult.Sorted := True;
    strlResult.LoadFromFile('data.txt');
    ShowMessa(strlResult.Text);
finally
    strlResult.Free;
end;
end;

Sailor 28. Jul 2021 19:56

AW: TStringList.CustomSort wird nicht angesprochen?
 
// Calling Sort won't sort the list because CustomSort will
// only sort the list if it's not already sorted

Setze Sorted nach dem TStringList.Create auf False?

Schucki 28. Jul 2021 20:07

AW: TStringList.CustomSort wird nicht angesprochen?
 
Danke aber leider keinen Effekt...

Delphi.Narium 28. Jul 2021 20:21

AW: TStringList.CustomSort wird nicht angesprochen?
 
Delphi-Quellcode:
procedure TfrmMain.LogClick(Sender: TObject);
var strlResult: TStringList;

begin
    strlResult := TStringList.Create;
try
    strlResult.Sorted := false;
    // Erst die Datei laden
    strlResult.LoadFromFile('data.txt');
    // dann sortieren.
    strlResult.CustomSort(ResultCustomCompare);
    ShowMessa(strlResult.Text);
finally
    strlResult.Free;
end;
end;

Schucki 28. Jul 2021 21:04

AW: TStringList.CustomSort wird nicht angesprochen?
 
DANKE - So geht's! :shock:

himitsu 28. Jul 2021 21:57

AW: TStringList.CustomSort wird nicht angesprochen?
 
Sorted immer auf False belassen. (Sortet braucht also garnicht benutzt/zugewiesen zu werden)

Sort und CustomSort sortieren "jetzt" und nur jetzt, bei diesem Aufruf.
Das Sorted:=True anschließend nutzt die hauseigene Sort-Methode und "überschreibt" somit das was CustomSort gemacht hatte.


Man könnte aber auch das
Delphi-Quellcode:
function CompareStrings(const S1, S2: string): Integer; override;
überchreiben und somit die "Standard"-Sortierung ändern, wenn man Sorted=True nutzen will, sowie diese Sortierung auch für Find und IndexOf.

Schucki 29. Jul 2021 18:00

AW: TStringList.CustomSort wird nicht angesprochen?
 
Danke Euch für die Erklärung!
Das bedeutet das die CustemSort Funktion NICHT mit der Classe der strlResult "verbunden" ist und selbstständig sortiert, sonder man immer den Aufruf für die Custom Sortierung machen muss.

Das hatte ich anders angenommen aber das war mein Fehler.
Ich dachte, man setzt Sorted auf Tru und sagt, sortiere aber damit...

Gruß Frank

Blup 13. Aug 2021 09:40

AW: TStringList.CustomSort wird nicht angesprochen?
 
Wenn "Sortet" gesetzt ist, verwendet TStringList eine effizientere Methode bei der Suche nach vorhandenen Einträgen( "IndexOf()" ).
Diese Methode geht davon aus, dass die Elemente bereits auf Grundlage der eigenen Compare-Funktion sortiert sind.
Es wird nicht jedes Element verglichen, sondern der Suchbereich mit Hilfe der Compare-Funktion schrittweise eingegrenzt.
Das funktioniert auch, wenn die Compare-Funktion überschrieben wurde.

Weil die externe Compare-Funktion nach dem "CustomSort" nicht mehr bereit steht, muss "Sortet" False bleiben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:16 Uhr.

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