Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TObjectList und Generics --> E2515 (https://www.delphipraxis.net/123001-tobjectlist-und-generics-e2515.html)

GreenHorn3600 25. Okt 2008 17:38


TObjectList und Generics --> E2515
 
Hallo Jungs,

ich versuche mich gerade mit den Generics. Doch bis an hin leider erfolglos. Der Kompiler meint nur dazu

Code:
[DCC Fehler] Unit1.pas(42): E2515 Typparameter 'TKey' ist mit Typ 'TC1' nicht kompatibel
[DCC Fehler] Unit1.pas(55): E2010 Inkompatible Typen: 'TKey' und 'TObject'
[DCC Fehler] Unit1.pas(64): E2515 Typparameter 'TKey' ist mit Typ 'TC1' nicht kompatibel
[DCC Fataler Fehler] Project1.dpr(5): F2063 Verwendete Unit 'Unit1.pas' kann nicht compiliert werden
Kennt jemand das Problem und weiss jemand eine Lösung? Hier mein vergeblicher Versuch:
Delphi-Quellcode:
type
  TC1 = class
    aValue: string;
  end;
  tc2 = class
    aValue: string;
  end;
  tcl<TKey: class> = class(tObjectList)
   private
     function GetItem(Index: integer): TKey;
     procedure SetItem(Index: integer; const Value: TKey);
   public
     property Items[Index: integer]: TKey read GetItem write SetItem;
  end;
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    l1: tcl<tc1>;
    l2: tcl<tc2>;
  end;

var
  Form1: TForm1;

implementation
{$R *.dfm}

function tcl<TKey>.GetItem(Index: integer): TKey;
begin
  result := inherited items[index];
end;
procedure tcl<TKey>.SetItem(Index: integer; const Value: TKey);
begin
  inherited items[index] := value;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  l1 := tcl<tc1>.create;
  l2 := tcl<tc2>.create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
  if l1 <> NIL then FreeAndnIL(l1);
  if l2 <> NIL then FreeAndNIL(l2);
end;
:gruebel: Der Create scheint ihm gar nicht zu gefallen :gruebel:

Vielen Dank schon Mal

Dax 25. Okt 2008 18:05

Re: TObjectList und Generics --> E2515
 
Versuchs mal mit "TKey: class, TObject", oder wie die Syntax dort auch sein mag ;)

GreenHorn3600 25. Okt 2008 18:12

Re: TObjectList und Generics --> E2515
 
Hallo DAX,

wenn ich hier:
Delphi-Quellcode:
tcl<TKey: class, tObject> = class(tObjectList)
noch TObject ergänze, ist zwar der Fehler weg, dafür gibt es dann leider einen neuen :? :

Code:
[DCC Fehler] Unit1.pas(23): E2510 Typ TObject' ist keine gültige Einschränkung
Hat noch jemand einen Tipp?

Grüße
Euer Greeny

mkinzler 25. Okt 2008 18:35

Re: TObjectList und Generics --> E2515
 
Delphi-Quellcode:
tcl<TKey: class> = class( TObjectList<TKey>)

Uwe Raabe 25. Okt 2008 18:39

Re: TObjectList und Generics --> E2515
 
Der Compiler stört sich eindeutig an diesem Teil:
Delphi-Quellcode:
function tcl<TKey>.GetItem(Index: integer): TKey;
begin
  result := inherited items[index];
end;
Wenn man die Zeile auskommentiert, ist auch der Fehler weg. Allerdings funktioniert
Delphi-Quellcode:
function tcl<TKey>.GetItem(Index: integer): TKey;
begin
  result := inherited items[index] as TKey;
end;
leider auch nicht. Vielleicht ein Bug?

Ich frage mich allerdings auch, warum du nicht gleich die TObjectList<T: class> aus Generics.Collections verwendest.

jbg 25. Okt 2008 18:49

Re: TObjectList und Generics --> E2515
 
Zitat:

Zitat von Uwe Raabe
leider auch nicht. Vielleicht ein Bug?

Im Generic-Code des Compilers sind so einige Bugs drinnen, wie meine Kommentare im folgenden Code-Beispiel erläutern (wer hat schon mal "lea eax,ah" oder "lea eax,quiet_dl" im CPU-Fenster gesehen)

Delphi-Quellcode:
{$INLINE ON}
function KeyAsObject(const Key): TObject; inline;
{ Inline muss vorhanden sein, da der Compiler sonst Assembler-Schrott generiert }
begin
  Result := TObject(Key);
end;

procedure ObjectAsKey(Value: TObject; var Key); inline;
{ Inline muss vorhanden sein, da der Compiler sonst Assembler-Schrott generiert }
begin
  TObject(Key) := Value;
end;

function tcl<TKey>.GetItem(Index: Integer): TKey;
begin
  ObjectAsKey(inherited Items[Index], Result);
end;

procedure tcl<TKey>.SetItem(Index: Integer; const Value: TKey);
begin
  inherited Items[Index] := KeyAsObject(Value);
end;

Zitat:

Ich frage mich allerdings auch, warum du nicht gleich die TObjectList<T: class> aus Generics.Collections verwendest.
Vielleicht weil es zu einfach gewesen wäre :-)

GreenHorn3600 25. Okt 2008 23:03

Re: TObjectList und Generics --> E2515
 
Nein, nicht ganz, sondern weil ich die Generics.Collections bislang noch nicht kannte. Daneben dachte ich nicht, dass der Compiler noch so Buggy ist. So, mein erster Ausflug in das Reich der Generics viel somit gründlich in das Wasser :( .

Herzlichen Dank und noch einen schönen Abend.

Schöne Grüsse
Euer Greeny
:cheers:


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