Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Interface und Loadpackage (https://www.delphipraxis.net/183700-interface-und-loadpackage.html)

gargano 29. Jan 2015 15:17

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:
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;
und hier beginnt das Dilemma:

Typecasting IClassCLCPump300(FCLCPump300) führt zu einem Compilerfehler,
da IClassCLCPump300 und TCustomform inkompatible Typen sind.

Hat einer eine Idee ?

Gruß
Gargano

Elvis 29. Jan 2015 15:49

AW: Interface und Loadpackage
 
Delphi hat dafür die Compiler magic-Funktion "Delphi-Referenz durchsuchensupports"
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;

gargano 29. Jan 2015 16:08

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

Dejan Vu 30. Jan 2015 07:08

AW: Interface und Loadpackage
 
Richtig, aber dann verwende doch das Interface einfach...
Delphi-Quellcode:
 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;
Wobei 'ICLCPump300' ein ganz schlechter Name für eine Variable ist, weil der Prefix 'I' für Interface-Typen per Konvention reserviert ist.

gargano 30. Jan 2015 08:45

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:
TDeviceObject = class (TObject)
    DeviceModule        : TDataModule;
    DeviceInterface300      : IClassCLCPump300;
    DeviceInterface330      : IClassCLCPump330;
    DeviceInterface400      : IClassCLCPump400;
    ModuleName          : String;
    DeviceName          : String;
Wie kann man dies universell machen ?
TDeviceObject = class (TObject)
DeviceModule : TDataModule;
DeviceInterface : ???;

Pointer funktioniert nicht.

OlafSt 30. Jan 2015 09:20

AW: Interface und Loadpackage
 
Werf mal einen Blick hier rein. Sind äußert lehrreiche 45 Minuten.

Dann wird dir auffallen, das deine Interfaces allesamt für die Tonne sind ;)

gargano 30. Jan 2015 10:50

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

Dejan Vu 30. Jan 2015 11:47

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?

gargano 30. Jan 2015 12:06

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 21:30 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