我在表单上有一组面板,它们用作按钮。为它们分配了一个事件过程。所以当我点击一个按钮时,我可以看到它的标题是这样的:
procedure TForm1.MenuAction0Click(Sender: TObject);
begin
TPanel(Sender).Font.Bold:= true;
ShowMessage( TPanel(Sender).Caption);
end;
我想知道按钮编号(如数组元素编号)而不是标题。这怎么可能?
谢谢!
我在表单上有一组面板,它们用作按钮。为它们分配了一个事件过程。所以当我点击一个按钮时,我可以看到它的标题是这样的:
procedure TForm1.MenuAction0Click(Sender: TObject);
begin
TPanel(Sender).Font.Bold:= true;
ShowMessage( TPanel(Sender).Caption);
end;
我想知道按钮编号(如数组元素编号)而不是标题。这怎么可能?
谢谢!
如果你的按钮在一个数组中,那是因为你把它放在了一个数组中。该按钮没有数组的固有知识,您的程序中也没有任何其他内容。要在数组中查找按钮,请搜索它:
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
,你就可以跳过数组索引,直接将按钮映射到数组索引应该指向的任何其他内容,例如保存与按钮相关信息的数据结构.
使用Tag
控件的属性。Tag 属性可以自由设置为对您有用的任何整数,并且控件不使用它。因此,当您创建每个面板时,请将 设置Panel.Tag
为数组中的索引。然后你可以通过使用获取数组中的索引TPanel(Sender).Tag
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;