Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Metodos dentro de una Unit (https://www.clubdelphi.com/foros/showthread.php?t=88571)

josepicd 25-06-2015 17:52:58

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;

ElKurgan 25-06-2015 19:01:49

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

AgustinOrtu 25-06-2015 20:37:54

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 :)

Neftali [Germán.Estévez] 26-06-2015 09:38:22

Cita:

Empezado por josepicd (Mensaje 493669)
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;

gatosoft 10-07-2015 19:43:34

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,


La franja horaria es GMT +2. Ahora son las 07:46:01.

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