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 25-06-2015
josepicd josepicd is offline
Miembro
 
Registrado: jun 2015
Posts: 57
Poder: 9
josepicd Va por buen camino
Metodos dentro de una Unit

Perdonad lo mal que me explico, pero no se como expresarme.

A ver si alguien me puede orientar para hacerlo de la mejor forma posible

Ya se que se puede unir todo dentro del form, y no es exactamente este caso, es solo un ejemplo simplificado. La parte de comunicacion debe ir en una unit independiente porque esa comunicacion aqui puede ser por socket, en otro caso puede ser por 232, etc y cambiando la unit de comunicacion deberia seguir todo funcionando

Tengo un Tform1 con un TLabel que en su caption debera poner "Connectado" o "Desconectado"
En otro lado tengo una Unit con un procedimiento tal cual

¿La pregunta es como asigno el onconnect y el ondisconnect?

Código Delphi [-]
Unit Srv;

procedure createsrv;
begin
  srv := TServerSocket.Create( nil);
  srv.Port := 1000;
  srv.Active := true;
  srv.OnClientConnect    :=  doconnect;
  srv.OnClientDisconnect := dodisconnect;
end;

procedure doconnect;
begin
  lconnect := true;
end;

procedure dodisconnect;
begin
  lconnect := false;
end;



Unit TForm

// Al crear el form abrimos la conexion
FormCreate 
Begin
 .....
  createsrv;
 .....
End;


// Mediante un timer voy mirando el estado de la conexion
Procedure OnTimer
begin
  if  lconnect then label1.caption := 'conectado'
                  else label1.caption := 'desconectado';
end;
Responder Con Cita
  #2  
Antiguo 25-06-2015
Avatar de ElKurgan
[ElKurgan] ElKurgan is offline
Miembro Premium
 
Registrado: nov 2005
Posts: 1.232
Poder: 20
ElKurgan Va camino a la fama
Falta información para que te podamos ayudar.

¿lconnect donde está? ¿En el formulario? ¿Es una variable global de la unit Srv?

Parece como si quisieras hacer un procedimiento como los TNotifyEvent, pero no está muy claro el código

Por lo demás, dependiendo de como estés enfocando esto, la forma de asignar los procedimientos a la captura de eventos es como dices en el formulario, asi que por este lado, el código es correcto, pero...

¡Como dice Casimiro, aquí estamos todos dispuestos a ayudar, pero sin bola de cristal en la mesa, es difícil!

De todas formas, si es una captura de un notificador de eventos, en este enlace del maestro Cantú tienes un buen tutorial

Saludos
Responder Con Cita
  #3  
Antiguo 25-06-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Trata de emular lo que ya viene de fabrica con los componentes o controles de Delphi.
No queda del todo claro en tu codigo pero aparentemente OnClientConnect y OnClientDisconnect son dos propiedades de tipo TNotifyEvent.

Esas 2 propiedades son publicas y estan ahi para que el usuario de tu clase pueda agregar codigo especifico
cuando se cierra/abre la conexion. Piensa en un TButton. En su propiedad OnClick, que viene por defecto a NIL (es decir, no hay codigo "de terceros"), se puede almacenar la direccion a una rutina que programamos nosotros para que se ejecute cuando se hace click en el boton

Vos ahi lo que estas haciendo es, en ese espacio preparado para los usuarios de tu clase, realizar el funcionamiento normal de tu clase, es decir, conectar o desconectar. Si a un TButton no le asignas nada en su OnClick, su metodo interno que procesa el click, dibuja el boton presionado, etc. Eso se sigue ejecutando tenga o no el boton un evento OnClick

Tu codigo deberia quedar masomenos asi

(yo tambien soy malo para expresarme, pero supongo que con el codigo se aclarara)

Código Delphi [-]
procedure createsrv;
begin
  srv := TServerSocket.Create( nil);
  srv.Port := 1000;
  srv.Active := true;
  srv.OnClientConnect    :=  NIL;
  srv.OnClientDisconnect := NIL;
end;

procedure doconnect;
begin
  // esto lo haces siempre
  lconnect := true;

  // nos dieron una rutina para ejecutar cuando me conecte?
  if Assigned(OnClientConnect) then
    OnClientConnect;
end;

procedure dodisconnect;
begin
  // esto lo haces siempre
  lconnect := false;

  // nos dieron una rutina para ejecutar cuando me desconecte?
  if Assigned(OnClientDisconnect) then
    OnClientConnect;
end;

Recomendable mirar un poquitito en el codigo fuente de la VCL, ahi se aclara todo en un instante
Responder Con Cita
  #4  
Antiguo 26-06-2015
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por josepicd Ver Mensaje
Tengo un Tform1 con un TLabel que en su caption debera poner "Connectado" o "Desconectado"
En otro lado tengo una Unit con un procedimiento tal cual
¿La pregunta es como asigno el onconnect y el ondisconnect?
Me da la impresión de que esos métodos tienen que formar parte de la clase, ya que estás intentardo asignarlos a los eventos del componente.
Para que me entiendas; Si miras este código que hay debajo, y de las 2 asignaciones que se hacen al evento OnClick, sólo una es correcta.

Código Delphi [-]
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormShow(Sender: TObject);
  private
    procedure ProcClase(Sender:TObject);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure ProcIndependinte(Sender:TObject);
begin
  // procedimiento independiente
end;

procedure TForm1.FormShow(Sender: TObject);
begin

  Button1.OnClick := ProcIndependinte;  <<== ERROR
  Button1.OnClick := ProcClase;         <<== CORRECTO

end;

procedure TForm1.ProcClase(Sender: TObject);
begin
  // procedimiento de la clase
end;
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 10-07-2015
Avatar de gatosoft
[gatosoft] gatosoft is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Bogotá, Colombia
Posts: 833
Poder: 21
gatosoft Va camino a la fama
Apoyando lo que dice Neftalí,

en el procedimeinto createsrv son "sospechosas" las asignaciones:

Código Delphi [-]
srv.OnClientConnect    :=  doconnect;
srv.OnClientDisconnect := dodisconnect;

debido a que los evbentos normalemente deben pertenecer a un objeto y no puedens er procedimientos aislados. Ver la definición del evento TNotifyEvent:

Código Delphi [-]
TNotifyEvent = procedure (Sender:TObject) of Object;

Por tanto, deberias definir tus procedimientos en una clase... como buena práctica ademas..

Respondiendo tu pregunta específica, tal como dicen ElKurgan y AgustinOrtu , puedes definir tus propios eventos en lugar de utilizar el timer, asi:


Código Delphi [-]
Unit Srv;

interfase

Type

TConexion=Clas(TObject)
Private
  FOnClientConnect: TNotifyEvent;
  FOnClientDisConnect: TNotifyEvent;
Public  
  Property OnClientConnect: TNotifyevent read FOnClientConnect write FOnClientConnect;
  Property OnClientDisconnect: TNotifyevent read FOnClientDisconnect write FOnClientDisconnect;
  procedure createsrv;
  procedure doconnect;
  procedure dodisconnect;
End;//TConexion

implementation

procedure TConexion.createsrv;
begin
  srv := TServerSocket.Create( nil);
  srv.Port := 1000;
  srv.Active := true;
  srv.OnClientConnect    :=  doconnect;
  srv.OnClientDisconnect := dodisconnect;
end;

procedure TConexion.doconnect;
begin
  lconnect := true;
  if Assigned(FOnClientConnect) then
     OnClientConnect(nil);
end;

procedure TConexion.dodisconnect;
begin
  lconnect := false;
  if Assigned(FOnClientDisConnect) then
     OnClientDisConnect(nil);  
end;

end.

en tu form principal haces:


Código Delphi [-]
Unit TForm

TFrom1 = Clas(TForm)
Public
  LaConexion: TConexion;
  procedure MyOnClientConnect(Sender:TObject);
  procedure MyOnClientDisConnect(Sender:TObject);
end;

// Al crear el form abrimos la conexion
FormCreate:
Begin
 .....
  LaConexion:= TConexion.create;
  LaConexion.OnClientConect:= MyOnClientConnect;
  LaConexion.OnClientDisconect:= MyOnClientDisConnect;
  LaConexion.createsrv;
 ..... 
End;

Formclose:
Begin
  LaConexion.Free;
end;

procedure MyOnClientConnect(Sender:TObject);
Begin
  label1.caption := 'conectado'
end;

procedure MyOnClientDisConnect(Sender:TObject);
Begin
  label1.caption := 'desconectado';
end;

Saludo,
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Métodos de estudio. ixMike Humor 0 19-12-2007 21:37:21
Metodos abstractos nikotina JAVA 6 17-08-2007 20:29:01
herencia de metodos supermilloriver OOP 7 07-01-2006 15:46:01
Crear query dentro de unit y funcion? alehillebrand OOP 3 19-07-2005 01:56:59
como puedo usar una unit externa dentro de mi aplicacion redlyon13 Varios 2 30-11-2003 19:09:13


La franja horaria es GMT +2. Ahora son las 08:45:40.


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