Lazarus/Delphi - Indext/ элемент элемента, по которому щелкнули (контрольный массив)
У меня есть массив панелей на форме, и они используются в качестве кнопок. Для них назначена одна процедура события. Поэтому, когда я нажимаю на кнопку, я вижу ее заголовок так:
procedure TForm1.MenuAction0Click(Sender: TObject);
begin
TPanel(Sender).Font.Bold:= true;
ShowMessage( TPanel(Sender).Caption);
end;
Я хочу знать номер кнопки (как в номере элемента массива), а не заголовок. Как это возможно?
Спасибо!
3 ответа
Использовать Tag
свойство контроля. Свойство Tag можно свободно устанавливать для любого целого числа, которое вам полезно, и оно не используется элементом управления. Поэтому, когда вы создаете каждую панель, установите Panel.Tag
к индексу в массиве. Затем вы можете получить индекс в массиве с помощью TPanel(Sender).Tag
Если ваша кнопка находится в массиве, это потому, что вы поместили ее в массив. Кнопка не имеет встроенных знаний о массиве, а также ничего не делает в вашей программе. Чтобы найти кнопку в массиве, найдите ее:
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
Вы можете пропустить индекс массива и просто отобразить кнопку непосредственно на то, на что еще должен указывать индекс массива, например на структуру данных, которая содержит информацию, относящуюся к кнопке.
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;