AGB  ·  Datenschutz  ·  Impressum  







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

Interface und Loadpackage

Ein Thema von gargano · begonnen am 29. Jan 2015 · letzter Beitrag vom 30. Jan 2015
Antwort Antwort
gargano

Registriert seit: 2. Okt 2006
76 Beiträge
 
Delphi 2007 Enterprise
 
#1

Interface und Loadpackage

  Alt 29. Jan 2015, 16:17
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
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#2

AW: Interface und Loadpackage

  Alt 29. Jan 2015, 16:49
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;
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
gargano

Registriert seit: 2. Okt 2006
76 Beiträge
 
Delphi 2007 Enterprise
 
#3

AW: Interface und Loadpackage

  Alt 29. Jan 2015, 17:08
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
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#4

AW: Interface und Loadpackage

  Alt 30. Jan 2015, 08:08
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.
  Mit Zitat antworten Zitat
gargano

Registriert seit: 2. Okt 2006
76 Beiträge
 
Delphi 2007 Enterprise
 
#5

AW: Interface und Loadpackage

  Alt 30. Jan 2015, 09:45
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.
  Mit Zitat antworten Zitat
OlafSt

Registriert seit: 2. Mär 2007
Ort: Hamburg
284 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Interface und Loadpackage

  Alt 30. Jan 2015, 10:20
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
  Mit Zitat antworten Zitat
gargano

Registriert seit: 2. Okt 2006
76 Beiträge
 
Delphi 2007 Enterprise
 
#7

AW: Interface und Loadpackage

  Alt 30. Jan 2015, 11:50
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
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#8

AW: Interface und Loadpackage

  Alt 30. Jan 2015, 12:47
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?
  Mit Zitat antworten Zitat
gargano

Registriert seit: 2. Okt 2006
76 Beiträge
 
Delphi 2007 Enterprise
 
#9

AW: Interface und Loadpackage

  Alt 30. Jan 2015, 13:06
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
  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 12:16 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