![]() |
Re: Von TObjectList<T> erben?
Zitat:
(oder kam das auch später?) Zitat:
Delphi-Quellcode:
function generic(T: TTreeItem) MyFunc(A: T): T;
begin // do something with the tree item end; // oder function generic(T) Max(A, B: T): T; begin if A < B then Result := B else Result := A; end; |
Re: Von TObjectList<T> erben?
Zitat:
Ok, das "Hm!?" war missverständlich, was ich sagen wollte "Was ist mit dem hier!?" -- Ist gleichwertig:
Delphi-Quellcode:
Derzeit ist noch Achtung geboten mit generischen Methoden:
class procedure TKlasse.DelphiProzedur<T>(const Value: T);
procedure FPCProzedur(T)(const Wert: T); // Aufruf: TKlasse.DelphiProzedur<Integer>(123); FPCProzedur(Integer)(123); ![]() |
Re: Von TObjectList<T> erben?
Ich muss noch ma was Fragen...
Die generische Liste bietet mir ja bei der ObjectList die möglichkeit auf TypeCasts zu verzichten. Also sollte doch bei meiner TNonFoodList welche von TObecjtList<TNonFood> erbt folgender aufruf funktionieren:
Delphi-Quellcode:
TNonFood enthält natürlich ein Feld welches Artikelname heißt.
var
s: string; begin s:= locNonFoodList.Items[X].Artikelname; end; Nur wird mir Artikelname im Code Editor rot unterstrichen aber er compilliert trotzdem... Warum? :gruebel: Und dann wollte ich mein CustomSort übernehmen und hab da gleich das nächste Problem ...
Delphi-Quellcode:
Markiert wird end));
procedure TNonFoodList.Sortieren(SortBy: TNonFoodArtikelEnum);
begin NonFoodArtikelSortieren := SortBy; Self.Sort(TComparer<TNonFood>.Construct( function (Left, Right: TNonFood): Integer begin case NonFoodArtikelSortieren of Artikelname: CompareText(Left.Artikelname, Right.Artikelname); Menge: CompareValue(Left.Menge, Right.Menge); Preis: CompareValue(Left.Preis, Right.Preis); Kosten: CompareValue(Left.Kosten, Right.Kosten); end; end)); end; Compilermeldung: Zitat:
|
Re: Von TObjectList<T> erben?
Zitat:
Irgendein Vollpfosten beim damaligen Borland war der Meinung, dass man statt den Parser des Compilers einen neuen in C# geschriebenen Parser für ErrorInsight braucht. Und der ist nicht mal 90% Delphi-konform. Für ein ErrorInsight braucht man aber 100%, sonst kann man das ganze Feature wegschmeißen. Leider haben sie es von 2004 bis jetzt noch nicht hinbekommen, den ErrorInsight-Parser alle Sprachfeatures beizubringen. Generic-Klassen und vor allem Generic-Arrays werden von wenig bis gar nicht richtig erkannt. Überladene Methode in einer if-Abfrage (=> if FileAge(..) then) unterringelt er, da der Parser sich immer für die erste Deklaration entscheidet (die bei FileAge natürlich deprecated ist). Usw. Am besten schaltet man das Feature ab, wenn man mit Generics was macht. |
Re: Von TObjectList<T> erben?
Zitat:
Zitat:
Zitat:
Zitat:
![]() |
Re: Von TObjectList<T> erben?
Zitat:
|
Re: Von TObjectList<T> erben?
Zitat:
Ich hab es noch einmal nach diesem Beispiel hier versucht: ![]() Ändert aber nichts an der Fehlermeldung. Seltsam ist das TList<>.Sort als Pararmeter "AComparer Void-Typ" erwartet.
Delphi-Quellcode:
Und bei
procedure TList<T>.Sort(const AComparer: IComparer<T>);
Delphi-Quellcode:
Wäre der von mir verwendete Aufruf korrekt:
TComparer<T> = class(TInterfacedObject, IComparer<T>)
Delphi-Quellcode:
Kann es sein das es ein Bug im Compiler ist? :gruebel:
function Construct(const Comparison: TComparison<T>): IComparer<T>;
Tante Edit: Also ich hab mal das komplette Beispiel nach gebaut. Da funktioniert es ohne Fehler. Kann es sein das <T> in diesem Fall keine Klasse sein darf? :roteyes: |
Re: Von TObjectList<T> erben?
So jetzt hab ichs.
So geht des CustomSort:
Delphi-Quellcode:
Aber die Probleme gehen weiter... :(
type
TNonFoodComparer = class (TComparer<TNonFood>) function Compare(const Left, Right: TNonFood): Integer; override; end; ... { TNonFoodComparer } function TNonFoodComparer.Compare(const Left, Right: TNonFood): Integer; begin case NonFoodArtikelSortieren of Artikelname: Result := CompareText(Left.Artikelname, Right.Artikelname); Menge: Result := CompareValue(Left.Menge, Right.Menge); Preis: Result := CompareValue(Left.Preis, Right.Preis); Kosten: Result := CompareValue(Left.Kosten, Right.Kosten); end end; ... { TNonFoodList } procedure TNonFoodList.Sortieren(SortBy: TNonFoodArtikelEnum); begin NonFoodArtikelSortieren := SortBy; Self.Sort(TNonFoodComparer.Default); end; Ich habe versucht den Bug den himitsu ![]()
Delphi-Quellcode:
Hier hab ich nun Undeklarierter Bezeichner: 'T'
constructor TNonFoodList.Create(const AComparer: IComparer<T>;
AOwnsObjects: Boolean); begin inherited Create(AComparer, AOwnsObjects); end; :? so langsam nervts mich.... |
Re: Von TObjectList<T> erben?
Was versuchtst Du denn zu beheben, wenn Du nur den geerbten Kontruktor aufrufst? Außerdem: Die Fehlermeldung erscheint ganz zu Recht -- T ist unbekannt. Du musst den Vergleich-Typ IComparer<T> schließen ("instantiieren"), an der Stelle handelt es sich nicht mehr um einen offenen Typ.
|
Re: Von TObjectList<T> erben?
Vielleicht so?
Delphi-Quellcode:
Da TNonFoodList nicht mehr generisch ist, kann mann den Platzhalter T auch nicht mehr verwenden, sondern muss ihn durch einen bekannten Typ ersetzen.
constructor TNonFoodList.Create(const AComparer: IComparer<TNonFood>; AOwnsObjects: Boolean);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:14 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 by Thomas Breitkreuz