AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Interface Methode als Parameter übergeben

Interface Methode als Parameter übergeben

Ein Thema von t2000 · begonnen am 25. Jul 2022 · letzter Beitrag vom 27. Jul 2022
Antwort Antwort
freimatz

Registriert seit: 20. Mai 2010
1.490 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Interface Methode als Parameter übergeben

  Alt 25. Jul 2022, 20:24
Sehe ich auch so.
Dazu noch ein Hinweis: mache statt "TMeineFunktion = function" besser "TMeineFunktion = reference to function". Das ist dann universeller verwendbar. (Mehr dazu hier.)
  Mit Zitat antworten Zitat
Benutzerbild von t2000
t2000

Registriert seit: 15. Dez 2005
Ort: NRW
247 Beiträge
 
Delphi 12 Athens
 
#2

AW: Interface Methode als Parameter übergeben

  Alt 26. Jul 2022, 11:22
Hier nochmal ein paar Hintergründe dazu.
Ich nutze verschiedene TMS REST-Server. Die Schnittstelle auf der Clientseite ist pro Server eine Unit mit einem Interface, welches Funktionen des REST-Servers zur Verfügung stellt. Diese Funktionen hab ich auf der Serverseite programmiert und wird vom Client aufrufen.

Eine Funktionsschnittstelle als Beispiel (Definition/Deklaration auf Server und Client verfügbar):
Delphi-Quellcode:
  IPubFunc = interface(IInvokable)
    ['{FBA5E9E9-87FC-4501-A10E-757218094BF8}']

    function InstallEvent ( const Param: TJSONObject) : TJSONObject; // Para: ProducerID, ProducerName, Eventname
    function UninstallEvent ( const Param: TJSONObject) : TJSONObject; // Para: EventID, Force
    function SubscribeEvent ( const Param: TJSONObject) : TJSONObject; // Para: EventID, SubscriberID, Important, Priority, CallbackURL
    function UnsubscribeEvent( const Param: TJSONObject) : TJSONObject; // Para: EventID, SubscriberID
    function CancelSubscriber( const Param: TJSONObject) : TJSONObject; // Para: SubscriberID
    function FireEvent ( const Param: TJSONObject) : TJSONObject; // Para: EventID, Data
  end;

Am Client habe ich einen XDataClient.
xClient : TXDataClient; // =TMS-Object Dieser hat eine Funktionsschnitstelle
Delphi-Quellcode:
var
  xPubFunc : IPubFunc;
begin
  xPubFunc := xClient.Service<IPubFunc>;
Wenn ich nun die unterschiedlichen Funktionen aufrufen möchte habe ich (bei mir) ca. 20 Zeilen Overhead.
Darin befindet sich dieser Aufruf
json := xPubFunc.InstallEvent(jsonPara); wobei "json" und "jsonpara" jeweils TJSONObject Variablen sind.

Da alle Aufrufe der unterschiedlichen REST-Server und auch der unterschiedlichen Funktionen identisch sind (Errorhandling, Datenkonvertierung, usw), wäre eine einzelne Funktion für alle Aufrufe sehr hilfreich. Dynamisch sind ja nur der JSON-Parameter und das jeweilige Interface mit der entsprechenden Funktion.

Soviel mal zum Hintergrund. Die TMS Sourcen möchte ich natürlich nicht ändern. Das ganze läuft soweit super gut.

Ich werde jetzt mal eure Hinweise durchgehen und das eine oder andere ausprobieren.

Viele Dank schon mal.

Thomas
Thomas
(Wir suchen eine(n) Entwickler(in) mit Ambitionen später ggf. die Softwarefirma zu leiten)
Aktuell nicht mehr. Aber ab vielleicht 2024/2025 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.373 Beiträge
 
Delphi 12 Athens
 
#3

AW: Interface Methode als Parameter übergeben

  Alt 26. Jul 2022, 11:40
reference-to funktioniert aber bei Interface-Methoden nicht.

Bei IDispatch/OleVariant ginge etwas, da diese Interfaces Funktionen zum Auflösen von Methoden-Namen besitzen (DispInvoke).

Bei normalen/einfachen Interfaces könntest du noch über die RTTI gehen, also Interface-Zeiger plus Methoden-Index oder -Name zu übergeben und es darüber aufzurufen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Interface Methode als Parameter übergeben

  Alt 26. Jul 2022, 12:01
Ist nur so eine Idee:
Delphi-Quellcode:
type
  TJSONObjectFunc = reference to function( const Param: TJSONObject): TJSONObject;// of object;

type
  TPubFunc = record
    class function InstallEvent(Target: IPubFunc): TJSONObjectFunc; static;
    class function UninstallEvent(Target: IPubFunc): TJSONObjectFunc; static;
    class function SubscribeEvent(Target: IPubFunc): TJSONObjectFunc; static;
    class function UnsubscribeEvent(Target: IPubFunc): TJSONObjectFunc; static;
    class function CancelSubscriber(Target: IPubFunc): TJSONObjectFunc; static;
    class function FireEvent(Target: IPubFunc): TJSONObjectFunc; static;
  end;

implementation

class function TPubFunc.InstallEvent(Target: IPubFunc): TJSONObjectFunc;
begin
  Result := function(const Param: TJSONObject) : TJSONObject
    begin
      Result := Target.InstallEvent(Param);
    end;
end;

{ analog für die anderen Methoden }
Aufruf dann so:
Delphi-Quellcode:

procedure HandlePubFunc(xPubFunc: IPubFunc; AFunc: TJSONObjectFunc);
begin
  ...
  json := AFunc(jsonPara);
  ...
end

var
  xPubFunc : IPubFunc;
begin
  xPubFunc := xClient.Service<IPubFunc>;
  HandlePubFunc(xPubFunc, TPubFunc.InstallEvent(xPubFunc));
  ...

  HandlePubFunc(xPubFunc, TPubFunc.FireEvent(xPubFunc));
  ...
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.373 Beiträge
 
Delphi 12 Athens
 
#5

AW: Interface Methode als Parameter übergeben

  Alt 26. Jul 2022, 12:49
Das HandlePubFunc würde ich aber in TPubFunc mit integrieren.
Dort drin nicht nur die WrapperFunktion zurückgeben, sondern es direkt ausführen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Interface Methode als Parameter übergeben

  Alt 26. Jul 2022, 13:01
Das HandlePubFunc würde ich aber in TPubFunc mit integrieren.
Würde ich eben gerade nicht machen. Es kann ja durchaus mehrere HandlePubFunc geben. Das HandlePubFunc könnte ja auch völlig unabhängig von IPubFunc sein (dann sollte es natürlich anders heißen) und lediglich eine TJSONObjectFunc als Parameter benötigen. Können wir ja hier nicht wissen was da alles drin passiert.

Delphi-Quellcode:
procedure HandleJSONObject(AFunc: TJSONObjectFunc);
begin
  ...
  json := AFunc(jsonPara);
  ...
end

var
  xPubFunc : IPubFunc;
begin
  xPubFunc := xClient.Service<IPubFunc>;
  HandleJSONObject(TPubFunc.InstallEvent(xPubFunc));
  ...

  HandleJSONObject(TPubFunc.FireEvent(xPubFunc));
  ...
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von t2000
t2000

Registriert seit: 15. Dez 2005
Ort: NRW
247 Beiträge
 
Delphi 12 Athens
 
#7

AW: Interface Methode als Parameter übergeben

  Alt 27. Jul 2022, 08:13
Also ich habe jetzt die "häßliche" Methode von Uwe ausprobiert ... und .. es funktioniert eigentlich sehr gut.
Für's erste werde ich das so mal lassen, aber unter "Beobachtung" halten.
Vielen Dank euch allen.
Thomas
(Wir suchen eine(n) Entwickler(in) mit Ambitionen später ggf. die Softwarefirma zu leiten)
Aktuell nicht mehr. Aber ab vielleicht 2024/2025 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 07: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-2025 by Thomas Breitkreuz