Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   no cargar varias form en una instancia... (https://www.clubdelphi.com/foros/showthread.php?t=22919)

uper 30-06-2005 23:57:45

no cargar varias form en una instancia...
 
hola a todos, en delphi hay alguna manera de que desde una forma pueda llamar a otra forma por medio de un boton pero si se vuelve a oprimir el boton ya no vuelva a cargarse.

es evidente que se consiga con el codigo de:
frm1 := frm1 .Create(Self);
frm1 .Show;

Esto me permite regresar a mi form donde la llame, pero por si acaso un usuario vuelve a oprimir el boton llamara a cargarse la form de nuevo, quisiera saber si es posible evitar esto que se cargarse mas de una vez.

muchas gracias.

roman 01-07-2005 00:11:59

Una opción sencilla:


Código Delphi [-]
if frm1 <> nil then
begin
  frm1 := frm1 .Create(Self);
  frm1 .Show;
end;

y sólo tienes qe asegurarte de que cuando se cierre el formulario vuelvas a poner la variable frm1 en nil. Esto lo puedes hacer en el evento OnClose del formulario.

Esto suponiendo que al cerrarlo también lo destruyes. Si sólo lo ocultas entonces sería:


Código Delphi [-]
if frm1 <> nil then
begin
  frm1 := frm1 .Create(Self);
end;

frm1 .Show;

// Saludos

lucasarts_18 01-07-2005 03:46:10

Hola:

Código Delphi [-]
  
procedure TForm1.Button1Click(Sender: TObject);
begin
   if (Form2 <> nil) and not (Form2.Visible = true)  then
   begin
     Form2.Create(Self);
     Form2.Show;
   end;
end;

Saludos.

roman 01-07-2005 04:44:46

Je, je. Es curioso. Vi el mensaje de lucasarts_18 en el mail y entré para indicar que algo está incorrecto y pues me percato que desde el ejemplo que yo puse está mal :o

La comparación no puede ser

Código Delphi [-]
if frm1 <> nil then

sino alrevés:

Código Delphi [-]
if frm1 = nil then

// Saludos

uper 01-07-2005 19:57:35

muy bien pero, si cierro la ventana segunda ya no se vuelve a cargar, debo de cerrar la primer ventana y solo a si me vuleve a abrir la segunda ventana, el codigo corregido es este:
if frm2 <> nil thenbegin frm2 := Tfrm2 .Create(Self); frm2 .Show;end;
frm1 pricipal ventana
frm2 segunda ventana
gracias

roman 01-07-2005 20:23:46

A ver. Creo que ya nos liamos.

El código que pones no es correcto según la aclaración que hice en el último mensaje.

En frm1, para abrir el segundo formulario pones:


Código Delphi [-]
if frm2 = nil then
begin
  frm2 := Tfrm2.Create(Self);
end;

frm2.Show;

En el evento OnClose del segundo formulario pones:


Código Delphi [-]
procedure Tfrm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  frm2 := nil;
end;

Si el segundo formulario está abierto entonces frm2 es distinto de nil y la condición en el primer código evita que se cree de nuevo.

Cuando cierras el segundo formulario, la asignación Action := caFree hace que el formulario se destruya y la asignación frm2 := nil vuelve a poner a nil la variable con la que te refieres al formulario. Entonces, cuando vuelves a intentar abrirlo, la condición (frm2 = nil) es ahora cierta y se vuelve a crear.

En cualquiera de los dos casos el formulario se muestra. Si ya existía, frm2.Show garantiza que se ponga al frente en caso de haber estado oculto por otra ventana.

// Saludos


La franja horaria es GMT +2. Ahora son las 16:31:50.

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