Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   crear un evento en una clase? (https://www.clubdelphi.com/foros/showthread.php?t=44430)

chelox 06-06-2007 08:36:37

crear un evento en una clase?
 
hola,
mi problema es que no logro comprenderlo y no puedo hacer que funcione, parece que es muy simple, pero bueno... espero de su ayuda.

esto está dentro de una unidad que la utilizo en un form.
cada vez que presiono un boton, se ejecuta en un thread para enviar una archivo.
Luego de que termina de enviar el archivo necesito saber que el archivo fue enviado.
Código Delphi [-]
 
type
  TonFinish = procedure(Sender: TObject) of object;
 EnviarFila = class(TThread)
  private
    FonFinish : TonFinish;
  protected
    procedure Execute(); override;
  public
    constructor Create(dire:String;file1:String);
    procedure pushfile(dire,file1:String);
  published
    property onFinish: TonFinish read FonFinish write FonFinish;
  end;
 
{la funcion que envia el archivo:}
 
procedure EnviarFila.pushfile();
begin
... envia el archivo....
 if Assigned(FonFinish) then FonFinish(Self);
End;

 
 
{Aca el problema, en la unidad unit1 del form1:
 
Esto es lo único que se me ocurrió, pero no pasa nada:
} 
type
  TEnviarFila = class(EnviarFila)
    procedure onFinish(Sender: TObject);
  end;
 
{el procedimiento:}
procedure TEnviarFila.onFinish(Sender: TObject);
begin
... termino ....
end;
Gracias

Neftali [Germán.Estévez] 06-06-2007 11:06:32

Por favor utiliza TAG's cuando añadas código Delphi a los mensajes.

¿Has ejecutado paso a paso el código? ¿Se lanza el evento? ¿Lo has asignado a la instancia del objeto (sea en diseño o en ejecución)?

Lepe 06-06-2007 12:01:38

No estas creando una instancia de EnviarFila, sino heredando de ella.
Código Delphi [-]
type
TEnviarFila = class(EnviarFila)

La definición de EnviarFila está bien, lo que tienes que cambiar es el uso en el Form1.

Tienes que instanciar EnviarFila y asignar ese evento:
Código Delphi [-]
type
TForm1 = class(Tform)
private
procedure AlTerminar(Sender: TObject);
end;

procedure TForm1.FormCreate(Sender: TObject);
var x :EnviarFila;
begin
  x := EnviarFila.Create(false);
  x.OnFinish := AlTerminar;
  x.PushFile;
end;

procedure TForm1.AlTerminar(Sender: TObject);
begin
Showmessage('termino');
end;

la asignación "x.OnFinish := AlTerminar;" es idéntico a cuando tú en el inspector de objetos, das un doble clic en un evento para "rellenarlo con código".

En principio, para ejecutar un TThread, se debe usar su método Execute, tú usas PushFile, ya eso no es cuestión de eventos, sino de TThreads. Si no funciona como esperas, pon el código completo del TThread.

Saludos

chelox 06-06-2007 18:39:57

Hola,

eso mas o menos quise hacer en un momento pero no se que problema de diferentes tipo me salia.
Puede ser que esto cuando es en un componente lo hace en la extensión dfm?
Buego, ahora lo voy a probar y veremos.

muchas Gracias.

jachguate 06-06-2007 20:14:20

Comentarios adicionales:

Si la firma de tu evento va a ser (Sender: TObject), no veo razón para declarar un nuevo tipo. Podes usar el tipo TNotifyEvent, que parece el adecuado para tu caso.

Luego, si existe la posibilidad de enviar varios archivos concurrentemente, debes realizar algún tipo de sincronización para hacer el código "Thread Safe", sobre todo si en la implementación del método AlTerminar vas a interactuar con la VCL. En ese caso, es mejor que este método se ejecute dentro del hilo principal de la aplicación. Recordá que la VCL no es Thread Safe y esta responsabilidad recae en vos (para mi, tiene sentido).

Si no tenes idea de lo que estoy hablando, mirá la ayuda del método Synchronize de la clase TThread, creo que te aclarará las cosas.

Hasta luego.


La franja horaria es GMT +2. Ahora son las 04:53:58.

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