Einzelnen Beitrag anzeigen

delpasfan

Registriert seit: 25. Feb 2009
2 Beiträge
 
Delphi 2005 Personal
 
#1

Events einer VCL-Komponente non-vcl verwenden

  Alt 26. Feb 2009, 10:14
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 ...
  Mit Zitat antworten Zitat