将TCustomActionList后代的内容转储为人类可读的形式

时间:2011-06-20 14:20:01

标签: delphi

我有异物实例,我想检查组件的属性"手动"。 我知道组件流和如何将输出转换为文本格式,但问题是 - TCustomActionList(因为我发现我的实例是TActionManager)不会流式传输其动作。是否有任何技巧可以让它这样做?


UPD:现在通过创建TDataModule(作为容器/所有者),迭代动作并创建TAction实例并执行Assign来实现。解决方案仍然受到不关心TAction后代的影响。

1 个答案:

答案 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;
相关问题