Form filho ocupando toda a area de trabalho do form pai

Delphi

12/09/2007

Olá, antes de mais nada quero dizer que procurei mas não encontrei pelos foruns o que eu preciso e por isso estou postando aqui.

vou explicar o que eu estou precisando.

Tenho um form que e do tipo fsMDIForm, e nele eu tenho um menu, uma StatusBar e futuramente uma barra de Botões, e os outros forms são todos do tipo fsMDIChild, o que eu preciso e o seguinte. Quando um form filho e aberto eu quero verificar o tamanho da tela do form pai que é o principal da aplicação e dimencionar o form filho [b:dd64195479]sem que o mesmo seja maximizado[/b:dd64195479], no tamanho da area de trabalho do form pai.


Godzilla_xf

Godzilla_xf

Curtidas 0

Respostas

Massuda

Massuda

12/09/2007

Acho que isso deve funcionar. Inclua no seu form fsMDIChild...
type
  TSeuFormFilho = class(TForm)
  public
    procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
    ...
  end;

...

procedure TSeuFormFilho.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
var
  MainForm: TForm;
  Rect: TRect;
begin
  if Showing then begin

    MainForm := Application.MainForm;

    // Obtem o retângulo da área cliente MDI
    Windows.GetWindowRect(MainForm.ClientHandle, Rect);

    // Ajusta a nova posição
    ALeft := Rect.Left;
    ATop := Rect.Top;
    AWidth := Rect.Right - Rect.Left;
    AHeight := Rect.Bottom - Rect.Top;
  end;

  inherited SetBounds(ALeft, ATop, AWidth, AHeight);
end;



GOSTEI 0
Godzilla_xf

Godzilla_xf

12/09/2007

Acho que isso deve funcionar. Inclua no seu form fsMDIChild...
type
  TSeuFormFilho = class(TForm)
  public
    procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
    ...
  end;

...

procedure TSeuFormFilho.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
var
  MainForm: TForm;
  Rect: TRect;
begin
  if Showing then begin

    MainForm := Application.MainForm;

    // Obtem o retângulo da área cliente MDI
    Windows.GetWindowRect(MainForm.ClientHandle, Rect);

    // Ajusta a nova posição
    ALeft := Rect.Left;
    ATop := Rect.Top;
    AWidth := Rect.Right - Rect.Left;
    AHeight := Rect.Bottom - Rect.Top;
  end;

  inherited SetBounds(ALeft, ATop, AWidth, AHeight);
end;


Olá, muito obrigado Massuda, pelo apoio, so que eu não entendi uma coisa.

eu usei a procedure que vc me passou que erda da da procedure SetBounds, so que o que eu não entendi e quando eu vou chamar ela, e que parametros eu passo para a mesma, por que da forma com eu fiz:

[b:540375816d]SetBounds(0,0,Application.MainForm.ClientWidth,Application.MainForm.ClientHeight);[/b:540375816d]

eu acredito que estou fazendo algo de errado, por que ele ajusta ao tamanho da area cliente do meu form pai, porem como eu tenho componentes do tipo [b:540375816d]TMainMenu, TTollBar e TStatusBar[/b:540375816d], o form pai cria umas barras de rolagem. o eu precisava que isso não acontese-se.

se o Sr. puder me ajudar ficarei grato, muito obrigado.


GOSTEI 0
Massuda

Massuda

12/09/2007

...o que eu não entendi e quando eu vou chamar ela, e que parametros eu passo para a mesma
Você não precisa chamar a procedure, ela será chamada automaticamente. Não testei, me diga qual é o resultado.


GOSTEI 0
Godzilla_xf

Godzilla_xf

12/09/2007

Você não precisa chamar a procedure, ela será chamada automaticamente. Não testei, me diga qual é o resultado.


Olá, eu tentei [b:e11ab62e13] sem fazer [/b:e11ab62e13] a chamada da procedure e não acontece nada. e ai tentei chamá-la e passar os parâmetros e ai fica como citei acima


GOSTEI 0
Massuda

Massuda

12/09/2007

Por favor, esqueça o que eu postei antes. Como eu disse, não testei :oops: . Experimente isto...
procedure PosicionarForm(AForm: TForm);
begin
var
  Rect: TRect;
begin
  Windows.GetWindowRect(Application.MainForm.ClientHandle, Rect);

  InflateRect(Rect, -2 * GetSystemMetrics(SM_CXBORDER), -2 * GetSystemMetrics(SM_CYBORDER));
  OffsetRect(Rect, -Rect.Left, -Rect.Top);

  AForm.BoundsRect := Rect;
end;
...chame PosicionarForm passando o form fsMDIChild como parametro logo após criar o form fsMDIChild.


GOSTEI 0
Godzilla_xf

Godzilla_xf

12/09/2007

Por favor, esqueça o que eu postei antes. Como eu disse, não testei :oops: . Experimente isto...
procedure PosicionarForm(AForm: TForm);
begin
var
  Rect: TRect;
begin
  Windows.GetWindowRect(Application.MainForm.ClientHandle, Rect);

  InflateRect(Rect, -2 * GetSystemMetrics(SM_CXBORDER), -2 * GetSystemMetrics(SM_CYBORDER));
  OffsetRect(Rect, -Rect.Left, -Rect.Top);

  AForm.BoundsRect := Rect;
end;
...chame PosicionarForm passando o form fsMDIChild como parametro logo após criar o form fsMDIChild.


Olá, Massuda, como eu posso te agradecer, funcionou perfeitamente, muito obrigado mesmo. era o que eu precisava, vlw mesmo.

até ++++


GOSTEI 0
POSTAR