我有异物实例,我想检查组件的属性"手动"。 我知道组件流和如何将输出转换为文本格式,但问题是 - TCustomActionList(因为我发现我的实例是TActionManager)不会流式传输其动作。是否有任何技巧可以让它这样做?
UPD:现在通过创建TDataModule(作为容器/所有者),迭代动作并创建TAction实例并执行Assign来实现。解决方案仍然受到不关心TAction后代的影响。
答案 0 :(得分:4)
简单的例子,没有做任何棘手的事。
function TMyThing.SaveComponent(a:TComponent):String;
var
Stream2: TStringStream;
Stream1: TMemoryStream;
begin
Stream1 := TMemoryStream.Create;
Stream2 := TStringStream.Create;
try
Stream1.WriteComponent(a);
Stream1.position := 0;
ObjectBinaryToText(Stream1, Stream2);
result := Stream2.DataString;
finally
Stream1.Free;
Stream2.Free;
end;
end;
procedure TMyThing.Dump;
var
n:Integer;
a:TContainedAction;
s:String;
begin
for n := 0 to ActionManager1.ActionCount-1 do begin
a := ActionManager1.Actions[n];
s := '----- '+a.Category+' '+a.Name+' '+a.ClassName+':';
// crude manual way
if a is TAction then begin
s := s+ ' '+TAction(a).Caption;
s := s+ ' '+TAction(a).Hint;
end;
// RTTI stream in DFM text format
s := s+ SaveComponent(a);
Memo1.Lines.Add(s);
end;
end;