PDA

Ver la Versión Completa : Como evito abrir 2 veces el mismo form?


daragor
04-10-2012, 23:29:30
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:


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:

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:

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
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:

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
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 :


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
Igual no lo estoy entendiendo bien, pero no sería sufuciente con esto :

Código Delphi [-] (http://www.clubdelphi.com/foros/#)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

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

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:



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