Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Events einer VCL-Komponente non-vcl verwenden (https://www.delphipraxis.net/129824-events-einer-vcl-komponente-non-vcl-verwenden.html)

delpasfan 26. Feb 2009 10:14


Events einer VCL-Komponente non-vcl verwenden
 
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

himitsu 26. Feb 2009 10:30

Re: Events einer VCL-Komponente non-vcl verwenden
 
Du mußt deine Ereignisfunktion in einem Objekt ablegen.

Also Diese in einer Klasse definiert haben.

Delphi-Quellcode:
type irgendas = class(...)
  procedure SPortRxClusterEvent(Sender: TObject);
end;
PS: setze deine Delphicodes bitte in [delphi]-Tags (du kannst dieses über den Edit-Button deines Beitrags noch ändern)

delpasfan 27. Feb 2009 12:46

Re: Events einer VCL-Komponente non-vcl verwenden
 
Danke für den schnellen Tip, hat funktioniert. Ich hab's erstmal in meiner Testumgebung (VCL) ausprobiert, aber außerhalb der Form. Vielleicht für andere wichtig: die Klasse wird deklariert und einem Variablennamen zugewiesen, aber es wird kein Create ausgeführt (das macht nur einen Laufzeitfehler)

PS. sorry, hatte gestern Stress und bin nicht zum Editieren gekommen, heute war's zu spät dafür.
http://www.delphipraxis.net/posting.php?mode=iframe


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:28 Uhr.

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