Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   TThread y cerrar una ventana previamente abierta (https://www.clubdelphi.com/foros/showthread.php?t=43539)

gluglu 14-05-2007 18:58:44

TThread y cerrar una ventana previamente abierta
 
Hola compañeros !

Al final, por más que lo intento no lo consigo, y solicito de vuestra ayuda.

Estoy intentando mandar correos electrónicos mediante un Thread.

Todo funciona en principio bien. Tengo una duda que no puedo resolver.

En mi pantalla de edición del correo, al darle al botón de enviar, ejecuto :
Código Delphi [-]
MainForm.ShowMailProcess;
que a su vez llama al siguiente proceso del MainForm que contiene además :
Código Delphi [-]
unit Main;
...
type
  TMainform = class(TForm)
  ...
  private
    { Private declarations }
    MainMail  : TMainFormMail;
  ...

  TEMails = class(TThread)
  protected
    procedure Execute; override;
  end;
 
var
  Mainform : TMainform;
  EMails   : TEmails;
 
implementation
...
 
procedure TMainForm.ShowMailProcess;
begin

  MainMail := TMainFormMail.Create(Self);
  MainMail.Show;

  EMails := TEMails.Create(False);
  EMails.FreeOnTerminate := True;

end;
 
procedure TEMails.Execute;
begin
  try
    while not Terminated do begin
      ...
      if DM0.IBDataSetEMails.Eof then begin
        MainForm.MainMail.Free;
        Terminate;
      end
      else begin
        ...
        MainForm.MainMail.Send_EMail;
        ...
      end;
    end;
  except
    on E: Exception do begin
      MainForm.Label1.Caption := E.Message;
    end;
  end;
end;

En resumidas cuentas : Al darle al botón de enviar correo, creo un form adicional (MainMail) que me va a mostrar el proceso del envío. Después de crear este form, creo el Thread de tal manera que se ejecute inmediatamente.

El Thread entra en un bucle que comprueba todos los correos que tiene que enviar. Una vez que no queden correos por enviar, quiero finalizar tanto el Thread como además cerrar y liberar la ventana creada para mostrar el proceso de envío.

Pero al intentar cerrar la ventana MainForm.MainMail.Free me salta un error : 'System Error. Code : 5'.

No sé como hacerlo para que libera la ventana que muestra el proceso y termine el thread.

Muchas gracias por vuestra ayuda

gluglu 14-05-2007 19:19:54

Como siempre pasa en estas ocasiones, después de tantas horas probando, y justo después de decidirme a abrir un hilo con mi problema, te viene la idea y la solución : :o

Código Delphi [-]
procedure TEMails.Execute;
begin
 
  try
    while not Terminated do begin
      if DM0.IBDataSetEMails.Eof then
        Terminate
      end
      else begin
        ...
 
procedure TMainForm.ShowMailProcess;
begin

  MainMail := TMainFormMail.Create(Self);
  MainMail.Show;

  EMails := TEMails.Create(False);
  EMails.OnTerminate := TerminateEMail;
  EMails.FreeOnTerminate := True;

end;

procedure TMainForm.TerminateEMail(Sender: TObject);
begin
  MainMail.Free;
end;

Espero que le pueda servir el código a alguien más.

Saludos a todos ;)


La franja horaria es GMT +2. Ahora son las 08:43: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