Alinhamento de Buttons

Delphi

08/07/2005

Olá pessoal

Tenho telas que possuem 4 a 6 botoes na parte inferior da tela alinhados evidamente na horizontal.
Só q a partir de agora vou ter q tornar sempre u1 ou 2 botões destes invesiveis.
Vou definir se são visiveis ou não na criação do form.
Como alinhá-los corretamente com seu devido espaçamento na horizontal somente os visíveis?

** como tenho telas q tem 6, 7,5 botoes eu precisaria duma formula que se aplicasse a todas as telas pra fazer esse alinhamento.

agradecido

Diogo


Diogoalles

Diogoalles

Curtidas 0

Respostas

Marco Salles

Marco Salles

08/07/2005

como tenho telas q tem 6, 7,5 botoes eu precisaria duma formula que se aplicasse a todas as telas pra fazer esse alinhamento.


Não sei se entendi direito. Mas aqui vai

Altere a propriedade Tag de todos os botoes que ficarão visiveis e Invisiveis...Mas somente os botoes que devam de fato ficar aninhados
na parte inferior da tela... Para esses botoes coloque a propriedade Tag igual a Um.... Faça esta alteração no próprio objeto Inspector

Escreva o método Geral... Este método vale ate mesmo em RumTime e independe da quantidade de botoes

Procedure AlinhaBotoes;
var
 TamanhoDoBotoes:Integer;
 i:Integer;
 Contar:Integer;
 Acrescentar:Integer;
 invisiveis:Integer;
begin
i:=0;
Contar:=0;
invisiveis:=0;
 while i <= Form1.ComponentCount -1 do
   begin
     if Form1.Components[i] is TButton then
       if TButton(Form1.Components[i]).tag = 1 Then
          if TButton(Form1.Components[i]).visible = True Then
              contar:=contar+1
          else
            invisiveis:=invisiveis+1;
      i:=i+1;
   end;
tamanhoDoBotoes:=((Form1.Width - contar-invisiveis) div contar);
i:=0;
acrescentar:=-1;
while i <= Form1.ComponentCount -1 do
  begin
    if Form1.Components[i] is TButton then
       if TButton(Form1.Components[i]).tag = 1 Then
          if TButton(Form1.Components[i]).visible = True Then
             begin
               TButton(Form1.Components[i]).Width:=tamanhoDoBotoes;
               TButton(Form1.Components[i]).top:=312; ******Exemplo
               TButton(Form1.Components[i]).Left:=acrescentar;
               Acrescentar:=Acrescentar+tamanhoDoBotoes;
             end;
     i:=i+1;
  end ;
end;


***** Pode ser qualque valor , ou nen precisa , se esse botoes ja estiverem Incialmente Prealinhados a nivel de projeto

[b:8146a60429]Exemplo em Rum Time[/b:8146a60429]

Esconde o botão1 Alinhandos os demais
procedure TForm1.Button8Click(Sender: TObject);
begin
Button1.Visible:=False;
AlinhaBotoes;
end;


Reapresenta o botão1 , Alinhandos novamente
procedure TForm1.Button9Click(Sender: TObject);
begin
Button1.Visible:=True;
AlinhaBotoes;
end;



GOSTEI 0
Diogoalles

Diogoalles

08/07/2005

obrigado mesmo pela ajuda
só q o resultado não é o esperado pq tenho vários botoes na tela e gostaria de alinhar somente os botões q estão em um determinado panel.
como eu faria então já q está verificando todos os botões do form (if Form1.Components[i] is TButton then) ?


agradecido
Diogo


GOSTEI 0
Diogoalles

Diogoalles

08/07/2005

desculpe-me pela pergunta anterior... estava tudo ok.

funcionou..valeu


GOSTEI 0
Diogoalles

Diogoalles

08/07/2005

olá Pessoal
ainda estou com um problema no alinhamento dos botoes
alterei um pouco a função passada pelo nosso colega Marco.
ficou assim:

procedure TFrm1.AlinhaBotoes(Frm:TForm;W:Integer);
 //  W é o width do frm ou do panel onde estão os botões a serem alinhados
var
  Contar,i,j,k,l,m : Integer;
begin
  k := 0;
  j := 0;
  l := 0;
  i := 0;
  Contar := 0;

  while i <= Frm.ComponentCount -1 do
  begin
    if Frm.Components[i] is TButton then
      if TButton(Frm.Components[i]).tag = 1 then
        if TButton(Frm.Components[i]).visible = True then
        begin
          contar := contar + 1;
          if not(k > 0)then
            k := TButton(Frm.Components[i]).Width;
        end;
    i := i + 1;
  end;

  j := W div contar;

  l := j - k;
  l := l div 2;

  m := 0;
  i := 0;
  while i <= Frm.ComponentCount -1 do
  begin
    if Frm.Components[i] is TButton then
      if TButton(Frm.Components[i]).tag = 1 then
        if TButton(Frm.Components[i]).visible = True then
        begin
          if m = 0 then
          begin
            TButton(Frm.Components[i]).Left := l;
          end
          else
          begin
            TButton(Frm.Components[i]).Left  := (j*m) + l;
          end;
          m := m + 1;
        end;
    i := i + 1;
  end;
end;


o problema q acontece é que os botoes ñ estão sendo alinhados pela sua ordem...
ou seja,
o taborder deles está 0,1,2,3,4,5,6
se os btns com ordem 1 e 3 estiverem invisiveis eles ñ são alinhados 0,2,4,5,6. são alinhados por exemplo 4,5,0,6,2..
a função ComponentCount pega q order para ler os componentes e alinhá-los na minha função?

obrigado
Diogo


GOSTEI 0
Marco Salles

Marco Salles

08/07/2005

. A ordem da criação do componente é determinada pela ordem em que você colocou os componentes no formulário. Acredito que voce deva coloca-los predeterminados no formulário... Asim o componente Button mais a esquerda deva ser o primeiro e o Button mais a direita deva ser o ultimo..

Outra opção é alterar essa ordem em rumTime...


entendeu :?: :?: :?:


GOSTEI 0
POSTAR