Есть ли способ узнать, какая кнопка TButtonGroup была нажата? - PullRequest
4 голосов
/ 18 марта 2012

Мое приложение использует элемент управления TButtonGroup.Каждой кнопке назначаю свой обработчик события: doClick.Назначая информацию каждой кнопке (Pointer (i)), я могу выяснить, какая кнопка была вызвана.Это код:

procedure TVector_Menu.Synchronize (rows, cols: Int32);
var btn: TGrpButtonItem; 
    i: Int32;
begin
   ButtonGroup.Items.Clear;
   Self.Rows := rows;
   Self.Cols := cols;
   for i := 0 to rows * cols - 1 do
   begin
      btn := Buttongroup.Items.Add;
      btn.Data       := Pointer (i);
      btn.ImageIndex := i;
      btn.OnClick    := doClick;
   end; // for
   Self.ClientHeight :=  4 + rows * ButtonGroup.ButtonHeight;
   Self.ClientWidth  := 22 + cols * ButtonGroup.ButtonWidth;
end; // Synchronize //

procedure TVector_Menu.doClick (Sender: TObject);
var btn: TGrpButtonItem; 
    i, r, c: Int32;
begin
   btn := (Sender as TGrpButtonItem); // @@@ TButtonGroup
   i := Int32 (btn.Data);
   get_rc (i, r, c);
   if Assigned (FOnClick)
      then FOnClick (Sender, @FButton_Matrix [r, c]);
end; // doClick //

Когда вызывается doClick, я получаю недопустимый тип в строке, помеченной '@@@'.Typecast является правильным, когда я использую TButtonGroup для btn, а также в typecast, но в этом нет свойства данных, и оно в любом случае было бы бесполезным.

В качестве теста я назначил OnClickобработчик событий для элемента управления TButtonGroup, и я заметил, что когда я нажимаю кнопку, сначала вызывается обработчик события кнопки, а затем TButtonGroup, содержащий кнопку, обработчик события.

Вопрос: есть ли способ узнатькакая кнопка TButtonGroup была нажата?

Использование Delphi XE в Windows 7/64

1 Ответ

8 голосов
/ 18 марта 2012

Вы получаете недопустимое исключение типа, потому что Sender на самом деле TButtonGroup и не TGrpButtonItem. Это означает, что вам нужно использовать разные обработчики событий для каждой кнопки, если вы собираетесь использовать TGrpButtonItem.OnClick.

В вашей ситуации ясно, что вы должны использовать событие TButtonGroup.OnButtonClicked, которое предоставляет индекс кнопки.

Однако здесь есть потенциальная ловушка, которую вам необходимо избегать. документация гласит:

Происходит при нажатии кнопки, если событие OnClick отсутствует.

Другими словами, событие OnButtonClicked сработает, только если вы не назначили обработчик события OnClick ни для группы кнопок, ни для элемента кнопки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...