PDA

Ver la Versión Completa : Abrir un formulario hijo solo una vez


Walterdf
08-04-2008, 16:04:27
Buenas a todos
Estoy intentando evitar que un formulario hijo se abra mas de una vez. Investigué en los foros pero las soluciones que encontré no me están ayudando y no se que estoy haciendo mal.
Paso a explicar.

Al abrir la aplicación el form padre (frmMain) llama a un form hijo (frmQuerys) en el evento Activate del mismo de la sig. manera:

(esto lo tengo como variable global: frmQuerys : TfrmQuerys;)


procedure TfrmMain.FormActivate(Sender: TObject);
begin
frmQuerys := TfrmQuerys.Create(Self);
frmQuerys.Show;
end;


Hasta aquí todo 10 puntos.

En el evento OnClose del form hijo hago lo siguiente para liberarlo:

Action := caFree;


Desde una opción en el form padre puedo volver a llamar a este form hijo pero quiero evitar que se vuelva a crear si ya se está mostrando y lo hago de la sig.forma:


if not Assigned(frmQuerys) then
begin
frmQuerys := TfrmQuerys.Create(Self);
frmQuerys.Show;
end
else
frmQuerys.Show;


Si intento abrirlo mientras se está mostrando, no lo abre nuevamente, esto está perfecto. Pero si cierro el form hijo e intento abrirlo me sale una excepción diciendo: "Abstract Error" y no hace nada.
Que estoy haciendo mal???
Muchas gracias desde ya!!

jcarteagaf
08-04-2008, 16:07:13
Yo hago lo mismo de la siguiente manera:

Llamada a la forma Hija

if frmFormaHija = nil then
frmFormaHija := TfrmformaHija.Create(Application);
frmFormaHija.Show;

y en el evento OnClose de la forma Hija:

Action := caFree;
frmFormaHija := nil;

Espero que te sirva.

Neftali
08-04-2008, 16:33:23
Yo añadiría un par de cosas si me lo permites:


if Assigned(frmFormaHija) then


en lugar de:

if frmFormaHija = nil then


y en el evento OnClose de la forma Hija:


FreeAndNil(frmFormaHija);


en lugar de:


Action := caFree;
frmFormaHija := nil;


Un saludo.

Walterdf
08-04-2008, 16:34:52
Mil gracias!!!!
Lo solucioné, me ayudo tu sugerencia y a parte me estaba mandando un lío con la variable (frmQuerys := TfrmQuerys), estaba en dos lugares diferentes. Muchas horas programando!, necesito descanso.
Un abrazo y gracias nuevamente!!!
Saludos

enecumene
08-04-2008, 16:53:26
Hola, esta es una función que utilizo, es similar a lo que buscas, pero alguna utilidad le encontraras:

function Existe(Nombre: String): Boolean;
var
i: integer;
begin
for i:= 0 to Screen.FormCount - 1 Do
if Screen.Forms[i].Name = Nombre then
begin
Result:= TRUE;
Exit;
end;
Result:= FALSE;
end;

y para usarlo de esta manera:

procedure Tincio.BitBtn1Click(Sender: TObject);
begin
if not Existe('FPedido') then
begin
FPedido:=TFPedido.Create(self);
FPedido.Show;
end else
ShowMessage('ventana hija ya esta abierta!');
end;

espero te sirva,

Saludos.

Walterdf
08-04-2008, 17:15:01
Muy buena opción enecumene!!, mil gracias!

Un abrazo

Saludos!!