0

我在表单上有一组面板,它们用作按钮。为它们分配了一个事件过程。所以当我点击一个按钮时,我可以看到它的标题是这样的:

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其他东西,或者你不喜欢它的名字在你的程序中没有表明它的特定用途,你可以使用 aTDictionary<TButton, Integer>来将按钮映射到数组索引,而不必搜索数组:看看从给定的按钮向上索引。一旦你使用 a TDictionary,你就可以跳过数组索引,直接将按钮映射到数组索引应该指向的任何其他内容,例如保存与按钮相关信息的数据结构.

于 2012-10-31T15:25:08.110 回答
1

使用Tag控件的属性。Tag 属性可以自由设置为对您有用的任何整数,并且控件不使用它。因此,当您创建每个面板时,请将 设置Panel.Tag为数组中的索引。然后你可以通过使用获取数组中的索引TPanel(Sender).Tag

于 2012-10-31T15:19:21.283 回答
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 回答