Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Sobre aplicaciones MDI - Child (https://www.clubdelphi.com/foros/showthread.php?t=37893)

JoAnCa 25-11-2006 17:03:06

Sobre aplicaciones MDI - Child
 
Necesito saber como puedo prevenir mas de una instancia de una ventana hija en una aplicacion MDI.
El objetivo es que si el usuario trata de abrir una ventana hija que ya esta abierta, que muestre o active esa misma instancia que ya está abierta y no que se abra otra.

ebreton31 25-11-2006 18:09:28

ojala te sirva
 
if Assigned(Self.ActiveMDIChild) then
Self.ActiveMDIChild.Close;

Lepe 25-11-2006 18:27:25

El método completo:

Tenemos una ventana mdiChild que se llama form1 y su clase es Tform1.

En el OnClose de esa ventana ponemos:
Código Delphi [-]
 Action := cafree;
 form1 := nil;

Cuando queramos saber si hay una ventana abierta:
Código Delphi [-]
if Assigned(form1) then
  // abierta
else
  // no está creada la ventana.

Para crear la ventana Form1, hay varias formas, la que más me gusta es:
Código Delphi [-]
  Form1 := TForm1.Create(nil);
Fíjate en el parámetro "nil", eso quiere decir que nadie se va a encargar de liberar la ventana, porque al cerrarse, ya se lo hemos dicho (Action := cafree).

Si necesitas saber de qué tipo es la ventana abierta en un determinado momento, siempre puedes comparar así:
Código Delphi [-]
if mdiChildcount > 0 then
if ActiveMdiChild.Classname =  'TForm1' then
  // es el form1
else
  // no lo es

Saludos.

aledieb 26-11-2006 14:22:36

Yo utilizo otra forma, en form que llama al mdichild

Código Delphi [-]
  if estacargada('frmResuVenta')=-1 then
  begin
    Application.CreateForm(TfrmResuVenta, frmResuVenta);
    frmResuVenta.Show;
  end
  else
  begin
    Screen.Forms[estacargada('frmResuVenta')].WindowState:=wsNormal;
    Screen.Forms[estacargada('frmResuVenta')].Show;
  end;

La función es:
Código Delphi [-]
function EstaCargada(NombreVent:string):integer;
var i:integer;
begin
  estacargada:=-1;
  i:=0;
  while ido
  begin
    if UpperCase(Screen.Forms[i].Name)=UpperCase(NombreVent) then
    begin
      estacargada:=i;
      break;
    end;
    Inc(i);
  end;
end;

Tal ves no sea lo optimo pero funciona de maravilla. Lo unico a tener en cuenta que que los mdichild deben liberarse al cerrarlos poniendo action:=caFree; en el metodo close.


La franja horaria es GMT +2. Ahora son las 19:08:47.

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