В своем пользовательском компоненте я создал несколько 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;