Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   al minimizar un MDIChild este no se activa correctamente (https://www.clubdelphi.com/foros/showthread.php?t=80345)

_CALI 20-09-2012 02:22:22

al minimizar un MDIChild este no se activa correctamente
 
Hola y gracias como siempre,
tengo un problema al minimizar un Formulario MDIChild en una aplicación MDI sencilla,
cuando llamo al formulario hijo y lo minimizo aparece activo (azulito), pero cuando abro mas formularios y trato de minizarlos estos no se activan, siempre aparece activo el primer formlario que minimize; me di cuenta que el mensaje WM_MDIACTIVATE no funciona, talvez deba sobreescribir algun procedimiento de ventana en fin, agradesco de antemano su ayuda

Gracias

movorack 20-09-2012 02:51:17

Hola, sería bueno que compartieras un poco del código que usas. Podrias estar minimizando un form modal y eso impediría que interactues con el resto de la aplicación hasta que no reciba la respuesta del modal

AzidRain 20-09-2012 03:58:52

Si fuera modal no podria abrir mas ventanas, falta código para descifrarlo.

_CALI 20-09-2012 04:34:54

gracias por su pronta respuesta, en realidad trabajo con dos formularios,
uno que es principal y el otro que es Hijo, es una aplicación básica MDI, ninguno es Modal.

MainForm FormStyle: fsMDIForm
FrmChild: FormStyle: fsMDIChild

en donde en el formulario principal (MainForm)tengo un menu al cual llamo al hijo de la ste manera:

Código Delphi [-]
procedure TFrmMain.MDIChild1Click(Sender: TObject);
begin
FrmChild := TFrmChild.Create(Application);
end;

cuando ejecuto la aplicacion... primero llamo al hijo y lo minimizo hasta ahi Ok,
pero cuando vuelvo a llamar al hijo o mejor dicho creo otra instancia del mismo y lo minimizo ahi esta el problema,
se minimiza bien pero este ultimo deberia estar activo, sin embargo el formulario minimizado previamente sige teniendo el foco o su barra de titulo sige activa (azul fuerte) por decirlo de otra manera, cuando el ultimo formulario minizado deberia estar activo

es una llamada básica al hijo, incluso note que en los demos que viene delphi con respecto a aplicaiones MDI tienen el mismo problema.

ecfisa 20-09-2012 05:28:41

Cita:

Es una llamada básica al hijo...
Hola _CALI.

De esa forma permite abrir mas de una instancia del mismo MDIChild cosa que normalmente no es deseable.

Para crear o activar el minimizado:
Código Delphi [-]
(* Crear MDIChild  *)
procedure TfrmMDIForm.AbrirMDIChild(AClass: TFormClass);
var
  i: Integer;
begin
  for i:= MDIChildCount-1 downto 0 do
    if MDIChildren[i] is AClass then                   //  ¿ Se encontro ?
    begin
      if MDIChildren[i].WindowState = wsMinimized then // ¿ Minimizado ?
        MDIChildren[i].WindowState:= wsNormal;         // => Restaurar
      Exit; // nada mas que hacer aquí...
    end;
  // no se encontró => Crearlo y traerlo al frente
  with AClass.Create(Self) do
    BringToFront;
end;
De este modo, si el MDIChild ya fué creado lo restaura, si no crea una nueva instancia.


Si deseas que el form que es llamado quede seleccionado y permanezca minimizado en lugar de restaurarse, sólo cambiá por la línea en negrita:
Código Delphi [-]
(* Crear MDIChild  *)
procedure TfrmMDIForm.AbrirMDIChild(AClass: TFormClass);
var
  i: Integer;
begin
  for i:= MDIChildCount-1 downto 0 do
    if MDIChildren[i] is AClass then                   //  ¿ Se encontro ?
    begin
      if MDIChildren[i].WindowState = wsMinimized then // ¿ Minimizado ?
       MDIChildren[i].Show;      
      Exit; // nada mas que hacer aquí...
    end;
  // no se encontró => Crearlo y traerlo al frente
  with AClass.Create(Self) do
    BringToFront;
end;

Llamada ejemplo: (para ambos casos)
Código Delphi [-]
procedure TfrmMDIForm.ToolButton1Click(Sender: TObject);
begin
  AbrirMDIChild(TfrmMDIChild1);
end;

Saludos. :)

_CALI 20-09-2012 06:05:40

Gracias ecfisa
 
El bringToFront soluciona en parte mi problema , me dio la idea atraves de tu código he interceptar el mensaje WM_SYSCOMMAND
del formulario hijo, resuelve en parte mi problema puesto que si hay formularios hijo abiertos (no minimizados estos ahora se quedan inactivos y el minizado esta activo), estoy cerca gracias denuevo.


Código Delphi [-]
procedure TFrmChild.WMSYSCommand(var Message: TWMSYSCommand);
begin
inherited;
if Message.CmdType = SC_MINIMIZE then
   BringToFront;

end;

_CALI 20-09-2012 06:36:31

bueno aqui solucione mi problema
 
Código Delphi [-]
procedure TFrmChild.WMSYSCommand(var Message: TWMSYSCommand);
begin
inherited;
if Message.CmdType = SC_MINIMIZE then
  if Application.MainForm.ActiveMDIChild.WindowState = wsMinimized then
     BringToFront;
// SetWindowPos(Self.Handle,HWND_TOP,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE);
end;

si hay alhuna otra respuesta agredecere mucho


La franja horaria es GMT +2. Ahora son las 13:18:06.

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