AGB  ·  Datenschutz  ·  Impressum  







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

TObjectList und Generics --> E2515

Ein Thema von GreenHorn3600 · begonnen am 25. Okt 2008 · letzter Beitrag vom 25. Okt 2008
Antwort Antwort
GreenHorn3600

Registriert seit: 24. Jun 2007
165 Beiträge
 
#1

TObjectList und Generics --> E2515

  Alt 25. Okt 2008, 17:38
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;
Der Create scheint ihm gar nicht zu gefallen

Vielen Dank schon Mal
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

Re: TObjectList und Generics --> E2515

  Alt 25. Okt 2008, 18:05
Versuchs mal mit "TKey: class, TObject", oder wie die Syntax dort auch sein mag
  Mit Zitat antworten Zitat
GreenHorn3600

Registriert seit: 24. Jun 2007
165 Beiträge
 
#3

Re: TObjectList und Generics --> E2515

  Alt 25. Okt 2008, 18:12
Hallo DAX,

wenn ich hier: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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: TObjectList und Generics --> E2515

  Alt 25. Okt 2008, 18:35
tcl<TKey: class> = class( TObjectList<TKey>)
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.993 Beiträge
 
Delphi 12 Athens
 
#5

Re: TObjectList und Generics --> E2515

  Alt 25. Okt 2008, 18:39
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.
Uwe Raabe
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6

Re: TObjectList und Generics --> E2515

  Alt 25. Okt 2008, 18:49
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
  Mit Zitat antworten Zitat
GreenHorn3600

Registriert seit: 24. Jun 2007
165 Beiträge
 
#7

Re: TObjectList und Generics --> E2515

  Alt 25. Okt 2008, 23:03
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
  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 04:27 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