Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Hydra 3.0 Plugin (https://www.delphipraxis.net/98883-hydra-3-0-plugin.html)

hanspeter 3. Sep 2007 15:34


Hydra 3.0 Plugin
 
Hallo,

hat verwendet wer dieses Tool und hat schon Erfahrung?
Ich bin gerade beim ausprobieren und bekomme eine Sache nicht hin.

In dem Plugin deklariere ich eine Klasse und möchte diese im Host verwenden.
Wie geht das?


Delphi-Quellcode:
Also Plugin:

TMeineClass = Class
  procedure Machewas;
end;

Im Host:

???.MacheWas;
Gruß Peter

Phoenix 3. Sep 2007 15:50

Re: Hydra 3.0 Plugin
 
An der Stelle würde ich eher an news://news.remobjects.com auf die Gruppe remobjects.public.hydra verweisen. Dort sind die Leute, die damit arbeiten :)

shmia 3. Sep 2007 17:24

Re: Hydra 3.0 Plugin
 
Hast du schon mal versucht unter Datei->Neu eine passende Hydraklasse zu finden ?

luwo 4. Sep 2007 00:16

Re: Hydra 3.0 Plugin
 
Hallo Hanspeter,

bei Hydra kannst du Host/Plugin-Kommunikation über Interfaces regeln, siehe auch Beispielprogramme.

guck doch mal hier, da wirst du sicher fündig.

Grüße Luwo

hanspeter 4. Sep 2007 11:11

Re: Hydra 3.0 Plugin
 
Ich bin im Moment noch am Experimentieren.
Macht aber keinen schlechten Eindruck.
Ich lasse mir das Framwork im Moment noch komplett vom Witzard generieren.
Möchte jetzt halt mehrfach benötigte eigene Klassen auslagern.
Das soll weniger ein Plugin System werden, sondern eine Programm-Modularisierung
erzeugen.

Gruß Peter

hanspeter 5. Sep 2007 13:24

Re: Hydra 3.0 Plugin
 
Zitat:

Zitat von luwo
Hallo Hanspeter,

bei Hydra kannst du Host/Plugin-Kommunikation über Interfaces regeln, siehe auch Beispielprogramme.

Grüße Luwo

So jetzt habe ich es hinbekommen.
Das Teil ist richtig gut. Das Plugin wird als Dll angelegt. Auch mit MDI konnte ich noch keine Probleme entdecken.
Die Hilfe und die Demos in der Trialversion sind ein bischen dürftig, deswegen hatte ich auch die Startprobleme.
Für alle die das Framework mal testen möchten, hier eine Kurzanleitung:

1. Mit dem Wizard ein neues Plugin erzeugen.
Dazu Auswählen ob Visual oder Nonvisual. (Nonvisual setzt auf einem TDataModule auf)
2. Ein Interface für die eigenen Routinen anlegen.
Beispiel:
Delphi-Quellcode:
unit Uinterface;

interface
uses uHYVisualPlugin, uHYIntf, IBDatabase, DB, IBQuery, Classes;

type
 IAnwenderDat = interface(IHYNonVisualPlugin)
  ['{7B475BEC-A93E-4FE2-92A3-340C12F54037}']
    function GetDaten: string;
    procedure SetDaten(Val: string);
    function GetDatabase: TibDatabase;
    function GetQuery: TibQuery;
    function GetListe : TStringList;
  end;
Dieses Interface in dem Plugin einbinden.
Dazu die Definitionszeile anpassen:

Delphi-Quellcode:
type
  { TNonVisualPlugin }
  TNonVisualPlugin = class(THYNonVisualPlugin, IAnwenderDat)
Das Plugin mit den eigenen Methoden erweitern.

Auf der Hostseite kann man sich ebenfalls ein eigenes Projekt generieren lassen und dieses bei
Bedarf in die eigene Application kopieren.

Hier eine Interface - Variable einfügen und das Plugin laden.

Delphi-Quellcode:
with ModuleManager do begin
     LoadModule('NonVisualModule.dll');
     CreateInstance('MyFirstNonVisualPlugin', intfinstance); // See the initialization part of the unit fVisualPlugin.pas
     fNonVisualPlugin := intfinstance as IAnwenderDat;//IHYNonVisualPlugin;
Das wars.

Mit fNonVisualPlugin. ereiche ich alle eigenen Routinen und mit

Delphi-Quellcode:
 ModuleManager.ReleaseInstance(fNonVisualPlugin);
  ModuleManager.UnloadModule(0);
werde ich das Plugin wieder los.
Ein Messagemechanismus von dem Plugin an den Host ist bereits eingebaut.

Die erzeugten Plugin lassen sich sowohl von Delphi Win32 als auch von Net(C#/Chrome) aufrufen
bzw. erzeugen.
Win32 und Net kann somit beinahe beliebig kombiniert werden.

Mit Gruß
Peter

Luckie 17. Sep 2007 12:57

Re: Hydra 3.0 Plugin
 
Hallo hanspeter,
hast du auch schon herausgefunden, wie das Plugin Methoden der Hostanwendunmg aufrufen kann?

hanspeter 17. Sep 2007 13:49

Re: Hydra 3.0 Plugin
 
Zitat:

Zitat von Luckie
Hallo hanspeter,
hast du auch schon herausgefunden, wie das Plugin Methoden der Hostanwendunmg aufrufen kann?

Ja klar.
Definiere in Plugin und Host ein Interface und dann z.B. im Plugin (Host as ICanClosePlugin).CloseMe(GetInstanceID);
Beispiel in "SelfClose".
Eine einfache Message kann direkt gesendet werden.

Host.SendMessage(Self, 1, PChar(aMessage));

Die Hostkomponente hat ein Ereignis für den Empfang des Ereignisses.
Praktisch ist es so, das man ein beliebiges Interface declarieren kann. Es können alle Datentypen verwendet werden, die
auch in Comobjecten möglich sind.
Das Interface auf Host und Pluginseite eingebunden und es muss nur noch der zugehörige Zeiger gecastet werden.

Host as MeinInterface , Plugin as MeinInterface.

Gruß
Peter

Luckie 17. Sep 2007 14:16

Re: Hydra 3.0 Plugin
 
Das ging mir jetzt etwas schnell. Könntest du das Vorgehen noch mal etwas detaillierter beschreiben?

Aber ich habe noch Probleme mit deinem obigen Code. Ich habe jetzt ein Interface deklariert:
Delphi-Quellcode:
unit PluginInterface;

interface

uses
  uHYIntf;

type
  IPluginInterface = interface(IHYVisualPlugin)
    ['{D728C6B3-837B-4D40-AE99-A8FBD71D7CE8}']
    function GetVersion: String;
  end;

implementation

end.
Und dieses in meinen Plugin.dll Code eingebunden:
Delphi-Quellcode:
type
  THydraVisualPlugin = class(THYVisualPlugin, IPluginInterface)
    Label1: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
  protected
  public
    function GetVersion: String;
  end;
Implementation:
Delphi-Quellcode:
function THydraVisualPlugin.GetVersion: String;
begin
  Result := '1.0';
end;
Aber in der Host-Anwendung muss ich jetzt das machen, um auf die Interfacemethode des Plugins zu zugreifen:
Delphi-Quellcode:
procedure TMainForm.btnLoadPlgClick(Sender: TObject);
begin
  with HYModuleManager1 do
  begin
    LoadModule(ExtractFilepath(ParamStr(0)) + 'HydraPluginLib.dll');
    CreateVisualPlugin('HydraVisualPlugin', FPluginForm);
    FPluginForm.ShowParented(pnlPluginArea);
    // FPlugin := FPluginForm as IPluginInterface; // löst AV aus beim Schliessen der Anwendung;
  end;
end;

procedure TMainForm.Button1Click(Sender: TObject);
begin
  // ShowMessage(FPlugin.GetVersion); // geht nicht, GetVersion unbekannt. FPlugin als IHYVisualPlugin deklariert
  ShowMessage((FPluginForm as IPluginInterface).GetVersion);
end;

hanspeter 17. Sep 2007 15:05

Re: Hydra 3.0 Plugin
 
Ich habe es mal schnell in ein bestehendes Projekt eingebunden und habe kein Problem.

1. Das Interface

Delphi-Quellcode:
 
type

  IListBoxInterface = interface
      ['{2993CFD4-EC29-42C2-BB49-707C9A254B4F}']
   procedure SetEditField(Parent: TWinControl;Edit: TEdit);
   function GetVersion: String;
  end;

implementation

end.
2. Das Plugin

Delphi-Quellcode:
type
  TMyListBoxPlugin = class(THYVisualPlugin, IListBoxInterface)
    Edit1: TEdit;
    ListBox1: TListBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
  protected
  public
    procedure SetEditField(Parent: TWinControl;Edit: TEdit);
    function Getversion: string;
  end;
Die Funktion selber:

Delphi-Quellcode:
function TMyListBoxPlugin.Getversion: string;
begin
  result := '1.0';
end;

Und der Aufruf im Host

Delphi-Quellcode:
 

var
  FListIfForm : IListBoxInterface;

with ModuleManager do begin
    // Loads the module
    LoadModule('VisualModule.dll');
    CreateVisualPlugin('MyListBoxPlugin', fListForm);
    FListIfForm := fListForm as IListBoxInterface;
    fListForm.ShowParented(Panel1);
Der Aufruf : Edit2.Text := FListIfForm.GetVersion;


Das entsorgen:

Delphi-Quellcode:
 
  FListIfForm := nil;  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
  ModuleManager.ReleaseInstance(fListForm);
  // Unloads the module
  ModuleManager.UnloadModules;
Der Fehler kommt, weil das Interface (eigene Referenzzählung) getrennt entsorgt werden muss.
Also den Referenzzeiger auf nil setzen und dann erst den Rest entsorgen.

Gruß Peter


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:03 Uhr.
Seite 1 von 2  1 2      

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