Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Überladene, generische Methode aufrufen (https://www.delphipraxis.net/156469-ueberladene-generische-methode-aufrufen.html)

s.h.a.r.k 2. Dez 2010 23:07

Delphi-Version: 2010

Überladene, generische Methode aufrufen
 
Hallo zusammen,

ich schreibe mir gerade ein paar Klassen, mit denen ich so ziemlich alles animieren lassen will. Zunächst war meine Idee lediglich ein Overlay-Form einfaden zu lassen, allerdings ist mir das im Moment zu spezifisch. Bin im Moment dabei mich mal wieder mit Generics zu befassen und habe folgenden Code:
Delphi-Quellcode:
procedure TAnimator.Add<T>(ATarget: TObject; APropertyName: String; AToValue: T);
begin
  Add<T>(ATarget, [APropertyName], [AToValue]); // Das hier ist Zeile 184
end;

procedure TAnimator.Add<T>(ATarget: TObject; APropertyName: array of String; AToValue: array of T);
begin

  // Do something...

end;
Ohne Generics funktioniert und compiliert das ganze wunderbar. Aber hier erscheint dann diese tolle Fehlermeldung:
Zitat:

[DCC Fehler] ApAnimations.pas(184): E2506 Im interface-Abschnitt deklarierte Methode des parametrisierten Typs darf kein lokales Symbol ':6' verwenden
Gerate wurde ich sagen, dass ich das nicht machen darf, da der Compiler einfach nicht damit klar kommt. Kennt hierfür aber evtl. jemand eine Lösung bzw. Workaround?

himitsu 2. Dez 2010 23:44

AW: Überladene, generische Methode aufrufen
 
Man darf allgemein innnerhalb von öffentlichen Generics nix verwenden, welches nicht öffentlich (lokal) ist.

Alles was du innerhalb des Generics nutzt, das muß auch öffentlich im Interface-Abschnitt deklariert sein.
Also du darfst nix verwenden, welches erst im Implementation-Abschnitt zur Verfügung steht.

Der Grund: Diese generische Methode wird erst da fertig eingebaut, wo sie verwendet wird.

Wenn also in einer anderen Unit nun
Delphi-Quellcode:
Animator.Add<irgendwas>(...);
aufgerufen wird, dann wird an dieser Stelle diese Funktion, mit diesem Typ erzeugt und von da aus muß nun auf alles genutzte Zugriff bestehn, welches bei lokalen/privaten Dingen nicht der Fall wäre.

s.h.a.r.k 2. Dez 2010 23:46

AW: Überladene, generische Methode aufrufen
 
Das heißt quasi, ich darf das nicht machen?

himitsu 3. Dez 2010 00:02

AW: Überladene, generische Methode aufrufen
 
theoretisch dürftest du es machen ... wenn Emba es mal hinbekommt den "eigentlich" externen Typen T an dieser Stelle auch als extern anzusehn :roll:

s.h.a.r.k 3. Dez 2010 00:05

AW: Überladene, generische Methode aufrufen
 
Ach ja... die liebe Theorie :mrgreen: Naja, dann muss ich halt mal doch ein wenig doppelten Code schreiben... Danke für die Info!

USchuster 3. Dez 2010 20:41

AW: Überladene, generische Methode aufrufen
 
Schon mal mit XE getestet?

Mit folgendem Code bekomme ich mit XE keinen Fehler, aber mit 2010 schon.
([DCC Error] Unit20.pas(15): E2506 Method of parameterized type declared in interface section must not use local symbol ':3')

Delphi-Quellcode:
unit Unit20;

interface

type
  TFoo = class
    procedure Add<T>(ATarget: TObject; APropertyName: String; AToValue: T); overload;
    procedure Add<T>(ATarget: TObject; APropertyName: array of String; AToValue: array of T); overload;
  end;

implementation

procedure TFoo.Add<T>(ATarget: TObject; APropertyName: String; AToValue: T);
begin
  Add<T>(ATarget, [APropertyName], [AToValue]); // Das hier ist Zeile 184
end;

procedure TFoo.Add<T>(ATarget: TObject; APropertyName: array of String; AToValue: array of T);
begin
  // Do something...
end;

end.

himitsu 3. Dez 2010 21:18

AW: Überladene, generische Methode aufrufen
 
Schade daß ich mir dieses XE genannte Update nicht leisten kann.
Vorallem die vielen "Internal Error" kenn ich schon zu Genüge.

s.h.a.r.k 3. Dez 2010 23:48

AW: Überladene, generische Methode aufrufen
 
Jo, das "Update"... XE und ich sind jedenfalls keine guten Freunde. Viele zu viele (neue) Fehler für zu wenig Neues. Aber herzlichen Dank für den Hinweis! Wenigstens da wurde was gemacht.

Bummi 3. Dez 2010 23:59

AW: Überladene, generische Methode aufrufen
 
[OT]
sorry für OT, aber komplexe Systeme, komplexe Fehler ...
[/OT]

s.h.a.r.k 4. Dez 2010 00:03

AW: Überladene, generische Methode aufrufen
 
Aber warum baut man mit einer neuen Version der IDE mehr Fehler ein als in der davor? XE ist ja eigentlich echt nur ein Update, das muss Embarcadero schon zugeben (kein 64-bit Support, keine MacOS/Linux-Support). Aber ist halt immer so eine Sache ;) Es ist wie es ist und damit müssen wir wohl leben. Wollen wir einfach hoffen, dass die XE2 wieder taugt.


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