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;
Другие вопросы по тегам