Я не думаю, что общие компоненты VCL будут правильным подходом, но вы можете присвоить кнопке тип класса.Особенно, если объект, который вы хотите создать, является потомком TComponent, который обычно имеет тот же конструктор, вы можете просто создать его таким образом.
type
TYourButton = class(TButton)
...
public
property ComponentClass: TComponentClass read ComponentClass write FComponentClass;
end;
procedure TYourButton.Click;
var
c: TComponent;
begin
c := ComponentClass.Create(Self);
// Rigging up c, for instance setting text, tag, or check if it's
// a TControl and set parent and position if so.
end;
// And to assign a component class:
YourButton1.ComponentClass := TPanel;
Для более детального управления, например, если это может бытьлюбой класс и, следовательно, любую сигнатуру конструктора, вы можете передать фабричному методу или фабричному объекту свою кнопку.Заводской объект имеет фиксированный интерфейс, который может вызывать кнопка, и выполняет всю работу по установке объекта.Таким образом, любые сложности в создании объекта могут быть скрыты на фабрике, и кнопка не должна знать об этом.
Сама фабрика не должна быть визуальным компонентом, и для нее несколько проще использовать дженерики, если хотите, хотя в этом сценарии она не кажется очень полезной.
В одной из самых простых форм вы можете просто передать процедуру или функцию кнопке, которую она может вызвать для создания объекта.Это может быть реализовано так же, как событие, как OnClick.Вы можете объявить свойство OnCreateObject в кнопке и назначить ему метод, который создает объект.