![]() |
Re: PlugIns in eigenen Anwendungen
Ok sorry dachte da du davon anfängst das auch gleich einen Link hast Danke erstmal für alles :)
|
Re: PlugIns in eigenen Anwendungen
Noch mal ne frage ! Kann ich das wirklich nicht in DLL machen? Packges sind doch scheiße !
Kann von mir aus auch ein massiver Aufwand werden. Hauptsache es wird so das es Ordentlich ist und Funktioniert. Wäre Tool wenn es eine Möglichkeit gibt. :( |
Re: PlugIns in eigenen Anwendungen
Es geht schon alles mit dlls zu lösen. Du musst Dir nur mal Gedanken über deine Schnittstellen machen... übergib z.B. keine TFont variable, sondern nur deren Parameter als PChar und Integer...
|
Re: PlugIns in eigenen Anwendungen
Sage mal kann ich nicht eigentlich ne Pointer auf die Adresse übergeben ?
|
Re: PlugIns in eigenen Anwendungen
Ich erstelle in dem Plugin ein Fenster und zeige es mit Show an.
Delphi-Quellcode:
Freigegeben wird das Formular im OnClose-Ereignis des Formulares selber:
procedure TPlugin01.Execute(XMLString: string);
begin inherited; frmTestPlugin01 := TfrmTestPlugin01.Create(nil); frmTestPlugin01.Label1.Caption := 'Testzeichenfolge: ' + XMLString; frmTestPlugin01.Label2.Caption := 'Parenthandle: ' + IntToStr(Self.Parent); frmTestPlugin01.Show; end;
Delphi-Quellcode:
Aber wie kann ich jetzt zum einen die Plugin DLL benachrichtigen dass das Fenster geschlossen wurde und wie kann das Plgin die Hostanwendung benachrichtigen? Wie man Nachrichten an das Plugin schickt wird ja im Tutorial demonstriert, aber wie geht der umgekehrte Weg?
procedure TfrmTestPlugin01.FormClose(Sender: TObject;
var Action: TCloseAction); begin Self.Free; end; |
Re: PlugIns in eigenen Anwendungen
Also ich zeige meine Plugin-Fenster immer modal, dann stellt sich mir diese Frage nicht ;) ... ansonsten müsstest Du onClose die entspr. handles prüfen und diese freigeben.
|
Re: PlugIns in eigenen Anwendungen
Du könntest dem Plugin ein "Kommunikation"-Interface(oder -Klasse) beim Laden übergeben, über das die Kommunikation zur Anwendugn laufen könnte...
mfG mirage228 |
Re: PlugIns in eigenen Anwendungen
Na ja, das erste problem besteht schon darin, wie die dpr-Datei der Plugin-DLL das Schliessen des Fensters mitbekommt. Hier wird es erstellt und angezeigt:
Delphi-Quellcode:
Wenn das Formular geschlossen wird, soll auch die Host-Anwendung darüber benachrichtigt werden und das Plugin entladen.
procedure TPlugin01.Execute(XMLString: string);
begin inherited; frmTestPlugin01 := TfrmTestPlugin01.Create(nil); frmTestPlugin01.Label1.Caption := 'Testzeichenfolge: ' + XMLString; frmTestPlugin01.Label2.Caption := 'Parenthandle: ' + IntToStr(Self.Parent); frmTestPlugin01.Show; end; Ich verwende, wie im Tutorial eine Plugin-Klasse, die der Host-Anwendung und dem Plugin bekannt ist:
Delphi-Quellcode:
type
TEventNotification = (evnClose); TEventAction = (evnContinue, evnAbort); TPlugin = class(TObject) private FParent: THandle; procedure SetParent(const Value: THandle); public constructor Create(aParent: THandle); function GetName: string; virtual; stdcall; abstract; function GetAuthor: string; virtual; stdcall; abstract; function GetComment: string; virtual; stdcall; abstract; function GetCaption: string; virtual; stdcall; abstract; procedure Execute(XMLString: string); virtual; stdcall; abstract; function EventHandler(EventNotification: TEventNotification): TEventAction; virtual; stdcall; abstract; property Parent: THandle read FParent write SetParent; end; TLoadPlugin = function(Parent: THandle; var PlugIn: TPlugIn): Boolean; implementation { TPlugIn } constructor TPlugIn.Create(aParent: THandle); begin inherited Create; FParent := aParent; end; procedure TPlugIn.SetParent(const Value: THandle); begin FParent := Value; end; |
Re: PlugIns in eigenen Anwendungen
Also um das "OnClose"-Event des Forms wirst du erstmal nicht drum herum kommen.
Ich schlage vor: 1.) Im OnClose des Form wird TPlugin über das Schließen benachrichtigt (TPlugin.Notify(Sender: TObject; Action: TMyPluginAction); --> Dazu muss TPlugin irgendwo innerhalb des Plugin-Forms gespeichert werden (nen eigenes Property, im Tag des Forms - wie auch immer!) --> Bei TMyPluginAction kannst Du ja noch weitere Ereignisse reinpacken -- oder du machst statt "Notify" eine "TPlugin.PluginFormClosed(Sender: TObject)"-Methode 2.) Die Anwendung überigbt eine Klasse oder einen Methodenzeiger, den dein TPlugin-Objekt speichert und aufruft, sobald ein Ereignis (siehe oben) eingetreten ist. Wenn ich alles richtig bedacht habe, sollte das so gehen :) mfG mirage228 |
Re: PlugIns in eigenen Anwendungen
Wenn ich die Sourcen zum zweiten Teil mit Delphi 6 kompilieren will, bekomme ich folgende fehlermeldungen:
Code:
Das wären diese Zeilen:
[Fehler] uFormMain.pas(88): Ausdruckstyp muß BOOLEAN sein
[Fehler] uFormMain.pas(94): Ausdruckstyp muß BOOLEAN sein [Fehler] uFormMain.pas(100): Ausdruckstyp muß BOOLEAN sein [Fehler] uFormMain.pas(112): Anweisung erwartet, aber 'PROCEDURE' gefunden [Fehler] uFormMain.pas(39): Ungenügende Forward- oder External-Deklaration: 'TfrmMain.mnuFileCloseClick' [Fehler] uFormMain.pas(43): Ungenügende Forward- oder External-Deklaration: 'TfrmMain.mnuEditCutClick' [Fehler] uFormMain.pas(45): Ungenügende Forward- oder External-Deklaration: 'TfrmMain.mnuEditPasteClick' [Fataler Fehler] ExtendableApp.dpr(10): Verwendete Unit 'uFormMain.pas' kann nicht compiliert werden
Delphi-Quellcode:
Jeweils die zweite if-Bedingung.
procedure TfrmMain.mnuEditCopyClick(Sender: TObject);
begin if CurrentDocument <> nil then if CurrentDocument.mmoDocument.CopyToClipboard; end; procedure TfrmMain.mnuEditCutClick(Sender: TObject); begin if CurrentDocument <> nil then if CurrentDocument.mmoDocument.CutToClipboard; end; procedure TfrmMain.mnuEditPasteClick(Sender: TObject); begin if CurrentDocument <> nil then if CurrentDocument.mmoDocument.PasteFromClipboard; end;
Delphi-Quellcode:
procedure TfrmMain.mnuFileCloseClick(Sender: TObject);
begin if CurrentDocument <> nil then if CurrentDocument.CloseDocument then ShowMessage('yes') else ShowMessage('no'); end; procedure TfrmMain.mnuFileExitClick(Sender: TObject); // <- Zeile 112 begin Close; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:34 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