![]() |
TObjectList und CustomComparer
Ich habe folgende Klassen:
Delphi-Quellcode:
Das funktioniert.
TObjX = class(TObject
MD5 : integer; end; TObjXListe = class(TObjectList<TObjX>) private function VergleicheMD5(const L,R:TObjX):Integer; public procedure Sort; end; procedure TObjXListe.Sort; begin inherited Sort(TComparer<TObjX>.Construct(Self.VergleicheMD5)); end; Nun habe ich aber folgende Klasse:
Delphi-Quellcode:
Wie sortiere ich jetzt diesmal die TObjectList<TObjX> mit einem Custom Comparer? Prinzipiell bekäme ich das schon hin, es gibt mehrere Lösungen, aber ich hätte es gern so konzise wie
TKlasseX = class(TObject)
ObjXListe : TObjectList<TObjX>; end;
Delphi-Quellcode:
Alle Versuche, diese Zeile so zu modifizieren, dass sie klappt, schlugen fehl.
inherited Sort(TComparer<TObjX>.Construct(Self.VergleicheMD5)).
Und auch folgende Prozedur blieb immer hängen:
Delphi-Quellcode:
Und zwar nach dem ersten
procedure TKlasseX.SortiereNachMD5;
begin ObjXListe.Sort( TComparer<TObjX>.Construct( function(const L,R: TObjX): Integer begin Result := L.MD5 - R.MD5; end)) end;
Delphi-Quellcode:
mit der Begründung: Fehler 2480: Inkompatible Typen: 'System.Generics.Defaults.TComparison<Modulxyz.TOb jX>' und 'Procedure'.
end
Kann mich da jemand erleuchten? |
AW: TObjectList und CustomComparer
Sollte das nicht
Delphi-Quellcode:
heißen?
TObjX
Delphi-Quellcode:
TComparer<ObjX>.Construct(
|
AW: TObjectList und CustomComparer
Das war leider nur ein Übertragungsfehler, den ich korrigiert habe. Im Original stand das "T" dabei.
|
AW: TObjectList und CustomComparer
sollte der TComparer nicht 1 oder -1 oder 0 zurückgeben?
Für größer, kleiner und gleich? Grüße Klaus |
AW: TObjectList und CustomComparer
Ja+Nein
Ist wie mit dem Boolean True = 1, bei der Konstante, aber <>0 = True, bei der Auswertung. 0, Kleiner oder Größer, allerdings MD5 sollte doch auch Werte größer als Integer liefern? |
AW: TObjectList und CustomComparer
Ich habe jetzt mal den Code in der geposteten Minimalform in ein neues Projekt eingefügt und er kompiliert. Da muss etwas anderes dahinter stecken. Ich versuche, es herauszukriegen.
Gibt es eine Version mit dem inherited, die funktionieren würde? |
AW: TObjectList und CustomComparer
Da du eh deine eigene Klasse von
Delphi-Quellcode:
ableitest, schreib nen Konstruktur und übergib einfach den comparer ans inherited Create und spar dir das bei jedem Sort Aufruf
TObjectList<TObjX>
|
AW: TObjectList und CustomComparer
Man wird es vermutlich nicht glauben, aber das Problem saß mal wieder vor dem Schirm. Ich hatte extra eine etwas abstrahierte Form meines Codes gepostet anstatt des Originalcodes. Wie immer hätte ich das nicht tun sollen, denn dann wäre der Fehler sofort gefunden worden.
Im Originalcode hatte ich statt
Delphi-Quellcode:
procedure TKlasseX.SortiereNachMD5;
begin ObjXListe.Sort( TComparer<TObjX>.Construct((
Delphi-Quellcode:
geschrieben, was dort (anders als hier im Beispiel) sehr ähnlich war. Wie blöd. Vielen Dank jedenfalls an alle Hilfsbereiten. (Interessant, dass hier der Fettdruck versagt.)
procedure TKlasseX.SortiereNachMD5;
begin ObjXListe.Sort( TComparer<TKlasseX>.Construct( |
AW: TObjectList und CustomComparer
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:15 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