PDA

Ver la Versión Completa : Sobre aplicaciones MDI - Child


JoAnCa
25-11-2006, 17:03:06
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
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:

Action := cafree;
form1 := nil;


Cuando queramos saber si hay una ventana abierta:

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:

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í:

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


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:

function EstaCargada(NombreVent:string):integer;
var i:integer;
begin
estacargada:=-1;
i:=0;
while i<Screen.FormCount do
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.