質問

TGridPanel内のコントロールの位置(行と列のインデックス)を見つける方法は?ボタンの数に共通のOnClickイベントを使用し、ボタンのX、Y位置を知る必要があります。

Delphi 2007を使用しています。

役に立ちましたか?

解決

残念ながら、 TGridPanelの魔法により、単にTopプロパティとLeftプロパティを取得するよりも少し複雑です...

これはすべてのコントロールに対して実行され、ニーズに合わせて調整する必要があります。

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;

他のヒント

SenderキャストをtButtonとして使用し、次にその上と左を要求できます。例:

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;

またはどのボタンが押されたかを知りたい場合は、TAGプロパティを使用して各ボタンに番号を挿入し、onclickイベントでタグ値を取得することもできます。まず、Tagプロパティを何かに設定することを忘れないでください。グリッドパネルにボタンをドロップするだけの場合はフォームデザイナで、またはボタンの作成と挿入に使用するルーチンでこれを実行できます。

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;

現在、ポインターは整数と同じメモリサイズを使用するため、タグプロパティを使用して整数以上を保存することもできます。整数にポインターをキャストし、その値をタグプロパティに挿入できます。このフィールドに配置するポインターは整数として扱われることに注意してください。あなたはそれが指すメモリに対して責任があり、それはコンポーネントによって管理されません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top