Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   TList unter Android (https://www.delphipraxis.net/195459-tlist-unter-android.html)

sko1 2. Mär 2018 07:25

TList unter Android
 
Hallo,

ich habe ein Problem und weiß nicht weiter:

Delphi-Quellcode:
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;
funktioniert unter Windows problemlos, unter Android knallt es beim Zugriff auf die Liste.

Ich habe nun wie folgt geändert un den Typ festzunageln:

Delphi-Quellcode:
var
    Termine: TList<TTermin>;

dann im FormCreate

Termine := TList<TTermin>.Create;
Nun bekomme ich schon beim Compilieren unter Windows
"[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

Olli73 2. Mär 2018 07:51

AW: TList unter Android
 
Zitat:

Zitat von sko1 (Beitrag 1394987)
funktioniert unter Windows problemlos, unter Android knallt es beim Zugriff auf die Liste.

Da funktioniert ARC nicht mehr.

Zitat:

Zitat von sko1 (Beitrag 1394987)
Nun bekomme ich schon beim Compilieren unter Windows
"[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?

https://stackoverflow.com/questions/...ustom-comparer

hoika 2. Mär 2018 08:29

AW: TList unter Android
 
Hallo,
Du musst dann doch auch mit einem Comparer arbeiten?

https://stackoverflow.com/questions/...stt-collection

sko1 2. Mär 2018 09:23

AW: TList unter Android
 
Delphi-Quellcode:
myList.Sort(
  TComparer<TMyRecord>.Construct(
    function(const Left, Right: TMyRecord): Integer
    begin
      Result := Left.intVal - Right.intVal;
    end
  )
);
Danke, genau das ist die Lösung!

Ciao
Stefan

haentschman 2. Mär 2018 09:34

AW: TList unter Android
 
Moin...:P

Man kann auch den Comparer (IComparer) als Instanz erzeugen und dem Create der Liste mitgeben.
Zitat:

Anmerkung: Es wird empfohlen, die Klasse TComparer als Basis für benutzerdefinierte Vergleichsoperationen zu verwenden, anstatt das Interface IComparer direkt zu implementieren.
Vorteil:
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;

himitsu 2. Mär 2018 09:44

AW: TList unter Android
 
Zitat:

Zitat von sko1 (Beitrag 1394987)
Nun bekomme ich schon beim Compilieren unter Windows
"[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?

In die Hilfe schauen oder das Code-Insight fragen?

Da siehst du dann, welche Argumenten (Parameter/Typen) "diese" Sort haben möchte.

PS: Delphi-Referenz durchsuchenDateUtils.CompareTime

Zitat:

Delphi-Quellcode:
Result := CompareText(formatdatetime('hhnnss', TTermin(Item1).Uhrzeit),
  formatdatetime('hhnnss', TTermin(Item2).Uhrzeit));

Aus Sicht der Speicherverwaltung war das eh ein Graus.
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 -> Delphi-Referenz durchsuchenCompareStr
> und Stringvergleiche sind eh ineffizienter, als ein einfacher einziger nummerischer Vergleich

Delphi-Referenz durchsuchenMath.CompareValue
http://docwiki.embarcadero.com/RADSt...rison_Routines

sko1 2. Mär 2018 13:41

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

haentschman 2. Mär 2018 13:42

AW: TList unter Android
 
Zitat:

Sollte ich da nicht einfach das Datum als Zahl benutzen und sortieren?
...logisch! :zwinker: (TDateTime ist ja auch eine Zahl)

SProske 2. Mär 2018 13:45

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;

sko1 2. Mär 2018 14:10

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:
      Result := Round((Left.Uhrzeit - Right.Uhrzeit) * SecsPerDay);
Ciao
Stefan


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