Ir al contenido


Foto

Tratando de crear y usar un Evento (TNotifyEvent)


  • Por favor identifícate para responder
3 respuestas en este tema

#1 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 23 junio 2013 - 04:18

En un modulo de datos llamado dmSerial tengo este codigo:



delphi
  1. type
  2.   TdmSerial = class(TDataModule)
  3.     cpComm1: TComPort;
  4.     cdpCondec: TComDataPacket;
  5.     procedure cdpCondecPacket(Sender: TObject; const Str: string);
  6.     procedure cpComm1AfterClose(Sender: TObject);
  7.     procedure cpComm1AfterOpen(Sender: TObject);
  8.     procedure DataModuleCreate(Sender: TObject);
  9.   private
  10.     { Private declarations }
  11.     FAjustesPuerto: string;
  12.     FOnAbreCierraPuerto:TNotifyEvent;
  13.    
  14.   public
  15.     { Public declarations }
  16.     property AjustesPuerto: string read FAjustesPuerto write FAjustesPuerto;
  17.     property OnAbreCierraPuerto: TNotifyEvent read FOnAbreCierraPuerto write FOnAbreCierraPuerto;
  18.    
  19.   end;

 

Como pueden ver estoy creando un campo llamado FAjustesPuerto y un Evento FOnAbreCierraPuerto.
Tambien estoy creando dos propiedades AjustesPuerto y OnAbreCierraPuerto. 

Después desde un Formulario estoy tratando de usar este evento y propiedades del modulo de datos para mostrar el resultado en el panel 0 del StatusBar, sin embargo no consigo leer nada.
 


delphi
  1.  
  2. procedure TfrmInicial.FormCreate(Sender: TObject);
  3. begin
  4.   dmSerial.OnAbreCierraPuerto := UpdateStatusBar; //Asignamos el evento
  5. end; 
  6.  
  7. procedure TdmSerial.cpComm1AfterClose(Sender: TObject);
  8. begin
  9.   FAjustesPuerto := 'Desconectado';
  10.  
  11.   //Disparamos el evento
  12.   if assigned(FOnAbreCierraPuerto) then
  13.     FOnAbreCierraPuerto(self);
  14. end;
  15.  
  16. procedure TdmSerial.cpComm1AfterOpen(Sender: TObject);
  17. begin
  18.   FAjustesPuerto := cpComm1.Port + ': ' +
  19.                 BaudRatetoStr(cpComm1.BaudRate ) + ',' +
  20.                 DataBitsToStr(cpComm1.DataBits) + ',' +
  21.                 ParityToStr(cpComm1.Parity.Bits ) + ',' +
  22.                 StopBitstoStr(cpComm1.StopBits);
  23.  
  24.   //Disparamos el evento
  25.   if assigned(FOnAbreCierraPuerto) then
  26.     FOnAbreCierraPuerto(self);
  27. end;
  28.  
  29. procedure TfrmInicial.UpdateStatusBar(Sender: TObject);
  30. begin
  31.   statusBar1.Panels[0].Text := dmserial.AjustesPuerto;
  32. end;



Por cierto no me pregunten de donde lei que esto se hacia asi porque no me acuerdo de la referencia  :embarrassed:

¿Alguna sugerencia?

Delphi XE2

  • 0

#2 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 24 junio 2013 - 05:09

Buenas,

La declaración de las propiedades de la clase TdmSerial parece correcta. Lo que no termino de entender es la segunda parte del código que pones, porque has mezclado métodos de dos clases diferentes.

No obstante, si realmente lo tienes bien puesto cada cosa en su sitio, tiene buena pinta. Yo debuguearía el código a ver qué valen las variables y si se cumplen las condiciones,....

Saludos
  • 0

#3 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 24 junio 2013 - 10:23

Lo siento, no me fije que había revuelto el código  :s

Este es el datamodule dmSerial



delphi
  1. type
  2.   TdmSerial = class(TDataModule)
  3.     cpComm1: TComPort;
  4.     cdpCondec: TComDataPacket;
  5.     procedure cdpCondecPacket(Sender: TObject; const Str: string);
  6.     procedure cpComm1AfterClose(Sender: TObject);
  7.     procedure cpComm1AfterOpen(Sender: TObject);
  8.     procedure DataModuleCreate(Sender: TObject);
  9.   private
  10.     { Private declarations }
  11.     FAjustesPuerto: string;
  12.     FOnAbreCierraPuerto:TNotifyEvent;
  13.    
  14.   public
  15.     { Public declarations }
  16.     property AjustesPuerto: string read FAjustesPuerto write FAjustesPuerto;
  17.     property OnAbreCierraPuerto: TNotifyEvent read FOnAbreCierraPuerto write FOnAbreCierraPuerto;
  18.  
  19. procedure TdmSerial.cpComm1AfterClose(Sender: TObject);
  20. begin
  21.   FAjustesPuerto := 'Desconectado';
  22.  
  23.   //Disparamos el evento
  24.   if assigned(FOnAbreCierraPuerto) then
  25.     FOnAbreCierraPuerto(self);
  26. end;
  27.  
  28. procedure TdmSerial.cpComm1AfterOpen(Sender: TObject);
  29. begin
  30.   FAjustesPuerto := cpComm1.Port + ': ' +
  31.                 BaudRatetoStr(cpComm1.BaudRate ) + ',' +
  32.                 DataBitsToStr(cpComm1.DataBits) + ',' +
  33.                 ParityToStr(cpComm1.Parity.Bits ) + ',' +
  34.                 StopBitstoStr(cpComm1.StopBits);
  35.  
  36.   //Disparamos el evento
  37.   if assigned(FOnAbreCierraPuerto) then
  38.     FOnAbreCierraPuerto(self);
  39. end;
  40.    
  41.   end;



Este es el formulario de trabajo



delphi
  1. procedure TfrmInicial.FormCreate(Sender: TObject);
  2. begin
  3.   dmSerial.OnAbreCierraPuerto := UpdateStatusBar; //Asignamos el evento
  4. end; 
  5.  
  6. procedure TfrmInicial.UpdateStatusBar(Sender: TObject);
  7. begin
  8.   statusBar1.Panels[0].Text := dmserial.AjustesPuerto;
  9. end;



Edito:
Resolvi esto cambiando este codigo de FormCreate a FormActivate:



delphi
  1. procedure TfrmInicial.FormActivate(Sender: TObject);
  2. begin
  3.   dmserial.AbrirPuertoSerie;
  4. end;



Esto no lo habia mostrado en los mensajes anteriores.  (b)
  • 0

#4 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 25 junio 2013 - 01:27

Me alegra que lo hayas solucionado :-)
  • 0




IP.Board spam blocked by CleanTalk.