Fórum MDI - Centralizar MDI Filho #259082
19/11/2004
0
Quando crio um projeto MDI, e consequentemente os forms MDI filhos, em geral coloco a propriedade Position = poMainFormCenter. Porém, ao abrir o form filho nunca ele aparece posicionado exatamente no centro do form principal. Sempre aparece posicionado um pouco para baixo do centro. Já tentei colocar a propriedade Position em todas as outras opções de ´center´, mas sempre o form abre decentralizado.
Quando os forms são pequenos não tem problema, mas quando ocupam a maior parte da dimensão vertical da tela, eles aparecem cortado embaixo. Ou melhor, uma faixa da parte de baixo fica escondida.
Alguém sabe como resolver isso?
wbb
Wbb
Curtir tópico
+ 0Posts
19/11/2004
Massuda
Esse posicionamento é feito em TCustomForm.CMShowingChanged na unit Forms... para modificar isso, você pode declarar sua própria versão desse tratador de mensagem em seu form MDI child. Como esse tratador é relativamente complexo, acho que o mais fácil é copiar todo o tratador original para a sua versão e modificar o par de linhas que interessa.
Gostei + 0
19/11/2004
Wbb
T+
wbb
Gostei + 0
19/11/2004
Massuda
Gostei + 0
19/11/2004
Godzilla_xf
Alinhamento ou algo assim...
Tentou com outros form´s MDi??...
espero ter ajudado....
falow
Gostei + 0
19/11/2004
Massuda
[b:08264bbf84]wbb[/b:08264bbf84]: a solução era mais simples :) Na classe que implementa o form filho, inclua a procedure SetBounds()...
type TFormFilho = class(TForm) public procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override; end; ... procedure TFormFilho.SetBounds(ALeft, ATop, AWidth, AHeight: Integer); var Rect: TRect; Origem: TPoint; begin if Showing then begin // Obtem o retângulo da área cliente MDI Windows.GetWindowRect(Application.MainForm.ClientHandle, Rect); // Calcula a origem da área cliente MDI no form pai Origem := Rect.TopLeft; Dec(Origem.x, Application.MainForm.Left); Dec(Origem.y, Application.MainForm.Top); // Calcula nossa nova posição ALeft := (Application.MainForm.Width - Width) div 2 - Origem.x; ATop := (Application.MainForm.Height - Height) div 2 - Origem.y; end; inherited SetBounds(ALeft, ATop, AWidth, AHeight); end;
Se você fizer Position = poDefault ou poDesigned no form MDI filho, ele não será centrado no form pai (como era de se esperar).
Gostei + 0
19/11/2004
Massuda
procedure TFormFilho.SetBounds(ALeft, ATop, AWidth, AHeight: Integer); var Rect: TRect; OurWidth: Integer; OurHeight: Integer; begin if Showing then begin // Obtem o retângulo da área cliente MDI Windows.GetWindowRect(Application.MainForm.ClientHandle, Rect); // Calcular largura e altura da área cliente OurWidth := Rect.Right - Rect.Left; OurHeight := Rect.Bottom - Rect.Top; // Calcula a nova posição ALeft := (OurWidth - Width) div 2; ATop := (OurHeight - Height) div 2; end; inherited SetBounds(ALeft, ATop, AWidth, AHeight); end;
Gostei + 0
24/08/2005
Diogoalles
existe alguma maneira que não seja colocar a função em todos os forms ?
obrigado
Diogo
Gostei + 0
24/08/2005
Diogoalles
gostaria de saber como utilizar ou adaptar essa função para alinhar forms do tip fsNormal ?
abraço
Diogo
Gostei + 0
24/08/2005
Massuda
Gostei + 0
24/08/2005
Diogoalles
gostaria de saber como utilizar ou adaptar essa função para alinhar forms do tip fsNormal ?
abraço
Diogo
Gostei + 0
24/08/2005
Massuda
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)