Encontrar a posição de um controlo dentro TGridPanel
-
05-07-2019 - |
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.
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.