Hallo zusammen
folgendes Problem: Ich habe eine Interface-
DLL für die Verwendung der seriellen Schnittstelle geschrieben, die verschiedenste Zugriffsfunktionen und Methoden anderen Programmen zur Verfügung stellt (in Form von Exports, verwendet u.a. zur Messgerätesteuerung von Excel/VBA aus).
Verwendet wird die
VCL-Komponete SerialNG von Ekkehard Domning (
www.domis.de, an dieser Stelle vielen Dank an den Autor für seine gut durchdachte Komponente). SerialNG funktioniert auch non-
VCL, allerdings wurden bisher keine der Events benutzt, da die Empfangsabfrage vom benutzenden Programm mittels Polling ausreichte. Für eine neue Funktionalität benötige ich aber jetzt einen solchen (Empfangs-)Event, da ich die einzelnen Bytes eines Datenpaketes zusammensammeln muss, bevor ich es auswerten und den eigentlichen Dateninhalt ohne Protokollrahmen zurückgeben kann.
Wenn ich die Komponente in einer Form verwende, ist das kein Problem:
TMainForm = class(TForm)
SPort: TSerialPortNG;
...
procedure SPortRxClusterEvent(Sender: TObject); //das ist die Eventhandler-Methode
end;
implementation
procedure TMainForm.FormCreate(Sender: TObject);
begin
SPort:=TSerialportNG.Create(self);
SPort.onRxClusterEvent := SportRXClusterEvent;
...
end;
//Eventhandler-Methode
procedure TMainform.SPortRxClusterEvent(sendet:TObject;
begin
// Code für das sammeln und auswerten empfangener Bytes
end;
so wie hier funktionier das auch sehr gut. Nur leider habe ich in meiner
DLL keine Form.
wie kann ich den Code schreiben, damit ein Event außerhalb einer Form funktioniert?
Die
DLL geht bisher so:
function InitDll : Integer; //Initialisiert die Port-Komponente(n), Aufruf bevor die
DLL-Methoden verwendet werden können
{es werden mehrere Portkomponenten als Objekt-Array angelegt, um
verschiedene
COM-Ports über eine
DLL ansprechen zu können }
var
ct : integer;
begin
for ct:=1 to 8 do begin
SPA[ct]:=TSerialPortNG.Create(Nil);
SPA[ct].ThreadQuietMode := true;
..
end;
end;
wenn ich versuche, den Eventhandler analog der Verwendung in einer Form zuzuweisen, bekomme ich nur eine Fehlermeldung (Funktionszeiger statt Methodenzeiger)
Hat jemand eine Idee, wie ich das lösen kann? Vermutlich sehe ich nur den Wald vor lauter Bäumen nicht!
http://www.delphipraxis.net/posting.php?mode=iframe
Kaum macht man es richtig, schon funktioniert es ...