Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Flexibles Pluginsystem: Diskussion (https://www.delphipraxis.net/74448-flexibles-pluginsystem-diskussion.html)

gsh 5. Aug 2006 00:22

Re: Flexibles Pluginsystem: Diskussion
 
so ich hab nochmal wegen dem Observer nachgedacht und mir ist dann ein super konzept eingefallen :mrgreen:
hab heut den ganzen Tag an diesem System programmiert.

Nun ist es ein Flexibles Observer Pluginsystem :cheers:

Die Flexiblität des Pluginsystems ist erhalten geblieben. Nur muss das Plugin beim starten der Anwendung bei meinem Observer anmelden. Sobald einmal angemeldet wird das Plugin bei diesem Ereignis benachrichtigt und kann sofort darauf reagieren.


*auf Uhr schau* (1:20 Uhr) Ich bin jetzt aber viel zu müde um ein Tutorial darüber zu schreiben, denn das ganze ist hoch komplex und wird wahrscheinlich nicht leicht zum erklären sein. Vielleicht komm ich morgen oder übermorgen dazu.

Angel4585 11. Apr 2007 11:23

Re: Flexibles Pluginsystem: Diskussion
 
Kann man eigentlich auch Plugins in einer anderen Sprache programmieren?

Also das das Programm in Delphi ist, das Plugin aber beispielsweise C++ oder so?

Ich weis dass es Records nur unter Delphi gibt(oder? :gruebel: )
Aber wenn man etwas anderes verwendet was andere Sprachen auch können müsste es doch gehen oder?

gsh 11. Apr 2007 14:44

Re: Flexibles Pluginsystem: Diskussion
 
sicher kann man das

und man kann auch records benutzen
weil records ist ja nichts delphi spezielles (außer der name) sonderen nur eine datenttyp wo mehere variablen nacheinander reingestopft werden.
In C++ und so gibt es des imho auch nur weiß ich gerade nicht wie es heißt

DGL-luke 11. Apr 2007 14:48

Re: Flexibles Pluginsystem: Diskussion
 
... records gibt es auch in C, die heißen da nur structs. und sind je nach cmopiler eventuell anders aligned, weshalb man in delphi packed records verwenden sollte.

Angel4585 11. Apr 2007 14:54

Re: Flexibles Pluginsystem: Diskussion
 
also wenn ich packed records verwende kann ih ohne größere Probleme die Plugins in anderen Sprachen schreiben?

Ihr sagt in C da heissen die Structs, C++, wo noch? Gibts da irgendwo Informationsquellen dafür?

gsh 11. Apr 2007 14:56

Re: Flexibles Pluginsystem: Diskussion
 
Mir ist gerade eingefallen des ich des selber mal in der DP gefragt hab: Klick Mich

Chaosente 2. Okt 2007 13:47

Re: Flexibles Pluginsystem: Diskussion
 
Wie sieht es denn aus mit dem Flexiblen Observer Pluginsystem Tutorial? Würde mich scon interessieren, da ich da im moment auch dran arbeite sowas zu machen. Wär cool, wenn du das noch mal machen könntest gsh...

gsh 2. Okt 2007 18:29

Re: Flexibles Pluginsystem: Diskussion
 
hmm jojo wenn ich dazu zeit hätte, aber da ich zur zeit 3,5 Jobs habe bin ich ehrlich gesagt zu erschöpft um mich da dran zu setzen
aber mal schaun wollt mir jetzt eh mal wieder urlaub gönnen :mrgreen:

LH_Freak 5. Nov 2007 16:50

Re: Flexibles Pluginsystem: Diskussion
 
heyho, also ich hab mich jetzt auch mal an ein Pluginsystem gesetzt...im Grunde ist das ne Mischung aus dem Tutorial von sakura und deiner Idee (denk ich zumindest oO ^^) also es ist auf jedenfall nichts besonderes denk ich...
es gibt eine Klasse TPlugin, von dem man seine Plugins ableiten kann...jedes Plugin enthält den Befehl Execute dem man dann die Parameter übergeben kann...dann gibts noch die Callbackprozedur Send, mit der dann Werte zurückgegeben werden können...sprich ich übergeb z.B. einem Downloadplugin den Befehl CMD_DOWNLOAD (einfach Konstanten) und dazu dann die Parameter als array of string, und in der DLL wird der Command ausgewertet, verarbeitet, und mit Send werden dann wieder Daten zurückgegeben, z.B. die Fortschrittsanzeige...in der Anwendung sieht dass dann z.B. so aus

Delphi-Quellcode:
uses {...} PluginDefinition;

var plugin1: TPlugin;

procedure RecieveProc(cmd: integer; parameter: array of string);
begin
  case cmd of
  // hier werden dann die commands ausgewertet
  CMD_SHOWMESSAGE: showmessage(parameter[0]);
  end;
end;

{...}

procedure TForm1.FormCreate(Sender: TObject);
var
  name: string;
begin
  plugin1 := TPlugin.Create;
  loadplugin('plugins/plugin.dll', plugin1);
  plugin1.Send := RecieveProc;

  plugin1.Execute(CMD_GET_NAME,['']); // nur ein Beispiel ;-)
end;
Die PluginDefinition.pas enthält alle Klassen und die FUnktion zum Laden des Plugins, sprich man braucht außer dieser Unit und der RecieveProc Prozedur nichts...in der DLL nimmt man ebenfalls die plugindefinition.pas, und erstellt sich eine Klasse...z.B.

Delphi-Quellcode:
{...}

TPlugin01 = class(TPlugin)
  public
    constructor Create(aParent: THandle); overload;
    function GetName: string; override; stdcall;
    function GetAuthor: string; override; stdcall;
    function GetComment: string; override; stdcall;
    procedure Execute(cmd: integer; parameter: string); override; stdcall;
  end;

constructor TPLugin01.Create(aParent: Cardinal);
begin
  inherited Create;
  Parent := aParent;
end;

function TPlugin01.GetName: string;
begin
  result := 'Testplugin';
  //showmessage('Testplugin');
end;

function TPlugin01.GetAuthor;
begin
  result := 'LH_Freak';
end;

function TPlugin01.GetComment;
begin
  result := 'Nur ein Test';
end;

procedure TPlugin01.Execute(cmd: Integer; parameter: string);
begin
  case cmd of
  CMD_GET_NAME: send(CMD_SHOWMESSAGE, ['Testplugin']);
  end;
end;

function LoadPlugin(Parent: THandle; var PlugIn: TPlugIn): Boolean; export;
begin
  try
    PlugIn := TPlugIn01.Create(Parent);
    Result := True;
  except
    Result := False;
  end;
end;

exports
  LoadPlugin name 'LoadPlugin';

begin
  //MessageBeep(0);
end.
Das mag jetzt zwar nicht soooo besonders anspruchsvoll und schwierig sein, und über Interfaces könnte man denk ich mal da schon bessere Sachen machen, aber es erfüllt seinen Zweck Prima...man definiert sich einfach seine Konstanten, und kann sich damit dann doch auch eine ganz flexible API erstellen...
Bei Bedarf kann ich die PluginDefinition.pas ja mal hier veröffentlichen :)

Gruß
Flo

P.S.: Ich werde das ganze demnächst in den MUH Messenger einbauen, da mich das schon irgendwie reizt auszuprobieren was damit alles geht, und das eignet sich ja mal wohl perfekt ;-)

Kedariodakon 5. Nov 2007 17:05

Re: Flexibles Pluginsystem: Diskussion
 
Für Plugins empfehlen sich Interfaces, gerade dann, wenn man auch Sprachenunabhängig arbeiten will (C, Delphi...)

Oder Packages, wenn man bei Delphi bleibt...

Denn mit sowas da
Delphi-Quellcode:
function LoadPlugin(Parent: THandle; var PlugIn: TPlugIn): Boolean; export;
begin
  try
    PlugIn := TPlugIn01.Create(Parent);
    Result := True;
  except
    Result := False;
  end;
end;
in dlls, kommt man sehr sehr schnell ans Limit der flexibilität...


Bye Christian


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:31 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