2011-01-11 5 views
14

Delphiデバッガは、線形コードのデバッグに最適です.1つの関数が他の関数を予測可能かつ線形的に呼び出し、1行ずつプログラムをステップ実行できます。DelphiですべてのGUIイベントを記録する方法はありますか?

イベントドリブンGUIコードを扱うときにデバッガが役に立たないことがわかります.1行のコードで新しいイベントがトリガされ、他のイベントがトリガされる可能性があります。 このような状況では、「ステップスルー・ザ・コード」というアプローチでは、すべてのことがわかりません。

私が通常これを解決する方法は、1)どのイベントが問題の一部かを推測し、2)それらのイベントのそれぞれにブレークポイントやログを追加することです。

問題は、このアプローチが無駄で時間がかかることです。

スイッチがありますか?デバッガで「すべてのGUIイベントをログする」とフリックできますか?

FieldA.KeyDown 
FieldA.KeyPress 
FieldA.OnChange 
FieldA.OnExit 
FieldB.OnEnter 

これはすべて取る:または私はトラップイベントに追加することができますいくつかのコードは、私が探している

procedure GuiEventCalled(ev:Event) 
begin 
    log(ev); 
    ev.call(); 
end 

ような最終的な結果は、(例えば)このようなもので、そこにありますDelphi GUIのデバッグを推測する。私は、Delphi 2010

[EDIT] を使用しています

は、いくつかの答えは、Windowsメッセージを傍受またはログに記録する方法を提案しました。また、DelphiのすべてのイベントがWindowsメッセージであるとは限りません。私はそれが私が尋ねていた "非Windowsメッセージ"イベントのこれらのタイプだと思います。 Delphiコードで作成されたイベント。 [編集]

[EDIT2] ここですべての情報を読んだ後、RTotを使用してTNotifyEventsを動的に傍受し、デバッグウィンドウのイベントログにそれらを記録する考えがありました。これには、OnEnter、OnExit、OnChange、OnClick、OnMouseEnter、OnMouseLeaveイベントが含まれます。ハッキングのビットの後、少なくとも私の使用のために、かなりうまく動くようになりました(キーイベントはログに記録されませんが、追加できます)。 私はのどこかにこの行を追加しますuses節

  • にEventInterceptorユニットを追加

    1. がEventInterceptorユニットをダウンロードして使用してプロジェクト
    2. に追加するコードhere

      を掲載しました追跡する各フォームのコード。

      AddEventInterceptors(MyForm);

    オープンデバッガウィンドウとリアルタイムでメッセージフローを確認するために、イベントログ

    [/ EDIT2]

  • 答えて

    8

    私がdownload hereと書いた "delphieventlogger"ユニットを使用してください。これは1つのメソッド呼び出しであり、非常に使いやすいです。デバッガウィンドウのDelphiイベントログにすべてのTNotifyEvents(OnChange、OnEnter、OnExitなど)を記録します。

    +0

    +1ここにコードを入れて自分のソリューションを投稿してください! –

    2

    使用WinSightに記録されますと呼ばれているすべてのイベント。

    実際にプログラムでログを生成する場合は、WinProcを無効にしてください。Applicationのメッセージを傍受してください。

    +0

    すべてのDelphiイベントWindowsメッセージはありますか?私はちょうどTApplicationEvents.OnMessageを使ってイベントをロギングしようとしましたが、私が得ようとしているのはマウスの動きとキーボードのイベントです。 OnChange、OnExitまたはOnEnterイベントは表示されません(私が知る限り)。私は、Windowsメッセージよりも高いレベルのものを望んでいたと思います。 – awmross

    +0

    btw WinSightにはDelphi 2010が付属していません – awmross

    +2

    @awmross:DelphiイベントはWindowsメッセージではありません。 Windowsメッセージは、Delphiコントロール上のメッセージ処理ルーチンに送出されます。そのうちのいくつかは、イベントハンドラが1つあればそれを呼び出します。 –

    3

    いいえ、これを行う一般的な方法はありません。Delphiには何らかの形でフックできる「イベントタイプ」はありません。イベントハンドラは単なるメソッドリファレンスであり、次のように呼び出されます。

    if assigned(FEventHandler) then 
        FEventHandler(self); 
    

    通常のメソッド参照呼び出しです。すべてのイベントハンドラをログに記録する場合は、それぞれのイベントハンドラを自分で挿入する必要があります。

    +0

    私が興味を持っているイベントの多くは、同じタイプ(TNotifyEvent)であることが判明しました。 RTTIを使用して、このタイプのすべてのイベントをインターセプトしてログに記録できます。 – awmross

    3

    私はそれが少し高価だと知っていますが、TestCompleteの拡張機能としてAutomated QA(今はSmartBear)TestRecorderを使用することができます。このソフトウェアは、GUIアクションを追跡し、言語のようなスクリプトで保存します。これらの録音をユーザーのシステムで直接行うために、exeにリンクすることができるユニットもあります。これは、エラーを生成するために行ったことを説明できないユーザーがいる場合に特に役立ちます。

    -1

    AOP frameworks for Delphiのいずれかを試すことができます。 MeAOPは、使用できるデフォルトのロガーを提供します。イベントハンドラの内部で何が起こっているのかはわかりませんが、イベントハンドラが呼び出されたときとそれが返されたときは、通知されます。

    +0

    私はあまりにもこれについてAOPを考えました。私はMeAOPを試しましたが、D2010の下ではコンパイルされていないようです(私はUnicodeの問題だと思います)。 – awmross

    1

    トリガイベントをデバッグするには、ステップオーバー(F8)コマンドの代わりにデバッガのステップイン(F7)を使用します。

    呼び出し中に到達した使用可能なコード行があれば、デバッガは停止します。

    +0

    当初はこのアプローチを使用できませんでした。デバッガがこのサードパーティ製のコードにステップインしていることがわかりました。私はその後、ユニット全体のデバッグを無効にできる "{$ D-}"コンパイラ指令を発見しました。これにより、プロジェクトコードにステップインするだけでデバッガが制限され、あなたの提案が実用的になりました。私はこのアプローチには一般的な問題があると思います。あなたが探しているイベントはコールツリー内で深く呼び出されるかもしれません。手動でコードをステップ実行するには、推測とエラーによる試行が必要です。 – awmross

    +0

    @awmross:アプリケーション(イベント駆動型かどうか)をデバッグするには、ほとんど完全に推測と試行錯誤の術です; – jachguate

    2

    TApplication.OnMessageイベントは、メインメッセージキューにポストされたメッセージを捕捉するために使用できます。これは主にOS発行のメッセージであり、通常は直接WndProc()メソッドにディスパッチされる内部VCL/RTLメッセージではありません。すべてのVCLイベントがメッセージ駆動型で始まるわけではありません。あなたが探しているものに対する単一の解決策はありません。 TApplication.OnMessage,TApplication.HookMainWindow(),WndProc()上書き、SetWindowsHook()、およびコード内の選択的なブレークポイント/フックの組み合わせを使用する必要があります。

    BorlandのWinSightツールはもはや配布されていませんが、MicrosoftのSpy ++やWinSpectorなど、WinSightと同じことを行うサードパーティ製のツールが多数あり、リアルタイムでログウィンドウメッセージを追跡します。

    関連する問題