Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Cerrar un Form MDI al abrir otro MDI (https://www.clubdelphi.com/foros/showthread.php?t=34578)

David 14-08-2006 19:58:21

Cerrar un Form MDI al abrir otro MDI
 
hola

Tengo una aplicación , en la que voy a convertir los forms en mdi child para que se vean dentro del MDI Form principal . El caso es que quiero que cuando uno le de al botón para abrir un form mdi , se cierre el que ya esta .

Entonces , no sé que código poner y donde ponerlo , he pensado que quizás un TApplicationEvents puede ser útil en su propiedad , onidle , pero no sé si es mejor poner algún tipo de procedimiento , en el botón de apertura de todos los forms , y que código tendria que poner . Por que estos forms mdi , llaman a otros forms ShowModal , para buscar clientes , articulos , etc... obviamente , sólo tienen que cerrarse los MDI Child .

maeyanes 14-08-2006 20:13:28

Esto que te voy a poner no lo he probado, pero debería funcionar...

Código Delphi [-]
procedure TMDIForm.Button1OnClick(Sender: TObject);
begin
  ActiveMDIChild.Close; // Cerrar la ventana MDI Activa (la que tiene el foco)
  FNewMDIChild := TMDIChildForm.Create(Application) // Crea una nueva forma MDI
end;


Saludos...

David 14-08-2006 20:29:41

Veo que podria funcionar , pero me pregunto que si tengo muchos botones , tendria que poner este código en todos ellos , no habría alguna forma de ponerlo sólo una vez .

maeyanes 14-08-2006 20:55:18

Si todas tus formas MDIChild son iguales (por ejemplo, archivos de texto para editar), puedes usar el mismo evento para todos los botones.

Si tus formas MDIChild varian entre si (varias formas del tipo fsMDIChild), necesitas una forma de saber cual es exactamente la forma que vas a crear y mostrar. Esto lo puedes lograr con un arreglo conteniendo las clases de las formas:

Código Delphi [-]
cont
  MDIChildrenClass: array [0..2] of TFormClass = (TMDIChild1, TMDIChild2, TMDIChild3);

Luego a cada botón en su propiedad Tag le pones un número, el cual va a representar el índice de la forma en el arreglo de clases. Luego creas un evento OnClick y se lo asignas a todos los botones y en el código pones algo como:

Código Delphi [-]
procedure TMDIForm.AllButtonClick(Sender: TObject);
var
  NewMDIForm: TForm;

begin
  Self.ActiveMDIChild.Close;
  NewMDIForm := MDIChildrenClass[TButton(Sender).Tag].Create(Application)
end;

Ya con esto deberías obtener la forma correcta de acuerdo al botón que oprimas. Claro que existen varias formas de lograr esto, pero es la que se me ocurrió de momento.


Saludos...

David 17-08-2006 14:00:48

Cuando hago esto , el caso es que si tengo abierto un formulario , por ejemplo TFrmVentas , y le doy otra vez al botón de abrir Ventas , este formulario que ya esta se cierra y se vuelve a cargar , cuando si el formulario que esta activo , el MDIActiveChild , se le da al botón otra vez , quiero que lo único que haga es mirar sino esta maximizado y si esta que no haga nada y sino esta , pues que lo maximize , pero que no lo cierre y vuelva a crear .

He creado el siguiente procedure :

Código Delphi [-]
procedure TFomPrincipal.CerrarMDI;
 var
  i : integer;
  F : TForm;
 begin
 For i := Screen.FormCount -1 downto 0 do
    begin
        F := Screen.Forms[i];
        if F.FormStyle = fsMDIChild then
         ActiveMDIChild.Close;
    end;
 end;

Abrí que poner algo para evitar que se cierre el formulario que esta activo , al darle otra vez al bóton , para ello no sé que código poner , eso si , habría que pasarle un parametro al procedure , algo asi como procedure (F:TForm);

A ver si alguien puede ayudarme .

maeyanes 17-08-2006 15:37:41

Prueba con esta variación al evento AllButtonClick anterior:

Código Delphi [-]
procedure TMDIForm.AllButtonClick(Sender: TObject);
var
  NewMDIForm: TForm;

begin
  if Self.ActiveMDIChild is MDIChildrenClass[TButton(Sender).Tag] then
  begin
    if ActiveMDIChild.WindowsState = wsMinimized then
      ActiveMDIChild.WindowsState = wsNormal
  end
  else
  begin
    Self.ActiveMDIChild.Close
    NewMDIForm := MDIChildrenClass[TButton(Sender).Tag].Create(Application)
  end
end;

Aquí lo que se hace es que si la clase de la forma que está abierta es la misma de la que quieres abrir, solamente restaura la forma si esta se encuentra minimizada. Si es diferente, entonces realiza el código de cerrar la activa y crear la nueva.

Saludos...

David 17-08-2006 15:59:02

Va bien , pero falla cuando no hay ningún MDIActive en el Form .

Cuando llega a esta linea

Código Delphi [-]
Self.ActiveMDIChild.Close

Da error sino encuentra otro ActiveMDIChild , habría que poner algo , un if ... then , pero no sé que poner para que si no hay ningún MDIChildForm de error .

maeyanes 17-08-2006 18:14:37

Cierto, se me pasó ese detalle, aquí te va una versión que toma en cuenta ese pequeño error...

Código Delphi [-]
procedure TMDIForm.AllButtonClick(Sender: TObject);
var
  NewMDIForm: TForm;

begin
  if Self.ActiveMDIChild is MDIChildrenClass[TButton(Sender).Tag] then
  begin
    if ActiveMDIChild.WindowsState = wsMinimized then
      ActiveMDIChild.WindowsState = wsNormal
  end
  else
  begin
    if Assigned(Self.ActiveMDIChild) then // Agrega esta línea para verificar si existe una forma MDIChild activa.
      Self.ActiveMDIChild.Close;
    NewMDIForm := MDIChildrenClass[TButton(Sender).Tag].Create(Application)
  end
end;


La franja horaria es GMT +2. Ahora son las 11:45:10.

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