Fórum centralizar group box em um form #595
18/11/2008
estou desenvolvendo uma nova aplicação em Delphi 2007 e quero utilizar o MDI Form. Na execução do programa, estou abrindo um form MDI shilld já maximizado. Dependendo da resolução do monitor, este form pode maior ou menor, ocupando toda a área útil da tela. Pois bem, utilizo labels e maskedit´s dentro de um groupbox. Gostaria de centralizar este groupbox no form, em tempo de execução.
Já tentei os comandos abaixo dentro do OnActivate e do OnShow do form, sem sucesso:
GroupBox1.Left := (Self.ClientWidth div 2) - (GroupBox1.Width div 2);
GroupBox1.Top := (Self.ClientHeight div 2) - (GroupBox1.Height div 2);
No aguardo,
Nirlan
Posts
18/11/2008
Guinther Pauli
Olá Nirlan !!!
Não há necessidade de se programar qualquer linha de código para poder obter o efeito desejado. Todo componente wincontrol no delphi possui um set chamado Anchors. Esse set tem quatro opções Top, Bottom, Left e Right. Isso serve para poder “Ancorar um controle” em relação a quem o contém.
Por padrão todos os componentes do delphi são ancorados ao Top e ao Left, por isso quando maximizamos um formulário os componentes contidos nele ficam ao topo e a esquerda. Se quiser que o componente fique imóvel basta não ancorá-lo setando o top e o left para false. Ou se quiser que o componente seja redimensionado ancorre além do top e do left o right.
Faça o teste coloque um botão num form, rode e maximize o form. Observe, agora vai alterando a combinação dos anchors e veja o resultado. Assim fica fácil ancorar seu group box para poder sempre estar no centro do form idependente da resolução.
Aguardamos seu retorno,
abs
Olá Guinther,
Achei muito interessante o uso do anchors. Isso me terá muita utilidade.
Mas neste caso especifico, o groupbox ficou centralizado corretamente, mas ele também foi redimensionado.
Teria como ele ser centralizado sem ser redimensionado ?
Eu consegui uma solução com o uso do código abaixo:
procedure TForm940.FormResize(Sender: TObject);
begin
GroupBox1.Left := (Panel3.ClientWidth div 2) - (GroupBox1.Width div 2);
GroupBox1.Top := (Panel3.ClientHeight div 2) - (GroupBox1.Height div 2);
end;
abraços
Nirlan
19/11/2008
Guinther Pauli
Olá Nirlan
Tem sim. Sua Rotina está correta porém lembre-se seu group box está dentro de um panel assim o panel tb deve ser centralizado o que você pode fazer é criar uma procedure conforme abaixo:
procedure AlinharControle(Container: TWinControl; Control: TWinControl);
begin
Control.Left := (Container.ClientWidth div 2) - (Control.Width div 2);
Control.Top := (Container.ClientHeight div 2) - (Control.Height div 2);
Control.Update;
Container.Update;
end;
Essa rotina alinha qualquer controle a um outro controle container. Como vc tem um panel no form e um group box no panel os dois tem que ser alinhados. O Panel no centro do form e o group box no centro do panel. Para isso basta no OnResize do Form cahamar as rotinas na ordem:
AlinharControle(Form1,Panel1);
AlinharControle(Panel1,GroupBox1);
Aguardo seu retorno para encerrarmos o chamado,
abs
ok. podemos encerrar este chamado também.