Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Lazarus, FreePascal, Kylix, etc. (https://www.clubdelphi.com/foros/forumdisplay.php?f=14)
-   -   Como evito abrir 2 veces el mismo form? (https://www.clubdelphi.com/foros/showthread.php?t=81048)

daragor 04-10-2012 23:29:30

Como evito abrir 2 veces el mismo form?
 
Hola compañeros, de nuevo.. como podria hacer en un Menu x ejemplo para que no se abra 2 veces el mismo form.. El codigo que estoy usando para llamar a un formulario es asi:

Código Delphi [-]
procedure Tfmain.musersClick(Sender: TObject);
begin
  ABM_users:= TABM_users.Create(Self);
  ABM_users.Show;
  estado.SimpleText:='Activado: Gestión de Usuarios del Sistema.';
end;

He probado cambiar a Showmodal, y en efecto! no se abren 2 pero solo puedo abrir ese! es decir no puedo abrir 2 forms distintos al mismo tiempo, espero me entiendan, muchas gracias!

ecfisa 05-10-2012 00:11:58

Hola daragor.

No uso Lazarus, pero supongo que este código tiene que funcionarte:
Código Delphi [-]
procedure ShowTheForm(FormClass: TFormClass);
var
  i: Integer;
begin
  i:= Screen.FormCount-1;
  while (i > 0) and not (Screen.Forms[i] is FormClass) do Dec(i);
  if Screen.Forms[i] is FormClass then
    Screen.Forms[i].Show
  else
    FormClass.Create(Application).Show;
end;

Ejemplo de llamada:
Código Delphi [-]
procedure Tfmain.musersClick(Sender: TObject);
begin
  ShowTheForm(TABM_users);
end;

Saludos. :)

daragor 05-10-2012 00:27:56

Excelente!! lo voy a probar y aviso asi queda valido, o no, para Lazarus! que es un clon de delphi claro está

daragor 05-10-2012 15:16:47

Funciona compañero ecfisa, solo q el objetivo es sobre un mismo form, no sobre todos los forms, es decir yo deberia poder abrir 2, 3, X formularios al mismo tiempo pero nunca el mismo..

ecfisa 05-10-2012 18:44:59

Cita:

Empezado por daragor (Mensaje 446434)
Funciona compañero ecfisa, solo q el objetivo es sobre un mismo form, no sobre todos los forms, es decir yo deberia poder abrir 2, 3, X formularios al mismo tiempo pero nunca el mismo..

Hola daragor.

No entiendo... El código precisamente hace eso, evitar que se pueda volver a crear un form ya creado pero no impide que hagas:
Código Delphi [-]
  ShowTheForm(TForm1);
  ShowTheForm(TForm2);
  ShowTheForm(TForm3);
  ...
Es decir que podes habrir 1, 2, 3, ..., N forms llamando procedimiento, pero evitará que existan dos instancias del mismo a la vez.

Saludos.:)

userlazarus 07-10-2012 13:35:37

Hola,

Prueba con este componente en cada uno de los fprmularios : http://wiki.freepascal.org/UniqueInstance

Casimiro Notevi 07-10-2012 14:40:53

Cita:

Empezado por userlazarus (Mensaje 446570)
Prueba con este componente en cada uno de los fprmularios : http://wiki.freepascal.org/UniqueInstance

Pero ese componente es para evitar más de una instancia del programa, no tiene nada que ver con formularios.

userlazarus 07-10-2012 17:45:21

Cierto, error mío, no sirve para los formularios.

userlazarus 07-10-2012 18:48:55

Igual no lo estoy entendiendo bien, pero no sería sufuciente con esto :

Código Delphi [-]
procedure Tfmain.musersClick(Sender: TObject);
begin
if not assigned(ABM_users) then
begin
ABM_users:= TABM_users.Create(Self);
end;
end;

daragor 09-10-2012 17:15:04

ecfisa , cuando abro otro formulario cierra el que se esta mostrando entonces no puedo tener 2 forms abiertos al mismo tiempo, por ej. compras y productos abiertos

ecfisa 09-10-2012 21:17:13

Hola daragor.

El procedimiento que te puse no cierra ningún form, por lo que supongo que se deben estar solapando (el último abierto sobre el anterior).

Saludos.

anubis 14-08-2016 01:07:10

Cita:

Empezado por userlazarus (Mensaje 446595)
Igual no lo estoy entendiendo bien, pero no sería sufuciente con esto :

Código Delphi [-]procedure Tfmain.musersClick(Sender: TObject);
begin
if not assigned(ABM_users) then
begin
ABM_users:= TABM_users.Create(Self);
end;
end;

Hola, perdonad que reabra este post tan antiguo. Ya he probado el codigo anterior y funciona, solo que si cierro el formulario no deja volver a abrirlo.
Hay alguna forma de desasignarlo?.

mi codigo es este

Código Delphi [-]
if not assigned(finventarios) then
  begin
  finventarios:=tfinventarios.Create(self);
  finventarios.Parent:=CONTENEDOR;// es un panel donde abro los forms.
  finventarios.Show;
  end;

anubis 14-08-2016 03:39:13

Bueno, como ya no puedo editar mi propio mensaje, tengo que poner otro.

Ya probe lo que ponian en otro post

en el form hijo, le tengo que poner

Código Delphi [-]
finventarios.close;
finventarios.free;

Lo unico que he tenido que quitar del form es finventarios.free porque da error al cerrar.

AgustinOrtu 14-08-2016 09:37:07

Al parecer usan variables globales para crear los forms. Eso siempre da problemas

El bloque de código idiomático para crear y mostrar un form es:

Código Delphi [-]

procedure Foo;
var
  UnForm: TUnForm;
begin
  UnForm := TUnForm.Create(OwnerDelForm/nil);
  UnForm.Show/ShowModal;
end;

Si pasamos un owner que se encarga de liberar la memoria no hace falta más nada. Si pasamos nil y se invoca a ShowModal se debe usar un bloque try-finally para liberar el form; sino si se invoca a Show se debe interceptar el evento OnClose y asignar al parámetro Action el valor caFree

Más específicamente, yo suelo usar un ancestro que no es TForm en donde asigno caFree en el OnClose y siempre heredo de este form. De esta manera funciona bien siempre, incluso si implementa una interface. Recordando que TForm es heredero de TComponent por lo que el mecanismo de reference counting esta deshabilitado y se debe manejar la memoria manualmente


La franja horaria es GMT +2. Ahora son las 12:49:34.

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