![]() |
TList unter Android
Hallo,
ich habe ein Problem und weiß nicht weiter:
Delphi-Quellcode:
funktioniert unter Windows problemlos, unter Android knallt es beim Zugriff auf die Liste.
type
TTermin = class(TObject) public Uhrzeit: TTime; Name: string; Adresse: string; Grund: string; constructor Create(S: string); end; var Termine: TList; dann im FormCreate Termine := TList.Create; und die Sortierfunktion Termine.Sort(@CompareTime); function CompareTime(Item1, Item2: Pointer): integer; begin Result := CompareText(formatdatetime('hhnnss', TTermin(Item1).Uhrzeit), formatdatetime('hhnnss', TTermin(Item2).Uhrzeit)); end; Ich habe nun wie folgt geändert un den Typ festzunageln:
Delphi-Quellcode:
Nun bekomme ich schon beim Compilieren unter Windows
var
Termine: TList<TTermin>; dann im FormCreate Termine := TList<TTermin>.Create; "[dcc32 Fehler] UnitKalendertag.pas(129): E2250 Es gibt keine überladene Version von 'Sort', die man mit diesen Argumenten aufrufen kann" Hat jemand bitte einen hilfreichen Tip? Ciao Stefan |
AW: TList unter Android
Zitat:
Zitat:
![]() |
AW: TList unter Android
Hallo,
Du musst dann doch auch mit einem Comparer arbeiten? ![]() |
AW: TList unter Android
Delphi-Quellcode:
Danke, genau das ist die Lösung!
myList.Sort(
TComparer<TMyRecord>.Construct( function(const Left, Right: TMyRecord): Integer begin Result := Left.intVal - Right.intVal; end ) ); Ciao Stefan |
AW: TList unter Android
Moin...:P
Man kann auch den Comparer (IComparer) als Instanz erzeugen und dem Create der Liste mitgeben. Zitat:
Der Comparer ist für verschiede Listen (gleichen Typs) verwendbar, anstatt jedesmal eine anonyme Prozedur zu schreiben. (Wiederverwendbarkeit) Damit kannst du 100 Mal sortieren...
Delphi-Quellcode:
// Unit1
TDatabase = class strict private FDatabaseTypeString: string; FDatabaseType: TDatabaseType; FDatabaseVersionString: string; FDatabaseTypePath: string; FDatabaseEditor: TDatabaseEditor; procedure SetDatabaseVersionString(const Value: string); procedure SetDatabaseTypeString(const Value: string); public constructor Create; destructor Destroy; override; property DatabaseType: TDatabaseType read FDatabaseType write FDatabaseType; property DatabaseTypeString: string read FDatabaseTypeString write SetDatabaseTypeString; property DatabaseVersionString: string read FDatabaseVersionString write SetDatabaseVersionString; property DatabaseTypePath: string read FDatabaseTypePath; property DatabaseEditor: TDatabaseEditor read FDatabaseEditor write FDatabaseEditor; end; TDatabaseComparer = class(TComparer<TDatabase>) public function Compare(const Left, Right: TDatabase): Integer; override; end; function TDatabaseComparer.Compare(const Left, Right: TDatabase): Integer; begin Result := CompareStr(Left.DatabaseTypePath, Right.DatabaseTypePath); end; // Unit2 var ComparerDatabase: TDatabaseComparer; begin ComparerDatabase := TDatabaseComparer.Create; FDatabaseList := TDatabaseList.Create(ComparerDatabase); . . . FDatabaseList.Sort; |
AW: TList unter Android
Zitat:
Da siehst du dann, welche Argumenten (Parameter/Typen) "diese" Sort haben möchte. PS: ![]() Zitat:
Je nachdem wie schlecht/gut der Sortieralgorithmus ist, hast du hierbei zigtausende Speicheroperationen. > Strings reserveren und wieder freigeben > unnötige Umwandungen von Floats in Strings > unnötige case-insensitive Vergleiche -> ![]() > und Stringvergleiche sind eh ineffizienter, als ein einfacher einziger nummerischer Vergleich ![]() ![]() |
AW: TList unter Android
Danke!
Ihr bringt mich ja dabei auf die Idee, dass die Datumsangaben ja sowieso eigentlich Zahlen sind (und die zu sortierenden TDateTimes sind sogar alle immer vom gleichen Tag! Sollte ich da nicht einfach das Datum als Zahl benutzen und sortieren? Ciao Stefan |
AW: TList unter Android
Zitat:
|
AW: TList unter Android
Die Unit DateUtils bietet dir auch Funktionen, um nur die Zeit oder nur das Datum zu vergleichen (falls das Datum doch nicht immer gleich ist):
Delphi-Quellcode:
function CompareDateTime(const A, B: TDateTime): TValueRelationship;
function CompareDate(const A, B: TDateTime): TValueRelationship; function CompareTime(const A, B: TDateTime): TValueRelationship; |
AW: TList unter Android
Nachdem ich hier Diskussionen über SecondsBetween usw und damit verbundene Fehler gesehen habe, trau ich den ganzen Date-Funktionen nicht mehr über den Weg!
Meine aktuelle Vergleichsvariante:
Delphi-Quellcode:
Ciao
Result := Round((Left.Uhrzeit - Right.Uhrzeit) * SecsPerDay);
Stefan |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:59 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