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 06-12-2005
Avatar de DarkByte
DarkByte DarkByte is offline
Miembro
 
Registrado: sep 2003
Ubicación: Desconocido
Posts: 1.322
Poder: 22
DarkByte Va por buen camino
Crear eventos para una clase

Buenas tardes.

Estoy intentando crear una especie de evento para una clase que tengo hecha.

Algo así como...

Código Delphi [-]
var
   Socket : TAnibal
begin
  Socket := TAnibal.Create;
  Socket.Ip := '127.0.0.1';
  Socket.Puerto := 60;
  Socket.AlRecibir := Recibir; // ¡Aqui!
  Socket.Conectar;
end;

Se trata de que cuando reciba datos lleve el foco al procedure, con sus comandos y tal... Espero haberme explicado.

Gracias
__________________
:)
Responder Con Cita
  #2  
Antiguo 06-12-2005
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Para definir eventos "personalizados":

Código Delphi [-]
// Evento creado por el usuario:
TMyEvent = procedure(Sender: TObject; var Recibido: Boolean) of object;

TMyClass = class(TObject)
private
  // Campo para guardar la referencia al procedimiento del evento
  FOnMyEvent: TMyEvent;
protegido
  // Método que dispara el evento:
  procedure DoMyEvent(var Recibido: Boolean);
public
  procedure Recibir;
published
  // Evento
  property OnMyEvent: TMyEvent
    read FOnMyEvent
    write FOnMyEvent;
end;

implementation

procedure TMyClass.DoMyEvent(var Recibido: Boolean);
begin
  if Assigned(FOnMyEvent) then
    FOnMyEvent(Self, Recibido)
end;

procedure TMyClass.Recibir;
var
  Recibido: Boolean;

begin
  // Código para recibir...
  DoMyEvent(Recibido);
  if not Recibido then
    raise Exception.Create('No se recibió')
end;

Luego en donde quieras usar tu clase nueva:

Código Delphi [-]
TMyForm = class(TForm)
private
  FMyClass: TMyClass;

  procedure Recibir(Sender: TObject; var Recibido: Boolean);
public
  procedure FormCreate(Sender: TObject);
end;

implementation

procedure TMyForm.FormCreate(Sender: TObject);
begin
  FMyClass := TMyClass.Create;
  FMyClass.OnMyEvent := Recibir;
  // etc, etc, etc...
end;

procedure TMyForm.Recibir(Sender: TObject; var Recibido: Boolean);
begin
  // Haces cualquier cosa y cambias el valor de Recibido
  Recibido := False
end;

Espero que sea esto lo que estabas buscando...



Saludos...
Responder Con Cita
  #3  
Antiguo 06-12-2005
Avatar de DarkByte
DarkByte DarkByte is offline
Miembro
 
Registrado: sep 2003
Ubicación: Desconocido
Posts: 1.322
Poder: 22
DarkByte Va por buen camino
En efecto, intentaré comprenderlo y escribiré los resultados.

Muchísimas gracias
__________________
:)
Responder Con Cita
  #4  
Antiguo 06-12-2005
Avatar de DarkByte
DarkByte DarkByte is offline
Miembro
 
Registrado: sep 2003
Ubicación: Desconocido
Posts: 1.322
Poder: 22
DarkByte Va por buen camino
Pues... error

Código:
[Error] scEscipion.pas(74): Published field 'AlRecibir' not a class nor interface type
Código Delphi [-]
type
  // *** Clase para pasar el evento
  TEventoRecibir = procedure (ASender :TObject; var ACadena :string);
type
  // *** Clase TEscipion
  TEscipion = Class(TObject)
  (...)
     // *** Eventos
    FAlRecibir : TEventoRecibir;
    procedure PasarRecibido(var Cadena :string);

  private
  (...)
    procedure Recibir;

  public
  (...)
   
  published
    AlRecibir :TEventoRecibir
      read FAlRecibir; //¡Ojo! Aquí recibo el error
      write FAlRecibir;
end;
__________________
:)
Responder Con Cita
  #5  
Antiguo 06-12-2005
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Te hizo falta poner of object en la declaración del tipo evento.

Código Delphi [-]
type
// *** Clase para pasar el evento
TEventoRecibir = procedure (ASender :TObject; var ACadena :string) of object;



Saludos...
Responder Con Cita
  #6  
Antiguo 06-12-2005
Avatar de DarkByte
DarkByte DarkByte is offline
Miembro
 
Registrado: sep 2003
Ubicación: Desconocido
Posts: 1.322
Poder: 22
DarkByte Va por buen camino
Aún poniendo
Código Delphi [-]
type
  // *** Clase para pasar el evento
  TEventoRecibir = procedure (ASender :TObject; var ACadena :string) of object;

Me falla en..
Código Delphi [-]
  published
    AlRecibir :TEventoRecibir
      read FAlRecibir; // Linea 75  
      write FAlRecibir; // Linea 76
end; // Linea 77

Me suelta lo siguiente:
Código:
[Error] scEscipion.pas(75): Published field 'AlRecibir' not a class nor interface type
[Error] scEscipion.pas(75): ',' or ':' expected but ';' found
[Error] scEscipion.pas(76): ',' or ':' expected but identifier 'FAlRecibir' found
[Error] scEscipion.pas(77): Type expected but 'END' found
__________________
:)
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


La franja horaria es GMT +2. Ahora son las 14:13:06.


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