Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-09-2014
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
Asignar un evento a un componente creado en tiempo de ejecucion

Espero me puedan ayudar en este pequeño problema

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!!
__________________
ESTO ES UN FORO ... NO UN MÓVIL
¿Por qué no escribir de una manera comprensible para que los humanos lo podamos entender?
Responder Con Cita
  #2  
Antiguo 12-09-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 12-09-2014
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #4  
Antiguo 12-09-2014
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
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 ¿¿??

¿Alguna sugerencia? me gusta complicarme la vida
__________________
ESTO ES UN FORO ... NO UN MÓVIL
¿Por qué no escribir de una manera comprensible para que los humanos lo podamos entender?
Responder Con Cita
  #5  
Antiguo 12-09-2014
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por FGarcia Ver Mensaje
y en la implementacion del evento (procedimiento) elimine el comport de AfterReceive
A todos se nos pasó

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

// Saludos
Responder Con Cita
  #6  
Antiguo 12-09-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 12-09-2014
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
Disculpas nada!!

Esa afrenta solo se puede lavar con una ronda de Virtual Beer en la Taberna y aprovechando que es viernes........
__________________
ESTO ES UN FORO ... NO UN MÓVIL
¿Por qué no escribir de una manera comprensible para que los humanos lo podamos entender?
Responder Con Cita
  #8  
Antiguo 12-09-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Vamos para allá que yo invito entonces...
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Evento en BitBtn creado en tiempo de ejecución newtron OOP 2 10-05-2012 16:54:14
Asignar a tbitbtn evento en tiempo de ejecucion richy08 OOP 9 09-08-2011 18:15:23
Crear evento a un componente creado en ejecución enecumene OOP 32 10-10-2008 19:01:29
Asignar evento OnDrawColumnCell en tiempo de ejecución gluglu OOP 6 01-06-2007 13:14:58
Asignar evento Oncalcfield en tiempo de ejecucion el_barto Conexión con bases de datos 5 06-09-2005 00:08:46


La franja horaria es GMT +2. Ahora son las 11:48:43.


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
Copyright 1996-2007 Club Delphi