トリッキーなことをしない簡単な例です。
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;
私はあなたにdownvoteをしませんでしたが、私はdownvoterがあなたのコードを表示していないことを好まなかったと推測しています。ところで、オブジェクトを反復処理するためのデータモジュールを作成することはまったく必要ではないので、どのようなコードを書いたのかはわかりません。 –
@Warren P、re:downvote - 誰が何をしたのか、なぜそれが問題なのかを知っています(他のソーシャルネットワークでXOXOを送信するような個人的なもの)。私が特定の誤解を持っていたことを理解して以来、このケースではソリューションがより速く見つかるかもしれません。 re:TDataModule - 私の誤解は**すべてのアクション**を書いて、それを気に入らなかったObjectBinaryToTextでコンバートすることでした。今私は完全なダンプ、問題のあなたの新鮮な表情のおかげであります。 –
+1私から。良い質問。 – Ampere