Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   Delphi PlugIns in eigenen Anwendungen (https://www.delphipraxis.net/4851-plugins-eigenen-anwendungen.html)

nitschchedu 24. Apr 2006 10:43

Re: PlugIns in eigenen Anwendungen
 
Ok sorry dachte da du davon anfängst das auch gleich einen Link hast Danke erstmal für alles :)

nitschchedu 4. Mai 2006 11:07

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. :(

FriFra 4. Mai 2006 11:11

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...

nitschchedu 4. Mai 2006 12:18

Re: PlugIns in eigenen Anwendungen
 
Sage mal kann ich nicht eigentlich ne Pointer auf die Adresse übergeben ?

Luckie 4. Sep 2007 10:33

Re: PlugIns in eigenen Anwendungen
 
Ich erstelle in dem Plugin ein Fenster und zeige es mit Show an.
Delphi-Quellcode:
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;
Freigegeben wird das Formular im OnClose-Ereignis des Formulares selber:
Delphi-Quellcode:
procedure TfrmTestPlugin01.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  Self.Free;
end;
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?

FriFra 4. Sep 2007 10:40

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.

mirage228 4. Sep 2007 12:07

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

Luckie 4. Sep 2007 13:41

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:
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;
Wenn das Formular geschlossen wird, soll auch die Host-Anwendung darüber benachrichtigt werden und das Plugin entladen.

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;

mirage228 4. Sep 2007 13:48

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

Luckie 6. Sep 2007 15:57

Re: PlugIns in eigenen Anwendungen
 
Wenn ich die Sourcen zum zweiten Teil mit Delphi 6 kompilieren will, bekomme ich folgende fehlermeldungen:
Code:
[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
Das wären diese Zeilen:
Delphi-Quellcode:
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;
Jeweils die zweite if-Bedingung.

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 02:36 Uhr.
Seite 3 von 4     123 4      

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