Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-08-2006
[David] David is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Málaga
Posts: 417
Poder: 21
David Va por buen camino
Cool 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 .
Responder Con Cita
  #2  
Antiguo 14-08-2006
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
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...
Responder Con Cita
  #3  
Antiguo 14-08-2006
[David] David is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Málaga
Posts: 417
Poder: 21
David Va por buen camino
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 .
Responder Con Cita
  #4  
Antiguo 14-08-2006
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
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...
Responder Con Cita
  #5  
Antiguo 17-08-2006
[David] David is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Málaga
Posts: 417
Poder: 21
David Va por buen camino
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 .
Responder Con Cita
  #6  
Antiguo 17-08-2006
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
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...
Responder Con Cita
  #7  
Antiguo 17-08-2006
[David] David is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Málaga
Posts: 417
Poder: 21
David Va por buen camino
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 .
Responder Con Cita
  #8  
Antiguo 17-08-2006
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
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;

Última edición por maeyanes fecha: 17-08-2006 a las 18:24:16.
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
Imposible hacer visible un form desde otro form SMTZ .NET 13 16-01-2006 21:41:08
como abrir y cerrar unidades CDROM JoseQ API de Windows 4 13-12-2004 19:30:46
Cerrar mi programa desde otro Sr_Sombrero API de Windows 2 02-12-2004 22:12:09
Cerrar un Form scooterjgm OOP 5 18-11-2004 11:27:33
Abrir y cerrar MDI MaJeSTiC Varios 2 03-08-2004 21:00:29


La franja horaria es GMT +2. Ahora son las 13:58:55.


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