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 21-08-2010
Avatar de adonias
adonias adonias is offline
Miembro
 
Registrado: ago 2007
Posts: 45
Poder: 0
adonias Va por buen camino
Unhappy TForm.Create Nombre dupplicados - Chat

hola amigos.

Estoy creando una mini aplicacion tipo live help o mini chat

Ya tengo la coneccion con el servidor, y ahora lo que necesito es crear un form para mostrar nuevos mensages.

Buscando en el foro encontre algunas soluciones, pero no logro:

1- Al crear al nuevo Form, que me detecte nombre duplicados.

2- Que se vea en la barra de tareas de windows el nombre del nuevo form creado.

Para detectar ventanas duplicadas estoy intentando esto:

Código Delphi [-]

var
  F:TForm;
  I : integer;
  N : boolean;
begin

N:= false;

for I := 0 to Screen.FormCount-1 do
  begin
    if Screen.Forms[i].name = 'IdChatxx'
    then N := true ;

    if N = false then begin

      F := TForm.Create(self);
      try
        F.Name := 'IdChatxx';
        F.ShowModal;
      finally
        F.Free;
      end

    end
  end

El problema es que me crea el form IdChatxx, pero no me deja cliquear al form1 o form padre.

Aunque intento buscar el nobre, igual me crea al form y me lanza error de duplicate names

Gracias por su ayuda amigos
Responder Con Cita
  #2  
Antiguo 21-08-2010
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Interesante seria ver el codigo completo.
Saludos
__________________
Siempre Novato
Responder Con Cita
  #3  
Antiguo 21-08-2010
LoPiTaL LoPiTaL is offline
Miembro
 
Registrado: abr 2009
Posts: 168
Poder: 16
LoPiTaL Va por buen camino
Hola. Así a bote pronto (como dice el amigo Caral, sería interesante ver más código para poder ayudarte mejor) veo varias cositas:

1) La búsqueda la haces mal. No puedes poner el if N=false then.... dentro del for, ya que este if te lo hará para todos los formularios en pantalla. Será siempre false hasta encontrar el formulario que realmente habías creado tú, por lo que te ejecutará muchas veces ese código. Debes sacarlo del for.

2) No te deja clickar en el form padre porque usas f.Showmodal. Para poder clickar sobre otro formulario debes usar F.Show.

3) Usando lo indicado en 1) y en 2) podrás crear un formulario sin errores, pero cuando crees un 2º formulario te dará error de nombre repetido. Es lógico, dado que estás nombrando de la misma forma los dos formularios con la instrucción f.name:='IdChatXX'. Para corregirlo deberías usar F.Name:='IdChat'+inttostr(FormCounter), donde FormCounter lo inicializas a 0 en el FormCreate del padre y lo incrementas con cada formulario nuevo que creas. Ahora el problema es que ya no puedes usar if Screen.Forms[i].name = 'IdChatxx' para comparar. Ahora deberías usar if AnsiStartsStr('IdChat',Screen.Forms[i].name) then.... para ver si el nombre empieza con 'IdChat', independientemente del índice que le hayas dado.

Espero te haya ayudado la respuesta.
Un saludo,
LoPiTaL
Responder Con Cita
  #4  
Antiguo 21-08-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola adonias.

Cita:
El problema es que me crea el form IdChatxx, pero no me deja cliquear al form1 o form padre.
Eso es lógico por que en la creación estás haciendo esto:
Código Delphi [-]
F.ShowModal;
Y si la mostrás en forma modal no te va a dejar abandonar el creado.

La forma típica de mostrar una ventana no modal es:
Código Delphi [-]
procedure TForm1.MostrarNoModal(AClass: TFormClass);
var
  Form: TForm;
begin
  Form:= TForm(Application.FindComponent(Copy(AClass.ClassName,2,255)));
  if Assigned(Form) then
    Form.Show
  else
    AClass.Create(Application).Show;
end;

Llamada:
Código Delphi [-]
MostrarNoModal(TForm2);

Si no es esto lo que estás buscando, como dice el amigo Caral arriba, especificá un poco más.


Saludos.

Última edición por ecfisa fecha: 21-08-2010 a las 22:37:56.
Responder Con Cita
  #5  
Antiguo 22-08-2010
Avatar de adonias
adonias adonias is offline
Miembro
 
Registrado: ago 2007
Posts: 45
Poder: 0
adonias Va por buen camino
Ok.

logre resolver el problema 1, junto al de no poder cliquear el form padre asi:
Código Delphi [-]
var
  F:TForm;
  I : integer;
  N : boolean;
begin
//defino como falso
N:= false;

for I := 0 to Screen.FormCount-1 do
  begin
    if Screen.Forms[i].name = 'IdChatxx'
    then N := true ; 
// si exite la ventana con ese nombre es true 
//y no abro un nuevo form con la misma conversacion
end;

//si es falso, abro la ventana con la conversacion IdChatxx
    if N = false then begin

      F := TForm.Create(Application);
      F.Name := 'IdChatxx';
      F.Show;
//creo un evento para poder tocar al form padre y si el usuario cierra 
//la ventana y hay una nuevo mensage, no me de error de nombre
      F.OnClose := EventoFree;


    end


end;



procedure TForm1.EventoFree(Sender: TObject; var Action: TCloseAction);
begin
   Sender.Free;
end;

No se si sera la mejor manera, pero me resulto.

Ahora solo me falta mostrar el form IdChatxx, en la barra de windows
Responder Con Cita
  #6  
Antiguo 23-08-2010
Avatar de adonias
adonias adonias is offline
Miembro
 
Registrado: ago 2007
Posts: 45
Poder: 0
adonias Va por buen camino
Encontre esto en el foro.

Supuestamente deberia aplicarce para todos los form que se generen, pero solo funciona para el form1
Código Delphi [-]
procedure TForm1.CreateParams
   (var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.ExStyle := Params.ExStyle
                    or WS_EX_APPWINDOW;
end;

Alguna idea de lo que puede ser?
Responder Con Cita
  #7  
Antiguo 23-08-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola adonias.

No, supuestamente se puede aplicar en la creación de un componente, en este caso un TForm,
aunque bién podría ser cualquier TWinControl.

Es decir que si sobreescribís el método CreateParams para el Form1, tenés que hacer lo propio
para todos los Forms en los cuales desees alterar la creación por defecto de los mismos.

Saludos.

Última edición por ecfisa fecha: 23-08-2010 a las 08:04:32.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Ventana en TForm Builder 6.0 C++ C++ Builder 4 11-02-2009 16:02:53
TService y TForm Softweb API de Windows 5 20-10-2008 17:41:01
como hacer una especie de chat(consulta chat) bellleti Conexión con bases de datos 3 10-07-2007 13:30:01
Mostrar nombre de campos y filtar nombre de tablas .db en un combobox Coco_jac Varios 1 24-06-2006 01:34:29
Refrescar mi tform.... Kamikaze OOP 3 17-11-2004 22:09:25


La franja horaria es GMT +2. Ahora son las 03:45:02.


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