Как сделать подкомпоненты TAction доступными во время разработки?
В своем пользовательском компоненте я создал несколько TAction-ов в качестве подкомпонентов. Все они опубликованы, но я не мог назначить их во время разработки, так как они не были доступны через инспектор объектов.
Как сделать их «повторяемыми» инспектором объектов? Я пытался установить владельца действий для владельца пользовательского компонента (который является формой хостинга), но безуспешно.
РЕДАКТИРОВАТЬ: похоже, Embarcadero изменил поведение Delphi IDE, связанные с этой проблемой. Если вы используете версии Delphi до XE, вы должны использовать решение из моего собственного ответа. Для XE и выше, вы должны использовать решение от Крейга Петерсона.
РЕДАКТИРОВАТЬ: я добавил свой собственный ответ, который решает проблему, т. Е. Путем создания экземпляра TCustomActionList в моем пользовательском компоненте и установки его владельца для формы размещения (владельца пользовательского компонента). Однако я не слишком доволен этим решением, так как я думаю, что экземпляр TCustomActionList отчасти избыточен. Поэтому я все еще надеюсь получить лучшее решение.
РЕДАКТИРОВАТЬ: Добавить пример кода
uses
.., ActnList, ..;
type
TVrlFormCore = class(TComponent)
private
FCancelAction: TBasicAction;
FDefaultAction: TBasicAction;
FEditAction: TBasicAction;
protected
procedure DefaultActionExecute(ASender: TObject); virtual;
procedure CancelActionExecute(ASender: TObject); virtual;
procedure EditActionExecute(ASender: TObject); virtual;
public
constructor Create(AOwner: TComponent); override;
published
property DefaultAction: TBasicAction read FDefaultAction;
property CancelAction : TBasicAction read FCancelAction;
property EditAction : TBasicAction read FEditAction;
end;
implementation
constructor TVrlFormCore.Create(AOwner: TComponent);
begin
inherited;
FDefaultAction := TAction.Create(Self);
with FDefaultAction as TAction do
begin
SetSubComponent(True);
Caption := 'OK';
OnExecute := DefaultActionExecute;
end;
FCancelAction := TAction.Create(Self);
with FCancelAction as TAction do
begin
SetSubComponent(True);
Caption := 'Cancel';
OnExecute := Self.CancelActionExecute;
end;
FEditAction := TAction.Create(Self);
with FEditAction as TAction do
begin
SetSubComponent(True);
Caption := 'Edit';
OnExecute := Self.EditActionExecute;
end;
end;