Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-01-2004
Avatar de diegofhernando
diegofhernando diegofhernando is offline
Miembro
 
Registrado: may 2003
Ubicación: Locombia papá!
Posts: 267
Poder: 22
diegofhernando Va por buen camino
Unhappy Form Desastroso

Que tal foro....
Al parecer la solucion a mi problema es imposible , 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...
que lio... no se como crear un tthread que me permita crear un mostrar un form, como paso parametros a ese thread???? ya son casi 2 meses intentando hacer esto y estoy a punto de mandar mi PC para la m!#$%!@, agradezco su colaboracion.


Salu2
__________________
Diego. Colombia es pasión.
Responder Con Cita
  #2  
Antiguo 26-01-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
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.
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #3  
Antiguo 26-01-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #4  
Antiguo 29-01-2004
Avatar de diegofhernando
diegofhernando diegofhernando is offline
Miembro
 
Registrado: may 2003
Ubicación: Locombia papá!
Posts: 267
Poder: 22
diegofhernando Va por buen camino
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
__________________
Diego. Colombia es pasión.
Responder Con Cita
  #5  
Antiguo 30-01-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #6  
Antiguo 30-01-2004
uhilari uhilari is offline
Miembro
 
Registrado: ene 2004
Posts: 21
Poder: 0
uhilari Va por buen camino
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
__________________
La practica y solo la practica hace al maestro
Responder Con Cita
  #7  
Antiguo 03-02-2004
Avatar de diegofhernando
diegofhernando diegofhernando is offline
Miembro
 
Registrado: may 2003
Ubicación: Locombia papá!
Posts: 267
Poder: 22
diegofhernando Va por buen camino
Agradezco sinceramente sus recomendaciones, en estos momentos voy a probar con el código que me recomiendan, de nuevo muchas gracias.

Salu2
__________________
Diego. Colombia es pasión.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 15:57:09.


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
Copyright 1996-2007 Club Delphi