Delphi7 Plugin Tutorial
aus dem DMXControl-Wiki
Inhaltsverzeichnis |
1 Delphi7 Plugin Tutorial
Dieses Tutorial soll zeigen, wie man mit Borland Delphi ein DMXControl-Plugin zusammenschraubt und es in DMXC nutzt. Derzeit beschränkt sich das ganze auf die Rumpfstruktur der DLL, aber es wird daran gearbeitet...
1.1 Vorbereiten des DLL-Skeletts
Delphi bietet Funktionen für das einfache Einbetten von ActiveX-Klassen, wie DMXC sie uns anbietet, allerdings wollen die auch erst mal gefunden und bedient werden.
Anhand der folgenden Top18-Liste kann das Skelett einfach generiert werden:
(Diesen ersten Punkt nur durchführen, wenn die DMXC-Typ-Bibliothek noch nie geladen wurde…)
- 1. Projekt -> Typbibliothek importieren…
> DMXControl Public Types Library (Version 1.0) auswählen
> „[ ] Komponenten-Wrapper generieren“ deaktivieren
> Unit anlegen
- 2. Datei -> Neu -> Weitere -> ActiveX -> ActiveX-Bibliothek
- 3. Datei -> Projekt speichern unter… (z.B. DMXC_DelphiDemoPlugin.dpr)
Wer will kann nun das Ausgabeverzeichnis modifizieren, sodass die dll immer im Plugin-Verzeichnis von DMXC kompiliert wird: (Projekt -> Optionen… -> Verzeichnisse/Bedingungen -> Ausgabeverzeichnis „c:\programme\DMXControl\plugins“ wählen)
- 5. Datei -> Neu Weitere… -> ActiveX -> Automatisierungsobjekt -> CoClass z.B. „clsDMXCPlugin“ nennen und bestätigen
- 6. Zweiten Punkt mit Namen „IclsDMXCPlugin“ auswählen.
- 7. „Nur Lesen“ Eigenschaft hinzufügen und „PluginName“ nennen. Als Typ „BSTR“ einstellen
- 8. Obersten Punkt „DMXC_Demoplugin“ auswählen und Registerkarte „Verwendet“ öffnen
- 9. „Borland standard VCL Type Library“ deaktivieren und Meldung mit JA bestätigen
- 10. Rechte Maustaste und „Alle Typbibliotheken anzeigen“ auswählen -> „DMXControl Public Types Library 1.0“ aktivieren
- 11. Unterstes Objekt „clsDMXCPlugin“ auswählen und Registerkarte Implementierung auswählen
- 12. Rechte Maustaste und „Interface einfügen“ und _IDMXCModule, _IDMXCPlugin und _IPluginHelper hinzufügen
- 13. Oben auf das linke kleine grüne Aktualisierungssymbol (Implementierung aktualisieren) klicken. Es sollten nun etliche Codezeilen eingefügt werden.
- 13. STRG+S und neue TypeLibrary speichern
- 14. Die geöffnete Registerkarte „Unit1“ wählen und diese Unit z.B. als main.pas speichern
- 16. in der neuen main.pas nun in der Uses-Klausel diesen Eintrag hinzufügen: „DMXCTypeLib_TLB“
- 17. Nun in dieser main.pas nach der Funktion „Get_PluginName“ suchen und sie so anpassen:
function TclsDMXCPlugin.Get_PluginName: WideString; begin Result:='DMXC Delphi-Demoplugin'; end;
- 18. nun sollte sich das Plugin kompilieren lassen und auch korrekt mit Namen in DMXControl angezeigt werden.
Tipps: Fügt man nun in die Uses-Klausel der main.pas die Delphi-Unit „Dialogs“, so kann man mit dem simplen Befehl
ShowMessage(‚Hello World’);
das Plugin bereits eine Mitteilung ausgeben lassen und somit die einzelnen Funktionen testen.
- 19. Standardwerte des Plugins eingeben (Hinzufügen von Messages funktioniert noch nicht!)
function TclsDMXCPlugin.Get_ModuleInfo: _Type_Module_Info;
var
IDMXCModule_ModuleInfo:_Type_Module_Info;
Message1:OleVariant;
begin
IDMXCModule_ModuleInfo:=CoType_Module_Info.Create;
with IDMXCModule_ModuleInfo do
begin
GUID:='{A6B705AC-3730-472F-8991-4B16EF39576B}';
Name:='PDA Remote';
Description:='Ermöglicht Empfangen von Kanalwerten von einem PDA';
Author:='Christian Nöding';
Experimental:=True;
// ProvidesToolWindow:=True;
// Category:=CAT_Control;
// FormName:='Form1';
// Frm:=IDispatch(TForm1); // Hier gibt es noch massive Probleme beim Übergeben der Form-ID
ProvidesCommand:=False;
ProvidesSceneType:=False;
UsesProvidedOutput:=True;
UsesMessaging:=False;
Message1:=MSG_Channel_Send;
// Messages.Add(Message1,Message1,Message1,Message1); // auch das Hinzufügen von Messages klappt noch nicht
end;
Result:=IDMXCModule_ModuleInfo as Type_Module_Info;
end;
Leider funktioniert das Übergeben des Forms derzeit noch nicht. Das liegt offensichtlich an einer falsch Übergebenen Fenster-ID, bzw. an einer Inkompatibilität zwischen VB6 und Delphi. Hier ist noch Arbeit :)
1.2 Setzen von Werten in DMXC
Zum Setzen von Kanalwerten in DMXControl bedienen wir uns des PluginHelpers. Dazu muss zunächst eine Variable unter "public" der Main-Funktion deklariert werden:
mHelper:IPluginHelper;
Um der neuen Variable "mHelper" nun auch noch eine Verbindung zu DMXC zu geben, wird diese Variable mit einem Wert beim Initialisieren des Plugins verorgt:
function TclsDMXCPlugin.Init(var CallingAppTitle, MyFilename: WideString; var DMXCPluginHelper: _IPluginHelper): WordBool; begin mHelper:=DMXCPluginHelper; Result:=True; end;
Nun kann man über den Pluginhelper allerlei Dinge tun. Darunter auch eben das Setzen eines Kanalwertes. Dabei ist wichtig, dass man der Funktion SetChannel unverständlicherweise keine Konstanten, sondern nur Variablen übergeben kann. Es müssen somit zunächst die Werte in eine Variable gespeichert werden, bevor sie übergeben werden können:
channel:=1; value:=50; ignore:=true; mHelper.myStream.SetChannel(channel,value,ignore);
Ebenso kann man den aktuellen Kanalwert direkt abfragen (auch wieder nur über Variablen!):
channel:=1; value:=mHelper.ChannelGetValue(channel);
Hierbei gelten "value" und "channel" jeweils immer als Integer-Variable.
1.3 Empfangen von Werten aus DMXC
Das Empfangen von Kanalwerten aus DMXControl gestaltet sich eigentlich(!) recht einfach. Hierzu muss lediglich eine Message abgefangen werden. Der aktuelle Kanal wird dabei als Arg1 und der zugehörige Wert als Arg2 übergeben:
function TclsDMXCPlugin.MessageHandle(var Msg: MSGs; var Arg1,
Arg2: Integer): Integer;
begin
case Msg of
MSG_Channel_Send: ShowMessage('Kanal '+inttostr(Arg1)+' gesetzt auf '+inttostr(Arg2)+'%');
end;
end;
Da das Hinzufügen der Messages noch nicht klappt, muss das Empfangen von Werten weiterhin über den PluginHelper und die Funktion mHelper.ChannelGetValue() gemacht werden.
1.4 Demoplugin downloaden
Damit man gleich einen einfacheren Einstieg bekommt, habe ich mal das von mir entwickelte Plugin für die PDAs als Quellcode hinzugefügt:
PDA-Remoteplugin inkl. Sourcecode
1.5 Feddisch
Wenn jetzt noch das Einbinden der Messages in das Delphiplugin gelingt, sowie das Anzeigen von Forms über den DMXC Aufruf klappt, dann kann mit Delphi7 die komplette Funktionsvielfalt von DMXControl genutzt werden. Bereits jetzt ist das Programmieren von vielfältigen Plugins möglich, da Auslesen und Setzen von Kanalwerten nun vollständig unterstützt wird.
Viel Spaß wünscht Christian Nöding :)
