Como disponibilizar as ações do subcomponente em tempo de design?
No meu componente personalizado, criei alguns TAction-s como subcomponentes. Todos eles são publicados, mas não pude atribuí-los em tempo de design, pois não estavam disponíveis no inspetor de objeto
Como você os torna "iteráveis" pelo inspetor de objetos? Tentei definir o proprietário das ações como proprietário do componente personalizado (que é o formulário de hospedagem) sem êxito.
EDIT: Parece que o Embarcadero mudou o comportamento do Delphi IDE relacionado a esse problema. Se você estiver usando as versões Delphi anteriores ao XE, deverá usar a solução da minha própria resposta. Para XE e superior, você deve usar a solução de Craig Peterso
EDIT: adicionei minha própria resposta que resolve o problema, ou seja, criando uma instância TCustomActionList no meu componente personalizado e configurando seu Proprietário para o formulário de hospedagem (proprietário do componente personalizado). No entanto, não estou muito feliz com esta solução, pois acho que a instância do TCustomActionList é meio redundante. Por isso, ainda espero obter uma solução melhor.
EDIT: adicione amostra de código
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;