Pergunta

Como posso saber a posição (linha e índice de coluna) de controles dentro TGridPanel? Eu gostaria de usar o evento OnClick comum para o número de botões e necessidade de conhecer a posição X, Y do botão.

Estou usando o Delphi 2007.

Foi útil?

Solução

Infelizmente, devido ao a magia de TGridPanel , é um pouco mais complicado do que apenas obter as propriedades superior e esquerda ...

Isso deve fazê-lo para qualquer controle, adaptá-lo às suas necessidades:

procedure GetRowColumn(const AControl: TControl; var ARow, AColumn: Integer);
var
  I: Integer;
begin
  if AControl.Parent is TGridPanel then
  begin
    I := TGridPanel(AControl.Parent).ControlCollection.IndexOf(AControl);
    if I > -1 then
    begin
      ARow := TGridPanel(AControl.Parent).ControlCollection[I].Row;
      AColumn := TGridPanel(AControl.Parent).ControlCollection[I].Column;
    end;
  end;
end;

procedure TForm1.ButtonClick(Sender: TObject);
var
  Row, Column : Integer;
begin
  GetRowColumn(Sender as TControl, Row, Column);
  // do something with Row and Column
  ShowMessage( Format('row=%d - col=%d',[Row, Column]));
end;

Outras dicas

Você pode usar Sender elenco como um TButton e, em seguida, pedir-lhe para seu topo e à esquerda, por exemplo:

Procedure TForm1.OnClick(Sender:tObject);
var
  X,Y : Integer;
begin
  if Sender is TButton then
    begin
      X := TButton(Sender).Top;
      Y := TButton(Sender).Left;
      // do something with X & Y
    end;
end;

Ou se o seu apenas querendo saber o que botão foi pressionado, você também pode usar a propriedade TAG para inserir um número em cada botão, e em seguida, recuperar o valor do tag no seu evento onclick. Apenas lembre-se primeiro conjunto a propriedade Tag para alguma coisa. Você pode fazer isso no designer de formulário se o seu apenas soltando os botões no painel de grade ou na rotina de seu usar para criar e inserir seus botões.

Procedure TForm1.OnClick(Sender:tObject);
var
  iButton : integer;
begin
  if Sender is TComponent then
    begin
      iButton := TComponent(Sender).Tag;
      // do something with iButton
    end;
end;

Você também pode usar a propriedade tag para armazenar mais do que apenas um inteiro, uma vez que um ponteiro atualmente usa o mesmo tamanho da memória como o inteiro você pode converter um ponteiro para um inteiro e inserir esse valor para a propriedade tag. Basta estar ciente de que qualquer ponteiro que você coloque neste campo ainda é tratado como um inteiro. Você é responsável pela memória que aponta para, não será gerido pelo componente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top