Recent

Author Topic: Solicito consejo, que método usan para no abrir 2 veces el mismo formulario  (Read 8081 times)

daragor

  • Jr. Member
  • **
  • Posts: 66
    • Blog Webscom
Amigos de lazarus recurro a uds despues de haber buscado en este foro spanish una solucion certera el tema
Estoy usando un spktoolbar (que para mi le faltan muchas cosas por mejorar) y quiero.. que al hacer clic en un boton que llama o abre un form, de alguna manera NO permita que se vuelva a abrir el mismo form, de hecha hasta podria NO permitir q se abra ningun otro form, solo el activo...

cabe aclarar que uso el metodo Show y no Showmodal, porque estoy trabajando con paneles... entonces si yo abro ese form con showmodal en un panel del form principal, esta perfecto, pero no puedo hacer clic en ningun lado! queda bloqueado todo, si pudiera solucionar esto ya seria una solución valida a lo planteado.

... en fin acudo a su experiencia para brindarme una solución de paso que quede en el foro como referencia

muchas gracias!
« Last Edit: October 16, 2021, 04:56:44 pm by daragor »
Inculcando el software libre.
https://www.webscom.com.ar

Edson

  • Hero Member
  • *****
  • Posts: 1296
Hola.

¿Por qué no usas una bandera booleana como "FormularioAbierto"?
Esta bandera la puedes activar en el evento OnLoad() y desactivarla (ponerla a FALSE) en el evento OnClose().

Luego, antes de abrir cualquier formulario, el código debe verificar el estado de "FormularioAbierto" para ver si se permite o no abrir otro formulario.
Lazarus 2.2.6 - FPC 3.2.2 - x86_64-win64 on Windows 10

PINO72

  • Newbie
  • Posts: 6
Buenas tardes.

Consulta la asignación de la variable que alberga el formulario, si está ya asignada (assigned(<variable-formulario>), utiliza el evento <variable-formulario>.bringtofront y si no está asignada creas el formulario por primera vez.

Para que funcione correctamente, tienes que liberar en memoria la variable utilizada con FreeAndNil(<variable-formulario>).


Saludos.
« Last Edit: October 17, 2021, 04:03:52 pm by PINO72 »

daragor

  • Jr. Member
  • **
  • Posts: 66
    • Blog Webscom
Gracias por sus respuestas muchachos, he visto todo tipo de propuestas en diversos foros, .. he optado por la opcion simple del compañero Edson

Creo una variable global, setteo en vacia, cada vez q abro un form le coloco el nombre, y listo.. al cerrar el form vuelvo la variable a vacia.

Code: Pascal  [Select][+][-]
  1. procedure Tf_main.newplayerBTNClick(Sender: TObject);
  2. begin
  3.   if abierto = '' then // ninguno
  4.   begin
  5.     // Configs
  6.     abierto:= 'Agregar Jugador';
  7.     f_amjug:=Tf_amjug.Create(self);
  8.     f_amjug.txt_info.Caption:= 'Agregando un Nuevo Jugador/ra';
  9.     f_amjug.Parent:= Panel1;
  10.     f_amjug.Show;
  11.   end else
  12.      ShowMessage('La Pantalla :'+abierto+': ya se encuentra abierta.');
  13. end;
  14.  

Cabe aclarar que este codigo siemple tambien impediría que se abra otro formulario, no solo el mismo, es decir no se abre ningun otro mientras haya uno abierto. Claro que el codigo lo pueden adaptar a sus necesidades, es mas facil de lo que pensé.

A mi lo que me gustaria es transformarlo en una función para usar de manera mas simple en el codigo, si alguien tiene ganas bienvenido sea!

« Last Edit: October 18, 2021, 07:23:37 pm by daragor »
Inculcando el software libre.
https://www.webscom.com.ar

BlueIcaro

  • Hero Member
  • *****
  • Posts: 791
    • Blog personal
Hola, en lugar de usar una variable, puedes localizar el formulario, en el caso que no esté creado, lo creas, sino lo vuelves a mostrar.
Algo así:
Code: [Select]
procedure TForm1.Button1Click(Sender: TObject);
var
  F: TForm2;
  T: TComponent;
begin
  t := Form1.FindComponent('Form2');
  if t <> nil then
  begin
    with T as TForm do
    begin
      Show;
    end;
  end
  else
  begin
    F := Tform2.Create(Self);
    F.Show;
  end;
end;                           
Con esto te ahorras tener una variable por formulario que crees.
Saludos
/BlueIcaro
P.D. Es un código de ejemplo, lo ideal sería comprobar que el componente encontrado es un formulario. Y alguno "seguridad" más, como usar try finnally

daragor

  • Jr. Member
  • **
  • Posts: 66
    • Blog Webscom
Gracias por el aporte BlueIcaro!
Inculcando el software libre.
https://www.webscom.com.ar

f-javier

  • Newbie
  • Posts: 1
Yo no tengo los formularios en auto-create y los gestiono de la siguiente manera:

procedure TformularioPrincipal.OpcionItemCompaniasClick(Sender: TObject);
begin
  if not Assigned(formularioCompanias) then
     formularioCompanias := TFormularioCompanias.Create(Application);
  formularioCompanias.Show;
end;

Si no está creado, lo crea y lo muestra. Si está creado, sólo lo muestra.

 

TinyPortal © 2005-2018