Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Form Desastroso (https://www.clubdelphi.com/foros/showthread.php?t=6870)

diegofhernando 26-01-2004 15:56:12

Form Desastroso
 
Que tal foro....
Al parecer la solucion a mi problema es imposible :p , o definitivamente a nadie le ha sucedido, de nuevo pongo mi problema en el foro para que me contribuyan con alguna solucion. Estoy trabajando una aplicacion con las Indy, especificamente un programa de mensajeria y quiero que un pequeño form se cree dinamicamente cada que se recibe un mensaje, el problema es que las benditas Indy no me permiten crear y mostrar mi formulario dentro de sus eventos, es decir que mi unica solucion es crear el formulario en otro hilo que se debe llamar desde los eventos de los componentes Indy... :confused:
que lio... no se como crear un tthread que me permita crear un mostrar un form, como paso parametros a ese thread???? :confused: ya son casi 2 meses intentando hacer esto y estoy a punto de mandar mi PC para la m!#$%!@, agradezco su colaboracion.


Salu2 :(

jachguate 26-01-2004 17:09:16

Cómo que un evento de las Indy no te permite crear un formulario???? que mensaje de error tenes.

Creo que te conviene leer sobre TThread en el help, amigo. Hay un método llamado Sinchronize, que te puede ayudar a interactuar con el hilo principal de la aplicación de forma segura.

Hasta luego.
;)

roman 26-01-2004 17:32:02

Cita:

Empezado por jachguate
Hay un método llamado Sinchronize, que te puede ayudar a interactuar con el hilo principal de la aplicación de forma segura.

Además de estas observaciones del compañero jachguate quiero indicarte, diegofhernando, que esta última indicación ya te la había dado yo en el otro hilo que comenzaste. Este es de hecho el tercer hilo que tocas al respecto. Los otros dos son:

http://www.clubdelphi.com/foros/showthread.php?t=6844
http://www.clubdelphi.com/foros/showthread.php?t=6731

En lo futuro te vamos a pedir que continues con el hilo original en lugar de abrir otros. Muchas veces cuando no recibimos respuesta de una pregunta es porque no está bien planteada o no es clara, cosa que tú mismo puedes corroborar leyendo tus hilos anteriores en donde cada vez has ido especificando y aclarando más.

// Saludos

diegofhernando 29-01-2004 00:15:16

tienes razon Roman, y pido disculpas... ademas ya me he leido la guia de estilo en el foro y se especifican este tipo de conductas... lo cierto es que no he podido solucionar mi problema con expuesto en los otros hilos... haber si ahora con un poco mas de calma me pueden colaborar. El codigo que utilizo lo pongo en el evento OnExecute de un TidTCPServer de las Indy:

procedure Tmain.sockExecute(AThread: TIdPeerThread);

var
cont: integer;
texto: string;
win: TChat; // form que se crea dinamiamente para cada conversacion
begin

text:= AThread.Connection.ReadLn();

win:= TChat.Create(Self);
win.name:= nombre_aleatorio // este nombre se lo asigno de acuerdo al usuario
win.caption:= nombre_usuario // este es el nombre de la persona que envia el mensaje
win.show; // aqui es donde se ponen mal las cosas, se congela y simplemente no sucede nada
// ya probe con:
Synchronize(win.show); // pero sucede lo mismo.

end;

los otros valores se generan en otro codigo que no pongo por que simplemente no tiene que ver con el problema... haber si me dan una mano con esto...

Salu2 :cool:

jachguate 30-01-2004 05:10:02

Debieras tener una rutina que cree la ventana. Si te das cuenta, la sentencia TChat.Create(Self) se ejecuta en el hilo de la conexión, y no en el hilo principal de la aplicación.

La llamada a esta rutina, debiera estar dentro de Synchronize.

digamos Synchronize(CrearVentanaChat);

Hasta luego.

;)

uhilari 30-01-2004 15:48:41

Hola

Cita:

Empezado por diegofhernando
win:= TChat.Create(Self);

Aca esta tu problema

Cita:

Empezado por jachguate
Si te das cuenta, la sentencia TChat.Create(Self) se ejecuta en el hilo de la conexión, y no en el hilo principal de la aplicación.

jachguate tiene mucha razon este hilo se esta ejecutando en la conexión no en la aplicación. Asi que la forma como podrias hacer que esto se evite seria de la siguiente forma

Código:

procedure Tmain.sockExecute(AThread: TIdPeerThread);
var
  cont: integer;
  texto: string;
  win: TChat; // form que se crea dinamiamente para cada conversacion
begin
  text:= AThread.Connection.ReadLn();
  win:= TChat.Create(Application);
  win.name:= nombre_aleatorio;
  win.caption:= nombre_usuario;
  win.Show; // esto ya no debe ser un problema
end;

Pasando el objeto Application como parametro de Create pues haras que tu formulario este directamente ligado a la aplicación y no a tu formulario lo que le dará independencia.

Pero no te olvides de poner el siguiente codigo en el evento OnClose de tu formulario TChat

Código:

procedure TChat.Close(Sender : TObject; var Action : TCloseAction);
begin
  Action := caFree;
end;

lo que eliminara tu formulario de la memoria y te permitira crear otro mas luego.

Suerte

diegofhernando 03-02-2004 20:56:30

Agradezco sinceramente sus recomendaciones, en estos momentos voy a probar con el código que me recomiendan, de nuevo muchas gracias.

Salu2 :cool:


La franja horaria es GMT +2. Ahora son las 12:28:55.

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