AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Interfaces / Pseudo-Plugin - wie geht's richtig?
Thema durchsuchen
Ansicht
Themen-Optionen

Interfaces / Pseudo-Plugin - wie geht's richtig?

Ein Thema von silver-moon-2000 · begonnen am 7. Okt 2009 · letzter Beitrag vom 8. Okt 2009
Antwort Antwort
silver-moon-2000

Registriert seit: 18. Feb 2007
Ort: Schweinfurt
170 Beiträge
 
Delphi XE Professional
 
#1

Interfaces / Pseudo-Plugin - wie geht's richtig?

  Alt 7. Okt 2009, 19:47
Hallo zusammen, ihr Helden meiner schlaflosen Nächte

ich habe wieder mal ein Problem, das bei einem Großteil von Euch Kopfschütteln hervorrufen dürfte.
Es handelt sich dabei um eine sehr längliche Frage zum Grundsatzthema Interfaces.



Ich habe ein Hauptprogramm, das eine sogenannte Queue ("array of RBlubb" mit RBlubb=Record) verarbeitet. Im Endeffekt sind das Anweisungen zur sequentiellen Steuerung einer Relaiskarte.

Diese Queue soll dabei von einer Reihe von "Plugins" erstellt werden. Jedes Plugin besteht dabei aus einer Form mit mehreren visuellen Komponenten und eben einem Button, die diese erstellte Queue an das Hauptprogramm senden soll.

Das Plugin muss jedoch vom Hauptprogramm eine Rückmeldung erhalten, wie "gut" die erstellte Queue ist, damit sie gegebenenfalls überarbeitet werden kann.


So habe ich es bisher umgesetzt

Im Hauptprogramm:
Delphi-Quellcode:
 type IPluginInterface = interface(IInterface)
  ['{2E9D5924-ECB9-4068-8969-83AF8A604A66}']
  procedure receiveQueue(q : TQueue);
  function sendEvaluation(q: TQueue) : Single;
  function isQueueRunning: Boolean;
end;
Delphi-Quellcode:
type TMainInterface = class(TInterfacedObject, IPtO)
  public
    procedure recieveQueue(q : TQueue);
    function sendPoints(q: TQueue) : Single;
end;

procedure TMainInterface.recieveQueue(q : TQueue);
begin
  //hier wird Queue gespeichert und zum Weiterverarbeiten aufbereitet
end;

function TMainInterface.send Evaluation(q : TQueue) : Single;
begin
  //hier wird Queue grob ausgewertet und ein Qualitätsfaktor ermittelt
end;

function TMainInterface.IsQueueRunning : Boolean;
begin
  //wenn Queue abgearbeitet wird, darf Plugin Queue nicht übertragen
end;

im Plugin:
Delphi-Quellcode:
type TPlugin = class(TObject)
  private
    FQueue : TQueueSequence;
    FPointEst : Single;
  public
    procedure CreateQueue;
    procedure getQualityFactor;
    procedure SendQueue;
end;

procedure TPlugin.getQualityFactor;
var inter : IPluginInterface;
begin
  inter := TMainInterface.Create;
  FPointEst := inter.sendEvaluation(FQueue);
  inter := nil;
end;

procedure TPlugin.SendQueue;
var inter : IPluginInterface;
begin
  inter := TMainInterface.Create;
  if not inter.isQueueRunning then
    inter.recieveQueue(FQueue);
  inter := nil;
end;

procedure TPlugin.CreateQueue;
begin
  //hier wird die Queue erstellt
end;

Nach dieser langen Einführung jetzt meine Frage:
Habe ich das Prinzip des Interfaces überhaupt richtig verstanden? Damit meine ich: ist es nicht im Allgemeinen das Plugin, das das Interface implementiert?

So stelle ich mir den richtigen Umgang mit Interfaces vor
Delphi-Quellcode:
type IPtM = interface(IInterface)
  ['{2E9D5924-ECB9-4068-8969-83AF8A604A66}']
  function provideQueue : string;
  procedure getPoints(p : Integer);
end;

type TProgram = class(TObject)
  private
    FQueue : string;
  public
    procedure getQueue;
    function providePointEst : Integer;
end;

type TPlugin = class(TInterfacedObject, IPtM)
  private
    FQueue : string;
    FPointEst : Integer;
  public
    procedure CreateIndividualQueue;

    function provideQueue : string;
    procedure getPoints(p : Integer);
end;

implementation

procedure TProgram.getQueue;
var inter : IPtM;
begin
  inter := TPlugin.create;
  FQueue := inter.provideQueue;
  inter := nil;
end;

function TProgram.providePointEst: Integer;
var inter : IPtM;
begin
  inter := TPlugin.create;
  inter.getPoints(providePointEst(inter.provideQueue));
  inter := nil;
end;

{ TProgram }

procedure TPlugin.CreateIndividualQueue;
begin
  FQueue := 'abc';
end;

procedure TPlugin.getPoints(p: Integer);
begin
  FPointEst := p;
end;

function TPlugin.provideQueue: string;
begin
  Result := FQueue;
end;
In diesem Fall habe ich aus dem Plugin aber keine Möglichkeit, die Queue an das Programm zu schicken, sondern das Programm "fordert" die Queue beim PlugIn an?
Der "send Queue" Button des PlugIns "wandert" dann also zum Programm und heißt jetzt "get Queue", oder irre ich mich?

Die Frage kurz zusammengefasst:
- Wenn das Plugin das Interface implementiert, geht dem PlugIn die Rolle des Aktiven verloren (er kann nicht mehr selbst senden), sondern es kann nur noch auf Anfrage des Hauptprogramms die Queue bereitstellen?

- Wie geht's also richtig? Wer muss das Interface implementieren?

Tut mir wirklich leid, keine besser formulierte Frage stellen zu können, aber ich verweise dabei auf meine Signatur

[edith]
Tobias
Bitte nicht hauen , ich weiß es nicht besser
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#2

Re: Interfaces / Pseudo-Plugin - wie geht's richtig?

  Alt 8. Okt 2009, 10:09
Hallo,
Zitat von silver-moon-2000:
- Wenn das Plugin das Interface implementiert, geht dem PlugIn die Rolle des Aktiven verloren (er kann nicht mehr selbst senden), sondern es kann nur noch auf Anfrage des Hauptprogramms die Queue bereitstellen?
nö, das geht schon immer noch. Du musst nur eine Möglichkeit einbauen, dass das Interface dem Hauptprogramm eine Nachricht zukommen lassen kann. Dazu gibt es viele Möglichkeiten (COM event sink, TNotifyEvent, Windows Message...)

Zitat von silver-moon-2000:
- Wie geht's also richtig? Wer muss das Interface implementieren?
Normalerweise implementiert das Plugin das Interface. Ist ja auch logisch: Das Hauptprogramm weiß durch das Interface, wie es beliebige Plugins ansprechen muss.

Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#3

Re: Interfaces / Pseudo-Plugin - wie geht's richtig?

  Alt 8. Okt 2009, 10:16
Hallo Tobias,

schaue Dir mal das Plugin-Tutorial von sakura an. Damit habe ich erst richtig verstanden, wie Interfaces in Delphi richtig eingesetzt werden.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
silver-moon-2000

Registriert seit: 18. Feb 2007
Ort: Schweinfurt
170 Beiträge
 
Delphi XE Professional
 
#4

Re: Interfaces / Pseudo-Plugin - wie geht's richtig?

  Alt 8. Okt 2009, 21:17
Sorry, dass ich erst jetzt Zeit zum Antworten finde.

Zitat von RWarnecke:
Hallo Tobias,

schaue Dir mal das Plugin-Tutorial von sakura an. Damit habe ich erst richtig verstanden, wie Interfaces in Delphi richtig eingesetzt werden.
Danke für den Link, muss ich übersehen haben. Werde ich mir zu Gemüte führen.

Zitat von xaromx:
nö, das geht schon immer noch. Du musst nur eine Möglichkeit einbauen, dass das Interface dem Hauptprogramm eine Nachricht zukommen lassen kann. Dazu gibt es viele Möglichkeiten (COM event sink, TNotifyEvent, Windows Message...)
Ah, danke, das wird mir weiterhelfen, denke ich.

Ich werde mal weiterbasteln und bei Gelegenheit wieder dumm fragen
Tobias
Bitte nicht hauen , ich weiß es nicht besser
  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 16:43 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