Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Evitar que un form se abra estando abierto (https://www.clubdelphi.com/foros/showthread.php?t=48170)

enecumene 18-09-2007 01:43:01

Evitar que un form se abra estando abierto
 
pues como el titulo lo dice, si en mi aplicacion el usuario tiene un form abierto o creado e intenta abrir el mismo form como hago para evitar que se abra avisandole a traves de un showmessage?

Saludos.

dec 18-09-2007 01:44:44

Hola,

Para saber si está creado... precisas comprobar la variable en que se guarda la instancia del objeto para ver si es "nil" o está asignada. Para ver si está visible... creo recordar que hay un método "Showing()" *, o si no tal vez te apañe la propia propiedad "Visible" de los formularios.

* Es una propiedad en realidad.

enecumene 18-09-2007 01:56:32

Gracias dec, hice esto:

Código Delphi [-]
procedure TFPedido.FormCreate(Sender: TObject);
begin
if FPedido.Showing = True then
BEGIN
  ShowMessage('Ya tienes Abierto este modulo!');
  Abort;
  end;
end;

y me tira un error, un classexception.

Saludos,

dec 18-09-2007 02:04:40

Hola,

Se me hace raro que compruebes en el "OnCreate" del formulario si este está visible... porque esté como esté por el "OnCreate" no pasará sino una vez... cuando se cree el formulario.

Pero lo mismo estoy desvariando. Lo que es seguro es que acaso antes de comprobar si el formulario está visible (con "ShowWing") deberías comprobar si realmente la variable "FPedido", en este caso, está asignada, no es "nil".

Porque si el formulario no está creado es evidente que no estará visible, y más aún, no puede accederse a las propiedades de un objeto que no ha sido creado.

seoane 18-09-2007 02:15:14

Una pregunta: ¿Hay alguna propiedad que nos permita diferenciar los formularios? El nombre, la clase, etc ...

Si es así puedes usar un bucle como este:
Código Delphi [-]
function Existe(Nombre: String): Boolean;
var
  i: integer;
begin
  for i:= 0 to Screen.FormCount - 1 Do
    if Screen.Forms[i].Name = Nombre then
    begin
      Result:= TRUE;
      Exit;
    end;
  Result:= FALSE;
end;
Y cuando crees o llames al formulario, podrías comprobar si existe. Yo no lo haría dentro del create del formulario.
Código Delphi [-]
if not Existe('Form1') then
begin
  // Aqui lo creas
end;

enecumene 18-09-2007 02:17:45

Disculpa dec, lo puse en el boton donde se abre el form y aun asi me sale el mismo error, para serte sincero no entendi mucho lo que me quisiste decir, perdon:o.

Saludos.

enecumene 18-09-2007 02:19:08

Gracias seoane dejame aplicarlo a ver si me funciona, luego te comento.

enecumene 18-09-2007 02:25:32

Gracias seoane!! me ha funcionado de maravillasel codigo me quedo asi:

Código Delphi [-]
procedure Tincio.BitBtn1Click(Sender: TObject);
begin
if not Existe('FPedido') then
begin
FPedido:=TFPedido.Create(self);
FPedido.Show;
end else
ShowMessage('Ya tienes abierto este Módulo!');
end;

Muchas Gracias, Saludos.

dec 18-09-2007 02:39:02

Hola,

Cita:

Empezado por enecumene
Disculpa dec, lo puse en el boton donde se abre el form y aun asi me sale el mismo error, para serte sincero no entendi mucho lo que me quisiste decir, perdon.

Bueno... lo cierto es que hoy ando algo más espeso de la cuenta... no voy ni a releer lo que he escrito, no vaya a ser que ni yo mismo lo entienda. :D

PD. La idea de Seoane me parece estupenda, como no podía ser de otro modo. :)

Neftali [Germán.Estévez] 18-09-2007 09:49:17

Otra opción puede ser utilizar la propia variable del formulario.

Código Delphi [-]
procedure Tincio.BitBtn1Click(Sender: TObject);
begin
if not Assigned(FPedido) then begin
  FPedido:=TFPedido.Create(self);
  FPedido.Show;
end 
else begin
  ShowMessage('Ya tienes abierto este Módulo!');
end;

Al cerrar el formulario hay que asegurar se de colocar la variable a nil.

gluglu 18-09-2007 10:10:07

... y por qué siquiera avisar de que lo tiene abierto ? Se muestra y ya está.

Código Delphi [-]
procedure Tincio.BitBtn1Click(Sender: TObject);
begin
  if not Assigned(FPedido) then FPedido := TFPedido.Create(self);
  FPedido.Show;
end;

... y en el caso de MDI o si se permite minizar el Form :

Código Delphi [-]
procedure Tincio.BitBtn1Click(Sender: TObject);
begin
  if not Assigned(FPedido) then FPedido := TFPedido.Create(self);
  FPedido.Show;
  if FPedido.WindowState = wsMinimized then
    FPedido.WindowState := wsNormal;
end;

Y edito y añado :

Como decía Neftalí, tienes que recordar poner la variable a nil en el OnClose de FPedido :
Código Delphi [-]
procedure TFPedido.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  Action := caFree;
  FPedido := nil;
end;
... o utilizar FreeAndNil.

enecumene 18-09-2007 16:38:39

Muchas Gracias Neftali y Gluglu tambien me han servido sus sugerencias, muchas gracias...


La franja horaria es GMT +2. Ahora son las 09:33: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