Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Asignar un evento a un componente creado en tiempo de ejecucion (https://www.clubdelphi.com/foros/showthread.php?t=86662)

FGarcia 12-09-2014 18:57:50

Asignar un evento a un componente creado en tiempo de ejecucion
 
Espero me puedan ayudar en este pequeño problema :p

Estoy haciendo pruebas con un component llamado nrComm que es un componente para capturar datos seriales. Funciona Ok sin embargo no puedo usarlo en un modulo de datos solo en un form así que he decido crearlo en tiempo de ejecución dentro de un DataModule.

Declaro en la unit del datamodule:

Código Delphi [-]
unit UdmNrComm;

interface

uses
  System.SysUtils, System.Classes, nrclasses, nrcomm;

type
  TdmNrComm = class(TDataModule)
    procedure DataModuleCreate(Sender: TObject);
    procedure OnAfterReceive(Com: TObject; Buffer: Pointer;
      Received: Cardinal);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  dmNrComm: TdmNrComm;
  ComPort: TnrComm;

implementation

uses
  UfrmStart;

{%CLASSGROUP 'System.Classes.TPersistent'}

{$R *.dfm}

Creo el componente

Código Delphi [-]
procedure TdmNrComm.DataModuleCreate(Sender: TObject);
begin
  ComPort := TnrComm.Create(nil);
  ComPort.BaudRate := 9600;
  ComPort.ComPortNo := 6;
  ComPort.Parity := pNone;
  ComPort.StopBits := sbOne;
  ComPort.ByteSize := 8;
  ComPort.EnumPorts := epFullPresent;
  ComPort.BufferInSize := 8000;
  ComPort.BufferOutSize := 8000;
  ComPort.StreamProtocol := spNone;
  ComPort.OnAfterReceive := OnAfterReceive;
  ComPort.Active := True;

end;

Trato de usar el procedimiento

Código Delphi [-]
procedure TdmNrComm.ComPortAfterReceive(Com: TObject; Buffer: Pointer;
  Received: Cardinal);
var i:integer;
    ch:AnsiChar;
begin
  //LO QUE TENGA QUE HACER

end;

Recibo un aviso:

Cita:

'TdmNrComm' does not contain a member named 'ComPortAfterReceive' at line 34(34:21)
Pienso que es una tontería pero no le encuentro.. :'(

Agradezco como siempre su atención!!

ecfisa 12-09-2014 20:35:36

Hola Fidel.

No veo nada malo en tu codigo...

Ciertamente no tengo el componente TnrComm ni conozco el funcionamiento, pero para salir de toda duda hice una prueba con un control estándar (TEdit) siguiendo la lógica del código y funciona sin errores.

DataModule:
Código Delphi [-]
uses
  SysUtils, Classes, StdCtrls, Graphics;

type
  TdmNrComm = class(TDataModule)
    procedure DataModuleCreate(Sender: TObject);
     //procedure EditKeyPress(Sender: TObject; var Key: Char); { también probado }
  private
    procedure EditKeyPress(Sender: TObject; var Key: Char);
  public
  end;

var
  dmNrComm: TdmNrComm;
  ComPort: TEdit;
....
procedure TdmNrComm.DataModuleCreate(Sender: TObject);
begin
  Randomize;
  ComPort:= TEdit.Create(Self);
  ComPort.Left:= 10;
  ComPort.Top := 10;
  ComPort.Width:= 300;
  ComPort.Color:= clYellow;
  ComPort.OnKeyPress:= EditKeyPress;
  ComPort.Visible:= True;
end;

procedure TdmNrComm.EditKeyPress(Sender: TObject; var Key: Char);
begin
  if Key <> #8 then
    Key:= UpCase(Char(Random(222)+33));
end;

Unit1:
Código Delphi [-]
...
implementation

uses UdmNrComm;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ComPort.Parent:= Self;
end;
La instancia de TdmNrComm está creada antes que la de TForm1.

Lo único que creo que podría estar provocando el error es el método Active en la línea
Código Delphi [-]
ComPort.Active := True;
haciendo alguna actividad no tolerada desde un TDataModule... ¿ Intentaste ejecutarlo con esa línea comentada ?

Saludos :)

roman 12-09-2014 20:51:25

En Google hay varis referencias a este tipo de avisos, indicando que es un bug que concierne a Error Insight. Sólo que yo no sé qué es eso pues mi delphi 7 no lo tiene. Pero que pruebes desactivándolo.

// Saludos

FGarcia 12-09-2014 21:33:15

Bueno siguiendo tu ejemplo cambie algunas cositas y funciono!! :)

en la declaracion del procedimiento:

Código Delphi [-]
 
procedure OnAfterReceive(Com: TObject; Buffer: Pointer;
      Received: Cardinal);

// quedo asi: elimine el ON

procedure AfterReceive(Com: TObject; Buffer: Pointer;
      Received: Cardinal);

En la creacion del componente tambien elimine el ON

Código Delphi [-]
ComPort.OnAfterReceive := AfterReceive;

y en la implementacion del evento (procedimiento) elimine el comport de AfterReceive

Código Delphi [-]
procedure TdmNrComm.AfterReceive(Com: TObject; Buffer: Pointer;
  Received: Cardinal);
var i:integer;
    ch:AnsiChar;
begin
  //LO QUE TENGA QUE HACER

end;

Probe y todo funciona ok!!

Sin embargo aqui surge otra duda ¿que pasa si creo mas de un componente del mismo tipo? ¿como le asigno el procedimiento en forma individual a cada uno? En esta primera prueba le he asignado el procedure AfterReceive pero no he pasado ningun parametro ¿¿?? :confused:

¿Alguna sugerencia? me gusta complicarme la vida

roman 12-09-2014 21:54:14

Cita:

Empezado por FGarcia (Mensaje 481345)
y en la implementacion del evento (procedimiento) elimine el comport de AfterReceive

A todos se nos pasó :eek:

Éste es el único cambio necesario. En la declaración lo llamabas OnAfterReceive y en la implementación lo llamabas ComPortAfterReceive.

// Saludos

ecfisa 12-09-2014 22:22:53

Hola de nuevo.

Claro...

Estabas declarando:
Código Delphi [-]
type
  TdmNrComm = ...
   procedure OnAfterReceive(Com: TObject; Buffer: Pointer; Received: Cardinal);
...

Y luego definiendo:
Código Delphi [-]
procedure TdmNrComm.ComPortAfterReceive(Com: TObject; Buffer: Pointer; Received: Cardinal);
...

Presté atención en mi código, pero juro que se me escapó leyendo el tuyo, disculpas :o

Saludos :)

FGarcia 12-09-2014 23:05:40

Disculpas nada!!

Esa afrenta solo se puede lavar con una ronda de Virtual Beer en la Taberna y aprovechando que es viernes........:D:D

ecfisa 12-09-2014 23:27:35

Vamos para allá que yo invito entonces... :)


La franja horaria es GMT +2. Ahora son las 07:23:29.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi