2011-06-20 1 views
2

私は異物インスタンスを持っており、コンポーネントのプロパティを "手動で"調べたいと思っています。 コンポーネントのストリーミングと、出力をテキスト形式に変換する方法はわかっていますが、問題は - TCustomActionList(私のインスタンスがTActionManagerであると分かりました)は、その動作をストリームしません。そうするためには何か手掛かりはありますか?TCustomActionList子孫の内容を人間が読める形式にダンプします


UPD:今すぐアクションを通して反復処理とにTActionインスタンスを作成して割り当てを行う、(コンテナ/所有者として)TDataModuleを作成することであることを行っています。解決策はまだTAction子孫について気にしないことから苦しみます。

+0

私はあなたにdownvoteをしませんでしたが、私はdownvoterがあなたのコードを表示していないことを好まなかったと推測しています。ところで、オブジェクトを反復処理するためのデータモジュールを作成することはまったく必要ではないので、どのようなコードを書いたのかはわかりません。 –

+0

@Warren P、re:downvote - 誰が何をしたのか、なぜそれが問題なのかを知っています(他のソーシャルネットワークでXOXOを送信するような個人的なもの)。私が特定の誤解を持っていたことを理解して以来、このケースではソリューションがより速く見つかるかもしれません。 re:TDataModule - 私の誤解は**すべてのアクション**を書いて、それを気に入らなかったObjectBinaryToTextでコンバートすることでした。今私は完全なダンプ、問題のあなたの新鮮な表情のおかげであります。 –

+0

+1私から。良い質問。 – Ampere

答えて

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; 
+0

これはまあまあです。ヒント、ImageIndex、ShortCutがありませんが、追加することができます。悪い - 子孫アクションクラスによって定義される可能性のあるプロパティは、このように反映されません。 –

+1

それをチェックしてください。今はるかに良い。 –

+0

実際、ObjectBinaryToTextの問題では実際に動作します(コンテナ)の意味についての誤解がありました –

関連する問題