2009-05-28 10 views
3

私はDelphi 7のデバッガをあきらめ、かなりの出力デバッグストリングに頼っています。ブレークポイントを設定すると、デバッガのような文字列としてオブジェクトの内容を取得するために呼び出すことができる標準の関数はありますか?DelphiにPHPのVardumpのような機能はありますか?

答えて

4

RTTIを使用して、さまざまな公開プロパティーの値にアクセスできます。魔法のルーチンは、TypInfoユニットにあります。あなたが最も興味を持っているのは、オブジェクトのプロパティのリストを返すGetPropListと、プロパティの値を取得できるGetPropValueです。

procedure TForm1.DumpObject(YourObjectInstance : tObject); 
var 
    PropList: PPropList; 
    PropCnt: integer; 
    iX: integer; 
    vValue: Variant; 
    sValue: String; 
begin 
    PropCnt := GetPropList(YourObjectInstance,PropList); 
    for iX := 0 to PropCnt-1 do 
    begin 
     vValue := GetPropValue(YourObjectInstance,PropList[ix].Name,True); 
     sValue := VarToStr(vValue); 
     Memo1.Lines.Add(PropList[ix].Name+' = '+sValue); 
    end; 
end; 

例えば、メインフォームのボタンのクリックでDumpObject(セルフ)でこれを実行し、それがメモに現在のフォームのすべてのプロパティをダンプします。これは公開されたプロパティのみであり、メインクラスはTPersistentから降りる必要があり、ORはオブジェクトの前で{$ M +}をオンにしてコンパイルされました。

デルファイの将来のバージョン(おそらく2010年)では「リフレクター」のような能力が利用できるという噂があります。

+1

私は、CodeGearの人々が「うわさ」の能力について話したDelphi Liveの会議セッションにいました。彼らは明示的にRTTIはもっと多くなるだろうが、.NET Reflectorのように、アプリケーションを逆コンパイルしたり、オブジェクトの構造をリバースエンジニアリングするのに十分な情報がない。 –

-2

デルファイ7が.NET版の場合は、リフレクションを使用してその一部を行うことができます。 (簡単ではないが、ひどく難しくない)。コンパイルされたものであれば、それは難しい問題です。デバッガは、特殊な印刷機能/メソッドを別にして、最良の方法です。

+4

Delphi 7の.Net版は、コマンドラインのみの「プレビューコンパイラ」だけでした。これは、「Delphi 7」について話すときに決して意味をなさないものです。 –

3

もっと完全なトレースソリューションであるCodesiteのようなものを考えてみましょう。これにより、はるかに複雑な情報を出力し、データを検索、印刷、分析することができます。しかし、あなたの目的のために、Codesite.Send( 'Before'、self)を使用してオブジェクトを送信することができます。ログ内のすべてのRTTI利用可能なプロパティを取得します。 「After」も実行し、両方を選択するだけでコードサイト出力の2つを比較できます。それは何度も私を救ってくれました。

関連する問題