![]() |
Interface und Loadpackage
Hi,
ich habe leider nichts passendes gefunden, deshalb hier meine Frage: Es geht um Interfaces in Verbindung mit einer dynamisch geladenen Klasse über LoadPackage und mehreren Instanzen. IClassCLCPump300 ist das Interface zu der Klasse Die Klasse sind so aus:
Delphi-Quellcode:
und hier beginnt das Dilemma:
type
TfrmCLCPump300 = class(TForm, IClassCLCPump300) //Das Package wird so geladen: FPackageModule := LoadPackage(FPackageName); FMyClass := GetClass('TfrmCLCPump300'); //Danach soll eine (oder mehrere) Instanz erzeugt werden: FCLCPump300 := TComponentClass(FMyClass).Create(Self) as TCustomForm; if Supports(FCLCPump300, IClassCLCPump300, ICLCPump300) then begin // hier soll eine Funktion von der erzeugten Klasse aufgerufen werden Result:=IClassCLCPump300(FCLCPump300).GetObject; Typecasting IClassCLCPump300(FCLCPump300) führt zu einem Compilerfehler, da IClassCLCPump300 und TCustomform inkompatible Typen sind. Hat einer eine Idee ? Gruß Gargano |
AW: Interface und Loadpackage
Delphi hat dafür die Compiler magic-Funktion "
![]() Der gibst du dein Objekt, deinen Interface-Typen (oder eine GUID), und zuletzt eine Variable, in die Supports die Interface-Referenz ablegen wird. Die Funktion liefert true wenn das Interface unterstützt wird.
Delphi-Quellcode:
var
component : TComponent; intf : IClassCLCPump300; begin component :=TComponentClass(FMyClass).Create(Self); if not Supports(component, IClassCLCPump300, intf) then begin component.Free(); raise ... ging nich end; |
AW: Interface und Loadpackage
Hi Elvis,
danke für die Antwort, aber supports verwende ich schon. Das ganze ist nur für eine Instanz gebaut (von jemand anders). Nun sollen aber mehrere Instanzen erzeugt werden, da ist eine Variable nicht ausreichend. Gruß Werner |
AW: Interface und Loadpackage
Richtig, aber dann verwende doch das Interface einfach...
Delphi-Quellcode:
Wobei 'ICLCPump300' ein ganz schlechter Name für eine Variable ist, weil der Prefix 'I' für Interface-Typen per Konvention reserviert ist.
if Supports(FCLCPump300, IClassCLCPump300, ICLCPump300) then
begin // hier soll eine Funktion von der erzeugten Klasse aufgerufen werden Result := IClassCLCPump300(ICLCPump300).GetObject; // Result := IClassCLCPump300(FCLCPump300).GetObject; |
AW: Interface und Loadpackage
Danke Dejan Vu,
damit komme ich zu einem Folgeproblem: Ich habe nicht nur ein Interface sondern mehrere für verschiedene Devices. In einer Initialisierungsroutine werden alle Instanzen erzeugt. Dazu habe ich eine Objectlist, in der ich dann die Instanzen eintrage. Nach dem Umbau zu Interfaces fehlt aber jetzt die Möglichkeit auf diese zuzugreifen. Jetzt könnte ich für jedes Interface einen Eintrag in die Object Struktur machen:
Delphi-Quellcode:
Wie kann man dies universell machen ?
TDeviceObject = class (TObject)
DeviceModule : TDataModule; DeviceInterface300 : IClassCLCPump300; DeviceInterface330 : IClassCLCPump330; DeviceInterface400 : IClassCLCPump400; ModuleName : String; DeviceName : String; TDeviceObject = class (TObject) DeviceModule : TDataModule; DeviceInterface : ???; Pointer funktioniert nicht. |
AW: Interface und Loadpackage
Werf mal einen Blick
![]() Dann wird dir auffallen, das deine Interfaces allesamt für die Tonne sind ;) |
AW: Interface und Loadpackage
Hi OlafSt,
danke für den Hinweis, das ist das was ich gesucht habe. An dieser Stelle ein herzliches Dankeschön, die geholfen haben. Wie immer in diesem Forum: schnell, kompetent und ohne Schnörkel. Gruß Gargano |
AW: Interface und Loadpackage
Kann er nicht die Interface-Variablen einfach in einer TInterfaceList ablegen und dann drauf zugreifen?
Oder eine Dictionary (was schneller geht). Ich hab die Syntax nicht im Kopf, aber das sollte doch gehen. Dann sind die Intefaces vielleicht doch nicht für die Tonne. Wieso eigentlich? |
AW: Interface und Loadpackage
Genau das habe ich gemacht: in eine ObjectList abgelegt ( mit anderen Variablen).
Ich hätte das ganze mittels BaseClass gemacht, aber mein Vorgänger hat sich für Interface entschieden, und ich will nicht alles ändern ... Gruß Gargano |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:21 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