Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   formularios mdi (https://www.clubdelphi.com/foros/showthread.php?t=5335)

tango01 18-11-2003 16:44:28

formularios mdi
 
hola gente.

quiero guardar en la posicion, el tamaño, y si estaban visibles los form mdi child

para eso en el evento on Destroy del form:

procedure TfSesion.FormDestroy(Sender: TObject);
begin
self.customizer.saveForm(self);
end;

donde el saveform:

procedure Tcustomizer.saveForm(fm : Tform);
var
reg : Tregistry;
begin
reg := TRegistry.Create;
reg.RootKey := HKEY_CURRENT_USER;
reg.OpenKey(self.key,true);


reg.WriteInteger(self.Cifrar('TOP'),fm.Top);
reg.WriteInteger(self.Cifrar('LEFT'),fm.Left);
reg.WriteInteger(self.Cifrar('HEIGHT'),fm.Height);
reg.WriteInteger(self.Cifrar('WIDTH'),fm.Width);

if fm.Showing then
reg.WriteInteger(self.Cifrar('VISIBLE'),1)
else
reg.WriteInteger(self.Cifrar('VISIBLE'),0);

reg.CloseKey

end;

el problema que tengo es que siempre el metodo fm.showing es TRUE.

todos los forms tienen en el evento close:

procedure TfSesion.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ShowWindow(self.Handle, SW_HIDE);
end;

¿como puedo saber si se estaba mostrando o no un formulario mdi child en el momento de destruirlo?

gracias de antemano por su ayuda.

Saludos,

Federico, Mar del Plata, Argentina.-

roman 18-11-2003 17:14:01

¿Por qué no usas la propiedad Visible del formulario en lugar de Showing?

// Saludos

tango01 18-11-2003 17:19:05

porque con los formularios mdi childs no se puede.

gracias igual.

sigo intentando sin exito :(

roman 18-11-2003 17:25:10

Cierto, debí pensarlo mejor, pero entonces ¿a qué te refieres con que estén visibles o no? ¿Cómo los ocultas?

// Saludos

tango01 18-11-2003 17:32:57

procedure TfSesion.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ShowWindow(self.Handle, SW_HIDE);
end;

delphi.com.ar 18-11-2003 17:35:51

IsWindowVisible(Handle) ???

delphi.com.ar 18-11-2003 17:39:40

Cita:

tango01 comentó:
procedure TfSesion.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ShowWindow(self.Handle, SW_HIDE);
end;

¿Que logras con esto?... en una simple prueba no noté ningún cambio..

roman 18-11-2003 17:42:07

Además de lo que dice dca podrías, crearle al formulario la propiedad IsVisible que pondrías en false al momento de ocultarlo:

Código:

procedure TfSesion.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ShowWindow(self.Handle, SW_HIDE);
  IsVisible := false;
end;

y en true al momento de mostrarlo. Es una manera de 'emular' la propiedad Visible que no funciona en los formularios MDI Child.

// Saludos

delphi.com.ar 18-11-2003 17:45:46

Les comento que en un Win98 la ventana no se oculta, se minimiza como de costumbre! (al menos eso me sucede a mi)

roman 18-11-2003 17:51:32

Cita:

delphi.com.ar comentó:
Les comento que en un Win98 la ventana no se oculta, se minimiza como de costumbre! (al menos eso me sucede a mi)
Mismo comentario para Win2000.

Sin embargo hace no mucho se preguntó cómo esconder un formulario mdi child y creo que di una forma de hacerlo. Pero no recuerdo ni cómo ni el hilo :D

... seguiré buscando

// Saludos

roman 18-11-2003 17:58:44

¡Vaya! Pues es curioso. ShowWindow funciona si se ejecuta desde otro lado (el OnClick de un botón por ejemplo) pero no desde OnClose.

Quizá tango01 nos pueda decir cómo le está haciendo.

// Saludos

tango01 18-11-2003 18:09:34

hola gracias por su ayuda.

les comento:

la forma de ocultar el formulario es con el siguiente codigo en el evento formClose de los formularios:

procedure TfSesion.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ShowWindow(self.Handle, SW_HIDE);
end;

Estoy usando Windows XP y se oculta correctamente.

La funcion IsWindowVisible me da siempre FALSE.

con lo cual sigo intentando sin Exito.

gracias de nuevo.

tango01 18-11-2003 18:13:06

Cita:

roman comentó:

IsVisible := false;

esa propiedad no la tengo. uso Delphi 7.

saludos

roman 18-11-2003 18:15:44

Cita:

tango01 comentó:
esa propiedad no la tengo. uso Delphi 7.

Ya sé que no existe. Lo que digo es que tú se la añadas:

Código:

TChildForm = class(TForm)
public
  IsVisible: Boolean;
end;

Cuando muestres el formulario la pones en true y cuando lo ocultes la pones en false y cuando guardes en el registro revisas el valor de esta propiedad.

// Saludos

roman 18-11-2003 18:19:24

Por cierto, a menos que pienses que tu aplicación se ejecutará siempre en WinXP, sería recomendable que veras cómo hacer que funcione correctamente en otras versiones de Windows.

// Saludos

tango01 18-11-2003 18:22:02

Gracias roman, la verdad es que no queria llegar a esa instancia de agregar a todos los form un atributo más.

pero viendo que no hay muchas opciones a la vista tendré que hacerlo.

gracias.

saludos

roman 18-11-2003 18:28:31

Cita:

tango01 comentó:
Gracias roman, la verdad es que no queria llegar a esa instancia de agregar a todos los form un atributo más.

Bueno, es que lo que yo haría es crear un formulario base para todos los mdi child que vayas a usar y descender de éste los demás:

Código:

TChildForm = class(TForm)
public
  IsVisible: Boolean;
end;

TChildForm1 = class(TChildForm)
  ...
end;

TChildForm2 = class(TChildForm)
  ..
end;

etc.

// Saludos

tango01 18-11-2003 18:30:24

va pensando lo bien, no me sirve crear un atributo nuevo.
tiene que ser un atriburo de la clase TForm ya que como el metodo es generico tengo que pasar como parametro un TForm.

La verdad pense que iba a ser mucho más sencillo esto. Que raro.

roman 18-11-2003 18:43:23

Cita:

tango01 comentó:
va pensando lo bien, no me sirve crear un atributo nuevo.
tiene que ser un atriburo de la clase TForm ya que como el metodo es generico tengo que pasar como parametro un TForm.

Pues no sé en qué forma estás diseñando la aplicación ni a qué método te refieres. Si te refieres al TCustumizer.SaveForm no veo cuál es el problema, simplemente verificas que el parámetro sea del tipo adecuado:

Código:

if fm is TChildForm then
begin
  if TChildForm(fm).IsVisible then
    reg.WriteInteger(self.Cifrar('VISIBLE'),1)
  else
    reg.WriteInteger(self.Cifrar('VISIBLE'),0)
end

Por otro lado, IsWindowVisible funciona en mi caso.

Ahora que, en el peor de los casos, si no deseas agregar una nueva propiedad a los formularios, aún te queda la opción de la propiedad Tag del formulario. Ponla en 0 al ocultarlo y en 1 al mostrarlo.

// Saludos

roman 18-11-2003 18:45:52

Un comentario aparte:

Yo me lo pensaría dos veces antes de esconder los formularios mdi. Si bien parece funcionar lo cierto es que para Delphi el formulario sigue visible y no sabes en qué momento se produzca algún error por engañar a Delphi.

// Saludos


La franja horaria es GMT +2. Ahora son las 19:03:42.

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