Здравствуйте! передо мной стоит, казалось бы, простая задача - добавить таблице 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 - мой компонент, то ничего не работает.