Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Thread y Form (https://www.clubdelphi.com/foros/showthread.php?t=19871)

progmaq 29-03-2005 23:02:17

Thread y Form
 
Hola, me gustaría saber si es posible realizar lo siguiente:

Estando en un Thread, ¿como puedo crear un Form, sin que continue ejecutandose el Thread?

Código:

procedure Hilo_Cliente.Execute;
var
Ventana : TForm2;
begin
  Ventana := TForm2.Create(nil);
  Ventana.ShowModal();
  Ventana.Free;
  Exit;
end;

De la forma escrita anteriormente, creo que solo se crea y se destruye, ya que el thread continua...

Muchas gracias de antemano...

Toni 30-03-2005 06:57:44

Mirate los metodos de la clase TThread (Suspend, Resume, Terminate) en la ayuda del Delphi.

Creo que con el nombre ya pagan.

Saludos,

progmaq 30-03-2005 21:42:01

Tony, la cosa es que si el form que creo es dinámico, vamos sin usar ningun form ya hecho, no hay ningun problema, va perfectamente. Pero si quiero usar un form que lo tenga definido en un dfm no hay forma...

Lo que me interesa, es crear el form dinámicamente, pero pudiendo modificar el Form desde el propio delphi...

Un ejemplo para que me entiendas mejor:
Código:

procedure Hilo_Cliente.Execute;
var
Ventana : TForm;
begin
  Ventana := TForm.Create(nil);
  Ventana.Name := 'Prueba';
  Ventana.Caption := 'Prueba ventana';
  Ventana.ShowModal();
  Ventana.Free;
  Exit;
end;

Con este código, el programa carga la thread, y cuando llega al form, lo muestra sin problemas, y hasta que no cerramos el form, no continúa con el thread, que es lo que yo necesito.

Pero lo que me interesa, es hacer lo mismo, pero envez de tenerle que meterer los datos manualmente:

Código:

  Ventana.Name := 'Prueba';
  Ventana.Caption := 'Prueba ventana';

Coger los datos de un form ya determinado...

Código:

procedure Hilo_Cliente.Execute;
var
Ventana : TForm2; Este es un form ya determinado
begin
  Ventana := TForm2.Create(nil);
  Ventana.ShowModal();
  Ventana.Free;
  Exit;
end;

Si uso esto, Delphi me da un error diciendo:

Código:

Canvas does not allow drawing
Saludos, y gracias ;)

S.M.S. 31-03-2005 10:05:14

Synchronize ();
 
Hola progmaq, todos los objetos de la biblioteca de componentes visuales creados en tiempo de diseño pertenecen al programa principal, por lo que no es posible que desde el método execute de un hilo pueda accederse de forma directa a sus propiedades o realizar llamadas a sus métodos. En estos casos es necesario utilizar el procedimiento synchronize () al que pasaremos como parámetro un método definido por nosotros. Dicho esto prueba lo siguiente (en la parte private declaras el procedimiento):
Código Delphi [-]
private
procedure MuestraVentana;
end;
luego haces en él lo que querías y lo llamas desde Execute a través de Synchronize:
Código Delphi [-]
procedure MuestraVentana;
begin
  with TForm2.Create(nil) do
  Try
    ShowModal;
  finally
    Free;
  end;
end;

procedure Hilo_Cliente.Execute;
begin
 synchronize (MuestraVentana);
 //.............
end;
Espero que así se solucionen trus problemas.Saludos.

progmaq 31-03-2005 14:16:50

S.M.S muchísimas gracias por la ayuda ofrecida, me lleve horas buscando por google, buscando en este foro y buscando en la ayuda de los form y los thread... y si no llegas a ser por ti, no lo hubiera conseguido nunca.

Solo decirte que soy el programador de DuRiE, (no pongo la WEB por si a los moderadores les importa) y nada, que en la proxima versión, pondre que si no llega a ser por ti, la Activacion de los servidores WALLA no hubiera sido posible...

Pues nada, un saludo y "Eres un CRACK" ;)

PD: Muy bien explicado


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