0

フォームにPANELの配列があり、それらはボタンとして使用されます。それらに割り当てられたイベントプロシージャが1つあります。したがって、ボタンをクリックすると、次のようなキャプションが表示されます。

procedure TForm1.MenuAction0Click(Sender: TObject);
begin
  TPanel(Sender).Font.Bold:= true;
  ShowMessage( TPanel(Sender).Caption);

end;

キャプションではなく、ボタン番号(配列要素番号など)を知りたい。これはどのように可能ですか?

ありがとう!

4

3 に答える 3

5

ボタンが配列内にある場合、それはボタンを配列内に配置しているためです。ボタンには配列に関する固有の知識はなく、プログラム内の他のことも何もしません。配列内のボタンを見つけるには、次のように検索します。

function GetButtonArrayIndex(const ButtonArray: array of TButton; Button: TButton): Integer;
begin
  for Result := 0 to High(ButtonArray) do
    if ButtonArray[Result] = Button then
      Exit;
  Result := -1;
end;

別の方法は、配列を直接操作することをやめ、ボタンの配列インデックスをそのTagプロパティに格納することです。

すでに何か他のものを使用Tagしている場合、またはその名前がプログラムでの特定の目的を示していないことが気に入らない場合は、代わりにTDictionary<TButton, Integer>、配列を検索せずにボタンを配列インデックスにマップするために使用できます。与えられたボタンからインデックスを上げます。また、を使用するTDictionaryと、配列インデックスをスキップして、ボタンに関連する情報を保持するデータ構造など、配列インデックスが指すはずのその他のボタンにボタンを直接マップできる場合があります。 。

于 2012-10-31T15:25:08.110 に答える
1
iter: integer;

for iter := 0 to TPanel(Sender).Parent.ControlCount - 1 do
begin
  if Sender = TPanel(Sender).Parent.Controls[iter] then
  begin
    // number is iter
  end;
end;
于 2012-10-31T15:06:58.983 に答える
1

Tagコントロールのプロパティを使用します。Tagプロパティは、便利な整数に自由に設定でき、コントロールでは使用されません。したがって、各パネルを作成するときPanel.Tagは、配列のインデックスにを設定します。次に、を使用して配列内のインデックスを取得できますTPanel(Sender).Tag

于 2012-10-31T15:19:21.283 に答える