Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-12-2012
_CALI _CALI is offline
Miembro
 
Registrado: mar 2008
Posts: 99
Poder: 17
_CALI Va por buen camino
mantener un panel siempre al fondo en mdi aplicación

Hola amigos, gusto como siempre,

tengo una aplicación MDI con un panel de fondo de contenedor de otros controles,
como hago para mantener el panel siempre al fondo de los demas formularios??
tengo esto:

Código Delphi [-]
procedure TPanel.Loaded;
begin
  inherited;
  Windows.SetParent(Handle, MainForm.ClientHandle);
end;
 
procedure TPanel.WMWindowPosChanging(var Message: TWMWindowPosChanging);
begin
 inherited;
 Message.WindowPos^.hwndInsertAfter := HWND_BOTTOM;
end;


Aparentemente con esto bastaría, pero cuando cambio de formularios mediante el menu de sistema en la opción "siguiente", el panel se sobreposiciona sobre el formulario que cambie, podria ser manejando el mensaje que llama al siguiente formulario, pero mmm nose, me gustaria si con el mensaje wm_windowposchanging del panel bastaria

Gracias

Última edición por _CALI fecha: 27-12-2012 a las 05:47:34.
Responder Con Cita
  #2  
Antiguo 27-12-2012
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
_CALI,

Cita:
Empezado por _CALI
Tengo una aplicación MDI con un panel de fondo de contenedor de otros controles, como hago para mantener el panel siempre al fondo de los demas formularios?
Revisa este código:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
   SetWindowPos(Self.Handle,HWND_BOTTOM, 0, 0, 0, 0, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
end;
El código anterior mantiene el formulario en la última posición del orden Z (Posición más baja), esto garantiza que nunca se superponga a otro formulario.

Revisa esta información:
Cita:
Empezado por Win32 Developer's References

SetWindowPos:

The SetWindowPos function changes the size, position, and Z order of a child, pop-up, or top-level window. Child, pop-up, and top-level windows are ordered according to their appearance on the screen. The topmost window receives the highest rank and is the first window in the Z order.

BOOL SetWindowPos(

HWND hWnd, // handle of window
HWND hWndInsertAfter, // placement-order handle
int X, // horizontal position
int Y, // vertical position
int cx, // width
int cy, // height
UINT uFlags // window-positioning flags
);
Espero sea útil

Nelson.
Responder Con Cita
  #3  
Antiguo 28-12-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola _CALI

Cuando diseñaron las aplicaciones Multiple Document Interface, la idea no fué que el MDIForm fuera contenedor de otros controles que MDIChilds, ToolBars o controles que posean la propiedad Align.

Un MDIChild se ubicará dentro del área cliente libre del MDIForm. Esta área consiste en todo el espacio no ocupado por controles alineados a alguno de los cuatro bordes (alBottom, alTop, alRight, alLeft).
Según entiendo, deseas que el TPanel quede por debajo de los MDIChilds, y por lo te mencioné arriba, no veo el modo de hacer lo que buscas con un control no alineado en un entorno MDI.
La solución más sencilla entonces, es darle alguna de esas alineaciones al TPanel y de ese modo los MDIChilds no serán solapados por él.

Otra alternativa que se me ocurre es ocultar el TPanel mientras exista al menos un MDIChild abierto y visualizarlo si no lo hay. Para evaluar esto, habrá que disparar y capturar algún evento cuando cualquiera de ellos se cierra.

Te adjunto un ejemplo que consta de un MDIForm y tres MDIChils que se comportan de este modo por que el código me parece un poco extenso para ser claro en un mensaje.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 10-04-2013 a las 20:18:35.
Responder Con Cita
  #4  
Antiguo 29-12-2012
_CALI _CALI is offline
Miembro
 
Registrado: mar 2008
Posts: 99
Poder: 17
_CALI Va por buen camino
Smile

Gracias por tu colaboración ecfisa y a los demás tambien,
Talvez no fui muy claro, pero lo que quiero es que el panel se muestre siempre el ultimo sitio del Z orden, asi hayan formularios hijos abiertos
Aquí les dejo la solucion que escribi:

la definición del panel esta en el formulario padre,
primero que nada hay que colocar un panel en el formulario padre y luego sobre el panel cualquier control
Código Delphi [-]
type
  TPanel = class(Vcl.ExtCtrls.TPanel)
  protected
   procedure Loaded; override;
   procedure WMWindowPosChanging(var Msg: TWMWindowPosChanging);
   message WM_WINDOWPOSCHANGING;
 end;
 
type
 TMain = class(TForm)
  ...
 
var
  Main: TMain;
 
implementation
 
procedure TPanel.Loaded;
begin
  inherited;
  Windows.SetParent(Handle, Main.ClientHandle);
end;
procedure TPanel.WMWindowPosChanging(var Msg: TWMWindowPosChanging);
begin
  if (Msg.WindowPos^.flags and SWP_NOZORDER) = 0 then
      Msg.WindowPos^.hwndInsertAfter := HWND_BOTTOM;
 inherited;
end;


luego en el formulario hijo...

Código Delphi [-]
const
 WM_GETACTIVEFORM = WM_USER + 100;
 
type
 TChild = class(TForm)
...
private
procedure WMWindowPosChanging(var Msg: TWMWindowPosChanging);
   message WM_WINDOWPOSCHANGING;
procedure WMGetActiveForm(var Msg: TMessage); 
   message WM_GETACTIVEFORM;

var
  Child: TChild;
 
implementation
 
procedure TChild.WMGetActiveForm(var Msg: TMessage);
var i: integer;
begin
 for i := 0 to MDIChildCount - 1 do
  begin
   if MDIChildren[i].WindowState <> wsMinimized then
      begin
      MDIChildren[i].BringToFront;
      Break;
      end;
  end;
end;
 
procedure TChild.WMWindowPosChanging(var Msg: TWMWindowPosChanging);
 begin 
 
       if Msg.windowpos^.hwndInsertAfter <> HWND_TOP  then
          begin
          Msg.windowpos^.hwndInsertAfter := HWND_TOP;
          PostMessage(Handle, WM_GETACTIVEFORM, 0, 0);
          end;

inherited;
end;

Manejando los mensajes WM_WINDOWPOSCHANGING del panel y el formulario hijo, se consige que el panel este siempre al fondo y otra cosa mas..

se dieron cuenta que cuando minimizan un formulario, este se queda como ActiveMDIChild?,
con un mensaje de ususario lo que hace es establecer el ActiveMDIChild del ultimo formulario activo al minimizarlo.


Saludos y Gracias denuevo !!!

Última edición por _CALI fecha: 29-12-2012 a las 04:08:43.
Responder Con Cita
  #5  
Antiguo 30-12-2012
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
_CALI,

Cita:
Empezado por _CALI
Tal vez no fui muy claro, pero lo que quiero es que el panel se muestre siempre el ultimo sitio del Z orden.
Esta aplicación implementa tu requerimiento:



Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ExtCtrls;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    Forms1: TMenuItem;
    Form21: TMenuItem;
    Form31: TMenuItem;
    Form41: TMenuItem;
    Exit1: TMenuItem;
    Panel1: TPanel;
    procedure Form21Click(Sender: TObject);
    procedure Form31Click(Sender: TObject);
    procedure Form41Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Exit1Click(Sender: TObject);
  private

    // Control de Orden Z del TPanel

    FPanelWndProc: TWndMethod;
    procedure PanelWndProc(var M: TMessage);

  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

Uses Unit2, Unit3, Unit4;

{$R *.dfm}

// Inicio del Código de Control del Orden Z del TPanel

procedure TForm1.FormCreate(Sender: TObject);
begin
  Windows.SetParent(Panel1.Handle, ClientHandle);
  // Sobreescribe el Panel1 WindowProc
  FPanelWndProc := Panel1.WindowProc;
  Panel1.WindowProc := PanelWndProc;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  // Restaura Panel1 WindowProc
  Panel1.WindowProc := FPanelWndProc;
end;

procedure TForm1.PanelWndProc(var M: TMessage);
var
  P: ^WINDOWPOS;
begin
  if M.Msg = WM_WINDOWPOSCHANGING then
  begin
    P := Pointer(M.LParam);
    // Siempre coloca Panel1 en el Orden Z Bottom
    P.hwndInsertAfter := HWND_BOTTOM;
  end;
  FPanelWndProc(M);
end;

// Fin del Código de Control del Orden Z del TPanel

procedure TForm1.Form21Click(Sender: TObject);
begin
   Form2.Show;
end;

procedure TForm1.Form31Click(Sender: TObject);
begin
   Form3.Show;
end;

procedure TForm1.Form41Click(Sender: TObject);
begin
   Form4.Show;
end;

procedure TForm1.Exit1Click(Sender: TObject);
begin
   Application.Terminate;
end;

end.
El código anterior mantiene el TPanel en el Orden Z mas inferior, permitiendo que el TPanel siempre este visible y nunca se superponga a un MDIChild. Todo el código de control esta en el MDIForm, no hace falta colocar ningún código adicional en los MDIChild. Quizás esta solución pueda ser adaptada a tu proyecto.

La aplicación implementada esta en el siguiente link: http://terawiki.clubdelphi.com/Delph...+MDI+Forms.rar

Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 30-12-2012 a las 01:21:25.
Responder Con Cita
  #6  
Antiguo 30-12-2012
_CALI _CALI is offline
Miembro
 
Registrado: mar 2008
Posts: 99
Poder: 17
_CALI Va por buen camino
...Claro, pero aver dibuja el panel del porte del formulario padre y luego minimiza los formularios hijos y comprenderás mejor lo que digo.
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
panel siempre visible RebeccaGL Varios 4 07-10-2011 18:29:37
Mantener el Formulario principal en el fondo. Critter Lazarus, FreePascal, Kylix, etc. 5 25-10-2010 10:04:27
Mantener viva la aplicación HombreGordo Varios 9 04-11-2008 20:57:24
Mantener Aplicacion Arancada ramonibk API de Windows 10 26-10-2004 18:25:00
Mantener Form1 siempre detrás de Form2 Gorka Varios 1 13-10-2004 13:13:48


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