Lazarus/Delphi - indext/элемент выбранного элемента (массив элементов управления)

У меня есть массив ПАНЕЛЕЙ в форме, и они используются как кнопки. Им назначена одна процедура события. Поэтому, когда я нажимаю кнопку, я вижу ее заголовок, подобный этому:

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

end;

Я хочу знать номер кнопки (как в номере элемента массива), а не заголовок. Как это возможно?

Спасибо!


person itsols    schedule 31.10.2012    source источник


Ответы (2)


Используйте свойство Tag элемента управления. Для свойства Tag можно задать любое удобное для вас целое число, и оно не используется элементом управления. Поэтому, когда вы создаете каждую панель, установите Panel.Tag на индекс в массиве. Затем вы можете получить индекс в массиве, используя TPanel(Sender).Tag

person Mike    schedule 31.10.2012
comment
Коротко, мило и полезно :) Спасибо! - person itsols; 31.10.2012

Если ваша кнопка находится в массиве, это потому, что вы поместили ее в массив. Кнопка не имеет встроенных знаний о массиве, как и ничего другого в вашей программе. Чтобы найти кнопку в массиве, найдите ее:

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, вы можете пропустить индекс массива и просто сопоставить кнопку непосредственно с чем-то еще, на что индекс массива должен указывать, например, со структурой данных, которая содержит информацию, связанную с кнопка.

person Rob Kennedy    schedule 31.10.2012