![]() |
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:
Gruß Peter
Also Plugin:
TMeineClass = Class procedure Machewas; end; Im Host: ???.MacheWas; |
Re: Hydra 3.0 Plugin
An der Stelle würde ich eher an
![]() |
Re: Hydra 3.0 Plugin
Hast du schon mal versucht unter Datei->Neu eine passende Hydraklasse zu finden ?
|
Re: Hydra 3.0 Plugin
Hallo Hanspeter,
bei Hydra kannst du Host/Plugin-Kommunikation über Interfaces regeln, siehe auch Beispielprogramme. guck doch mal ![]() Grüße Luwo |
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 |
Re: Hydra 3.0 Plugin
Zitat:
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:
Dieses Interface in dem Plugin einbinden.
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; Dazu die Definitionszeile anpassen:
Delphi-Quellcode:
Das Plugin mit den eigenen Methoden erweitern.
type
{ TNonVisualPlugin } TNonVisualPlugin = class(THYNonVisualPlugin, IAnwenderDat) 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:
Das wars.
with ModuleManager do begin
LoadModule('NonVisualModule.dll'); CreateInstance('MyFirstNonVisualPlugin', intfinstance); // See the initialization part of the unit fVisualPlugin.pas fNonVisualPlugin := intfinstance as IAnwenderDat;//IHYNonVisualPlugin; Mit fNonVisualPlugin. ereiche ich alle eigenen Routinen und mit
Delphi-Quellcode:
werde ich das Plugin wieder los.
ModuleManager.ReleaseInstance(fNonVisualPlugin);
ModuleManager.UnloadModule(0); 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 |
Re: Hydra 3.0 Plugin
Hallo hanspeter,
hast du auch schon herausgefunden, wie das Plugin Methoden der Hostanwendunmg aufrufen kann? |
Re: Hydra 3.0 Plugin
Zitat:
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 |
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:
Und dieses in meinen Plugin.dll Code eingebunden:
unit PluginInterface;
interface uses uHYIntf; type IPluginInterface = interface(IHYVisualPlugin) ['{D728C6B3-837B-4D40-AE99-A8FBD71D7CE8}'] function GetVersion: String; end; implementation end.
Delphi-Quellcode:
Implementation:
type
THydraVisualPlugin = class(THYVisualPlugin, IPluginInterface) Label1: TLabel; Button1: TButton; procedure Button1Click(Sender: TObject); private protected public function GetVersion: String; end;
Delphi-Quellcode:
Aber in der Host-Anwendung muss ich jetzt das machen, um auf die Interfacemethode des Plugins zu zugreifen:
function THydraVisualPlugin.GetVersion: String;
begin Result := '1.0'; end;
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; |
Re: Hydra 3.0 Plugin
Ich habe es mal schnell in ein bestehendes Projekt eingebunden und habe kein Problem.
1. Das Interface
Delphi-Quellcode:
2. Das Plugintype IListBoxInterface = interface ['{2993CFD4-EC29-42C2-BB49-707C9A254B4F}'] procedure SetEditField(Parent: TWinControl;Edit: TEdit); function GetVersion: String; end; implementation end.
Delphi-Quellcode:
Die Funktion selber:
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;
Delphi-Quellcode:
function TMyListBoxPlugin.Getversion: string;
begin result := '1.0'; end; Und der Aufruf im Host
Delphi-Quellcode:
Der Aufruf : Edit2.Text := FListIfForm.GetVersion;var FListIfForm : IListBoxInterface; with ModuleManager do begin // Loads the module LoadModule('VisualModule.dll'); CreateVisualPlugin('MyListBoxPlugin', fListForm); FListIfForm := fListForm as IListBoxInterface; fListForm.ShowParented(Panel1); Das entsorgen:
Delphi-Quellcode:
Der Fehler kommt, weil das Interface (eigene Referenzzählung) getrennt entsorgt werden muss.FListIfForm := nil; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ModuleManager.ReleaseInstance(fListForm); // Unloads the module ModuleManager.UnloadModules; Also den Referenzzeiger auf nil setzen und dann erst den Rest entsorgen. Gruß Peter |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:56 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