Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > Lazarus, FreePascal, Kylix, etc.
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-10-2012
daragor daragor is offline
Miembro
NULL
 
Registrado: ago 2012
Posts: 91
Poder: 12
daragor Va por buen camino
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!
__________________
Mi Blog: Webscom (Software libre)
Responder Con Cita
  #2  
Antiguo 05-10-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 05-10-2012
daragor daragor is offline
Miembro
NULL
 
Registrado: ago 2012
Posts: 91
Poder: 12
daragor Va por buen camino
Excelente!! lo voy a probar y aviso asi queda valido, o no, para Lazarus! que es un clon de delphi claro está
__________________
Mi Blog: Webscom (Software libre)
Responder Con Cita
  #4  
Antiguo 05-10-2012
daragor daragor is offline
Miembro
NULL
 
Registrado: ago 2012
Posts: 91
Poder: 12
daragor Va por buen camino
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..
__________________
Mi Blog: Webscom (Software libre)
Responder Con Cita
  #5  
Antiguo 05-10-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por daragor Ver Mensaje
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #6  
Antiguo 07-10-2012
userlazarus userlazarus is offline
Miembro
 
Registrado: abr 2006
Posts: 55
Poder: 19
userlazarus Va por buen camino
Hola,

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

Responder Con Cita
  #7  
Antiguo 07-10-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por userlazarus Ver Mensaje
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.
Responder Con Cita
  #8  
Antiguo 07-10-2012
userlazarus userlazarus is offline
Miembro
 
Registrado: abr 2006
Posts: 55
Poder: 19
userlazarus Va por buen camino
Cierto, error mío, no sirve para los formularios.
__________________

Responder Con Cita
  #9  
Antiguo 07-10-2012
userlazarus userlazarus is offline
Miembro
 
Registrado: abr 2006
Posts: 55
Poder: 19
userlazarus Va por buen camino
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;
__________________


Última edición por userlazarus fecha: 07-10-2012 a las 18:53:37.
Responder Con Cita
  #10  
Antiguo 09-10-2012
daragor daragor is offline
Miembro
NULL
 
Registrado: ago 2012
Posts: 91
Poder: 12
daragor Va por buen camino
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
__________________
Mi Blog: Webscom (Software libre)
Responder Con Cita
  #11  
Antiguo 09-10-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #12  
Antiguo 14-08-2016
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Cita:
Empezado por userlazarus Ver Mensaje
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;
Responder Con Cita
  #13  
Antiguo 14-08-2016
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
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.
Responder Con Cita
  #14  
Antiguo 14-08-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
¿Como evito que el Form principal se "cuelgue" con procesos? bruykari Varios 5 24-02-2010 16:39:45
Error Al Crear Varias Veces El Mismo Form ManuelPerez Varios 7 18-09-2007 21:31:02
Abrir a la vez el mismo form con diferentes datos Sayuri Varios 7 12-08-2005 17:28:41
Abrir un Form tantas veces como desee jorodgar Servers 3 20-04-2005 09:07:43
Abrir varias veces el mismo form Phacko Varios 7 25-09-2004 05:22:01


La franja horaria es GMT +2. Ahora son las 09:26:18.


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
Copyright 1996-2007 Club Delphi