Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi event in dll! Abfrage in Main? (https://www.delphipraxis.net/106459-event-dll-abfrage-main.html)

hum 11. Jan 2008 06:56


event in dll! Abfrage in Main?
 
Hallo

Wir verwenden vorgefertigte Funktionen (von APRO) für eine RS232 Kommunikation. Die APRO
Komponenten stellen Funktionen zu Verfügung wie init_com_port(), send_string_via_rs232 und
get_string_via_rs232. Das Problem liegt im Moment bei der get_string Funktion. Man kann
einen Endstring definieren sobald dieser Endstring vom Gerät geschickt wird meldet sich die
funktion get-string_via_rs232. Wenn man die Komponenten direkt in der Main Form verwendet ohne
dll dann erkennt die Main Form den Event und meldet selbständig "string detektiert". Sobald
wir aber die Funktionen in einer dll verwenden ist dieser Event nicht sichtbar.

Etwas Code:
Delphi-Quellcode:
library strings_dll;

uses
  SysUtils, AdPacket, AdPort,Dialogs,Windows, Messages, Variants, Classes, Graphics, Controls,
  Forms, StdCtrls;

type
    Tmyclass = class(TObject)
      procedure GetString(Sender: TObject; robotString: String); // Event
    private
    public
end;

var
  x,y:integer;
  datapacket1: TApdDataPacket;
  COM_port1: TApdComPort;
  myarray: array[0..5] of string;
  test2: array[0..5] of PChar;

{$R *.res}
   
procedure Tmyclass.GetString(Sender: TObject; robotString: String);
begin
  showmessage('Endstring detected');
end;

procedure init(); stdcall;
begin
   datapacket1:=TApdDataPacket.Create(nil);   // nill because we dont have a FORM !
   myclass:=Tmyclass.Create;
   COM_port1:=TApdComPort.Create(nil);

   //init COM-port properties & events
    //---------------------------------------------
    COM_port1.Open:=True;
    COM_port1.Baud:=115200;
    COM_port1.CommNotificationLevel:=10;
    COM_port1.DataBits:=8;
    COM_port1.DTR:=True;
    COM_port1.InSize:=4096;
    COM_port1.Logging:=tlOff;
    COM_port1.OutSize:=4096;
    COM_port1.Parity:=pNone;
    COM_port1.StopBits:=1;
    COM_port1.Tracing:=tlOff;

    COM_port1.RTS:=True;
    COM_port1.PromptForPort:=True;
    COM_port1.XOnChar:=#17;
    COM_port1.XOffChar:=#19;
    COM_port1.HWFlowOptions:=[];
    COM_port1.SWFlowOptions:=swfNone;
    COM_port1.Tag:=0;
    COM_port1.AutoOpen:=True;
    COM_port1.BufferFull:=0;
    COM_port1.BufferResume:=0;


    //init all the datapacket properties & events
    //---------------------------------------------

    datapacket1.AutoEnable:=True;
    datapacket1.Enabled:=True;
    datapacket1.StartCond:=scString;
    datapacket1.StartString:='?';  //Works!?
    datapacket1.EndCond:=[ecString];
    datapacket1.EndString:=^M^J;  //LF = ^J = #10
    datapacket1.PacketSize:=100;
    datapacket1.TimeOut:=2184; //ca 2 min
    datapacket1.ComPort:=COM_port1; //userdefined com port
    datapacket1.IncludeStrings:=True;
    datapacket1.OnStringPacket:=myclass.GetString; // does not work ???
   
end;

procedure close_t(); stdcall;
begin
    COM_port1.Free;
    myclass.Free;
    datapacket1.Free;
end;


exports
  init, close_t;

begin
end.
Wie detektiert man ob ein Event stattgefunden hat aus einer dll??

Gruss
hum :cheers:

[edit=SirThornberry]Delphi-Tags gesetzt - nächstes mal bitte selbst machen - Mfg, SirThornberry[/edit]

DP-Maintenance 11. Jan 2008 07:00

DP-Maintenance
 
Dieses Thema wurde von "SirThornberry" von "Sonstige Fragen zu Delphi" nach "Object-Pascal / Delphi-Language" verschoben.

SirThornberry 11. Jan 2008 07:03

Re: event in dll! Abfrage in Main?
 
Wird das ShowMessage nicht ausgelöst in der Dll? Und exakt der gleiche Quelltext funktionert außerhalb einer DLL anders?

Bernhard Geyer 11. Jan 2008 07:18

Re: event in dll! Abfrage in Main?
 
Könnte es sein das AsyncPro *irgendwelche* Fensterhandles benötigt um seine interne Fensterkommunikation zu ermöglichen?

Pack doch Testhalber mal Tmyclass in der DLL auch auf eine Formular welches du anzeigst

hum 11. Jan 2008 10:29

Re: event in dll! Abfrage in Main?
 
Zitat:

Zitat von SirThornberry
Wird das ShowMessage nicht ausgelöst in der Dll? Und exakt der gleiche Quelltext funktionert außerhalb einer DLL anders?

Die ShowMessage wird in der dll nicht ausgeführt. Folgender Quelltext läuft ohne dll fehlerfrei (aber in einer Form Umgebung):
Delphi-Quellcode:
unit RingBufferRW;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, AdPacket, OoMisc, AdPort;


type
  TForm2 = class(TForm)
    procedure Init(Sender: TObject);
  private
    robotString: String;

    datapacket1: TApdDataPacket;
    COM_port1: TApdComPort;

    procedure GetString(Sender: TObject; robotString: String);
  protected
  public
end;

var
Form2: TForm2;

implementation

{$R *.dfm}

//------------------------------------------------------------------------------
procedure TForm2.Init(Sender: TObject);
begin
       // com and datapacket
end;

procedure TForm2.GetString(Sender: TObject; robotString: String);
begin
    showmessage('Ready (CR) received');
end;

end.

Es scheint schon was damit zu tun zu haben ob eine Form exisitert oder nicht.
Besten Dank für weitere Ideen.

Gruss
hum


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