Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

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: 23
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: 23
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
  #7  
Antiguo 06-12-2005
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Ah!!, es que no me fijé que también tenías otro error: no estás usando la palabra reservada property para declarar el evento de tu clase:

Código Delphi [-]
  // ...
published
  property AlRecibir: TEventoRecibir
    read FAlRecibir // <--- aquí no lleva -> ; <-
    write FAlRecibir; 
end; // Linea 77


Saludos...
Responder Con Cita
  #8  
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
Ya está, ¡¡Perfecto!! Muchas gracias.. ahora a rellenar los procedimientos .. en eso creo que no voy a tener problemas

¡¡Muchísimas gracias!!
__________________
:)
Responder Con Cita
  #9  
Antiguo 07-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
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
  procedure Recibir (ASender :TObject; var ACanal, AComando, AParametros :string; var Privado : boolean);
  begin
    Memo1.Lines.Add('Canal: '+ACanal +' Comando: '+ AComando+' Parametros: '+AParametros);
  end;
var
  Bot : TEscipion;
begin
  Bot := TEscipion.Create;
  Bot.Ip := '127.0.0.1';
  Bot.Puerto := 60;
  Bot.FAlRecibir := Recibir; //¡Error!
  Bot.Conectar;
end;
Error: [Error] Unit1.pas(43): Incompatible types: 'method pointer and regular procedure'
__________________
:)
Responder Con Cita
  #10  
Antiguo 07-12-2005
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
Recibir tiene que ser un método de un objeto, no puedes asignar un procedimiento cualquiera.

// Saludos
Responder Con Cita
  #11  
Antiguo 07-12-2005
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
El error es por que Recibir no puede ser un procedimiento cualquiera. Tiene que se un método de una clase. En tu caso, Recibir debe ser un método de TForm1.

Código Delphi [-]
TForm1 = class(TForm)
private
  procedure Recibir(ASender: TObject; var ACanal, AComando, AParametros: string;
    var Privado: Boolean);
end;


Saludos...
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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 15:55:33.


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