Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Abrir un formulario hijo solo una vez (https://www.clubdelphi.com/foros/showthread.php?t=55106)

Walterdf 08-04-2008 16:04:27

Abrir un formulario hijo solo una vez
 
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;)

Código:

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:
Código:

  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:

Código:

  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

Mi solucion
 
Yo hago lo mismo de la siguiente manera:

Llamada a la forma Hija

Código Delphi [-]
if frmFormaHija = nil then
  frmFormaHija := TfrmformaHija.Create(Application);
frmFormaHija.Show;
y en el evento OnClose de la forma Hija:

Código Delphi [-]
Action := caFree;
frmFormaHija := nil;

Espero que te sirva.

Neftali [Germán.Estévez] 08-04-2008 16:33:23

Yo añadiría un par de cosas si me lo permites:

Código Delphi [-]
  if Assigned(frmFormaHija) then

en lugar de:
Código Delphi [-]
if frmFormaHija = nil then

y en el evento OnClose de la forma Hija:

Código Delphi [-]
FreeAndNil(frmFormaHija);

en lugar de:

Código Delphi [-]
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:

Código Delphi [-]
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:

Código Delphi [-]
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!!


La franja horaria es GMT +2. Ahora son las 16:43:37.

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