Fórum Organização de Botões no Layout de um Form #442546

09/05/2013

0

Boa noite pessoal, tenho a seguinte situação: Em um form tenho 16 botões, dispostos em 4 linhas por 4 colunas. Em alguns casos a propriedade Enabled e Visible dos mesmos pode ser TRUE ou FALSE. Eu gostaria que os botões ficassem alinhados de maneira ordenada, de modo que quando houvesse um botão com a propriedade visible FALSE, os valores da propriedade TOP e LEFT dele fosse passado para o próximo componente Button com a propriedade visible TRUE.

Exemplo

[b1][b2][b3][b4]
[b5][b6][b7][b8]

Se b2.Visible = False então:

[b1][b3][b4][b5]

Até o momento tenho o seguinte source:


procedure TForm1.RzButton1Click(Sender: TObject);
var
  i,j,bleft,btop : Integer;
  b : TRzbutton;
begin
  //criabotao;
  Memo1.Clear;
  bleft := 0; btop := 0;

  for i:=0 to ComponentCount-1 do
  begin
    If (Components[i].ClassType = TRzbutton) then
    begin
      b := (Components[i] as TRzButton);
      Memo1.Lines.Add(b.Caption + ' ' + inttostr(b.Left) + ' ' + inttostr(b.Top));
      if (b.Visible = True) then
      begin
        if (btop<>0)and(bleft<>0) then
        begin
          b.Left := bleft;
          b.Top  := btop;
        end;
        Memo1.Lines.Add('Visible FALSO:' + inttostr(bleft) + ' ' + inttostr(btop));
      end else
      begin
        bleft := b.Left;
        btop  := b.Top;
        Memo1.Lines.Add('Visible TRUE:' + inttostr(bleft) + ' ' + inttostr(btop));
      end;
    end;
  end;
  //Form1.Repaint;
end;


Mas ele não está funcionando corretamente. Alguém têm alguma idéia?
Desde já agradeço a ajuda.

Abraão
Abraão Monteiro

Abraão Monteiro

Responder

Posts

10/05/2013

Alex Constâncio

Olá

No teu lugar eu criaria um vetor de botões e posições (um record contendo um TPoint para a posição e um TControl para cada botão) para guardar as posições de cada um dos botões quando habilitados. Seria um vetor de 16 entradas, portanto e seria inicializado no FormShow ou no Loaded do form.

Faria então um método chamado, por exemplo, ReorganizarBotoes que percorreria este vetor e verificaria se o componente em questão está ou não visível e o reposicionaria com base em uma variável de trabalho do tipo TPoint. Esta variável é inicializada com a posição (TPoint) da primeira entrada do vetor. Então iniciaria o loop para reposicionar. A cada iteração do loop eu verificaria se o TControl em questão está ou não Visible. Se sim, configuro suas propriedades Top e Left com o X e Y do TPoint já guardado e atualizaria esta posição para conter o Top e Left da próxima entrada (cuidado para não ultrapassar os limites do vetor, no caso da última entrada). Se não estiver Visible, simplesmente continuo para o próxima entrada, deixando o TPoint de trabalho inalterado, mantendo ainda a mesma posição que servirá para o próxima componente visível.

Assim você alterará os Top e Left dos componentes para reposicioná-los, mas terá os TPoint previamente guardados quando for necessário.

Alex
Responder

Gostei + 0

10/05/2013

Abraão Monteiro

Agradeço a resposta. Vou tentar fazer uma implementação em cima dessa idéia.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar