AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TList unter Android

Ein Thema von sko1 · begonnen am 2. Mär 2018 · letzter Beitrag vom 2. Mär 2018
Antwort Antwort
sko1

Registriert seit: 27. Jan 2017
601 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

TList unter Android

  Alt 2. Mär 2018, 08:25
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
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
755 Beiträge
 
#2

AW: TList unter Android

  Alt 2. Mär 2018, 08:51
funktioniert unter Windows problemlos, unter Android knallt es beim Zugriff auf die Liste.
Da funktioniert ARC nicht mehr.

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
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: TList unter Android

  Alt 2. Mär 2018, 09:29
Hallo,
Du musst dann doch auch mit einem Comparer arbeiten?

https://stackoverflow.com/questions/...stt-collection
Heiko
  Mit Zitat antworten Zitat
sko1

Registriert seit: 27. Jan 2017
601 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

AW: TList unter Android

  Alt 2. Mär 2018, 10:23
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
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#5

AW: TList unter Android

  Alt 2. Mär 2018, 10:34
Moin...

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;

Geändert von haentschman ( 2. Mär 2018 um 11:34 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: TList unter Android

  Alt 2. Mär 2018, 10:44
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
$2B or not $2B

Geändert von himitsu ( 2. Mär 2018 um 10:47 Uhr)
  Mit Zitat antworten Zitat
sko1

Registriert seit: 27. Jan 2017
601 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#7

AW: TList unter Android

  Alt 2. Mär 2018, 14:41
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
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#8

AW: TList unter Android

  Alt 2. Mär 2018, 14:42
Zitat:
Sollte ich da nicht einfach das Datum als Zahl benutzen und sortieren?
...logisch! (TDateTime ist ja auch eine Zahl)

Geändert von haentschman ( 2. Mär 2018 um 15:13 Uhr)
  Mit Zitat antworten Zitat
SProske

Registriert seit: 16. Feb 2015
Ort: Halle/S.
116 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#9

AW: TList unter Android

  Alt 2. Mär 2018, 14:45
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;
Sebastian
  Mit Zitat antworten Zitat
sko1

Registriert seit: 27. Jan 2017
601 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#10

AW: TList unter Android

  Alt 2. Mär 2018, 15:10
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:

      Result := Round((Left.Uhrzeit - Right.Uhrzeit) * SecsPerDay); Ciao
Stefan
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:23 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