@66demon666
По навыкам джун - по факту безработный

Как обработать событие onClick кнопки, которая находится внутри другого компонента?

Здравствуйте! передо мной стоит, казалось бы, простая задача - добавить таблице TStringGrid возможность добавлять в ячейки кнопки, чтобы на них нажимать.

Я создал класс-наследник и добавил единственный метод
TDNSList = class(TStringGrid)
  public
      function addButton(ACol:Integer; ARow:Integer; AOnClick:TNotifyEvent):TButton;
  end;


Который рисует кнопку в нужном месте таблицы

function TDNSList.addButton(ACol:Integer; ARow:Integer; AOnClick:TNotifyEvent):TButton;
var newButton:TButton;
var cellRect:TRect;
begin
    cellRect:=Self.CellRect(ACol,ARow);
    newButton:=TButton.Create(Self);
    newButton.Parent:=self;
    newButton.Name:='testButton';
    newButton.Width:=Self.ColWidths[ACol];
    newButton.Height:=Self.RowHeights[ARow];
    newButton.Caption:='test';
    newButton.Top:=cellRect.Top;
    newButton.Left:=cellRect.Left;
    if (Assigned(AOnClick)) then
    begin
        ShowMessage('AOnClick Assigned');
        newButton.OnClick:=AOnClick;
    end
    else begin
      ShowMessage('AOnLick Unassigned');
    end;
     Result := newButton;
end;


И таким вот нехитрым образом вызываю этот метод извне

procedure TForm1.test(Sender:TObject);
begin
   ShowMessage('hi');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  but: TButton;
begin
  but := DNSList1.addButton(1, 1, test); // сохраняем возвращаемое значение
  //newButton.Parent := DNSList1; // присваиваем родительский контрол
end;


Идея в том, чтобы передать в метод координаты для кнопки и процедуру-обработчик. Кнопка успешно добавляется, выглядит как живая, анимации там, но вот onClick никак не хочет обрабатывать. Интересный момент, что если ИЗВНЕ установить Parent:=Form1, кнопка прекрасно работает, хоть и рисуется немного не там, но если Parent - мой компонент, то ничего не работает.
  • Вопрос задан
  • 226 просмотров
Решения вопроса 1
HemulGM
@HemulGM Куратор тега Delphi
Delphi Developer, сис. админ
В свойство ControlStyle у кнопки нужно добавить значение csClickEvents.
newButton.ControlStyle := newButton.ControlStyle + [csClickEvents];
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
tsklab
@tsklab
Здесь отвечаю на вопросы.
Перенесите newButton.Parent:=self; после других присвоений свойств.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы