Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   TForm.Create Nombre dupplicados - Chat (https://www.clubdelphi.com/foros/showthread.php?t=69494)

adonias 21-08-2010 16:36:06

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

Caral 21-08-2010 20:44:11

Hola
Interesante seria ver el codigo completo.
Saludos

LoPiTaL 21-08-2010 22:32:42

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

ecfisa 21-08-2010 22:34:36

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.

adonias 22-08-2010 05:25:50

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

adonias 23-08-2010 05:47:20

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?

ecfisa 23-08-2010 07:57:17

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.


La franja horaria es GMT +2. Ahora son las 19:52:44.

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