デバッグ出力の方法
85 DebugOutput 動作確認 Delphi2007 更新日 2008/03/05(水)

いろんな方法がありますし
それぞれの方法を適宜使いこなしてください。

◆デバッグ時に変数の内容などを
コンソールに出力する方法があります。

*.DPR や *.PAS のソースのどこかに
    {$APPTYPE CONSOLE}
というコンパイル指令を書いておくと
プロジェクト起動時にコンソール画面
(黒いDOSプロンプト画面)が立ち上がります。

もしくはイベントなどで
    AllocConsole;
という命令を呼び出すとそのときに
コンソール画面が立ち上がります。

そこで
    Write(変数);
    Writeln(変数);
という標準出力命令で値を表示させる事が出来ます。
────────────────────
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  S: String;
begin
  AllocConsole;

  i := 10;
  S := 'あいうえお';

  Writeln(i);
  Writeln(S);
end;
────────────────────

◆以前のVersionのDelphiのProfessional版以上なら
OutputDebugStringというAPI関数を書けば
IDEのイベントログWindowに出力結果が表示されます。

※TurboDelphi等のProfessional版以下の最近のものに
  この機能が消されているかどうかは不明です。

────────────────────
procedure TForm1.Button2Click(Sender: TObject);
begin
  OutputDebugString('OutputDebugStringで文字を出力');
end;
────────────────────
結果は次のようになります。
	ODS: OutputDebugStringで文字を出力 プロセス Project1.exe ($47C)


◆IDEを使えないデバッグなどにはメモ帳やEmEditorなどの
外部のエディタに文字列を出力してみましょう。

起動しているメモ帳にメッセージを送って文字列を表示させます
────────────────────
{-------------------------------
//  デバッグ出力をメモ帳やEmEditorに貼り付ける
備考:       uses Messagesが必要
//------------------------------}
var
  hwndNotepadEdit:    HWND;
  {ユニット変数にする事で再検索の必要がなくなる}

procedure DebugPrintNotepad( S:string );
var
  hwndNotepad: HWND;
begin
  if not isWindow( hwndNotepadEdit )
  then begin
    hwndNotepad     := FindWindow( 'Notepad','無題 - メモ帳' );
    hwndNotepadEdit := FindWindowEx( hwndNotepad,0,'Edit',nil );
  end;
  if not isWindow( hwndNotepadEdit ) then exit;
  SendMessage( hwndNotepadEdit,EM_REPLACESEL,0,LPARAM( PChar( S+#13#10 )));
end;

var
  hwndEmEditorView:    HWND;

procedure DebugPrintEmEditor( S:string );
var
  hwndEmEditor: HWND;
begin
  if not isWindow( hwndEmEditorView )
  then begin
    hwndEmEditor := FindWindow( 'EmEditorMainFrame3','無題 - EmEditor' );
    hwndEmEditorView    := FindWindowEx( hwndEmEditor,0,'EmEditorView',nil );
  end;
  if not isWindow( hwndEmEditorView )
  then begin
    hwndEmEditor := FindWindow( 'EmEditorMainFrame3','無題 * - EmEditor' );
    hwndEmEditorView    := FindWindowEx( hwndEmEditor,0,'EmEditorView',nil );
  end;
  if not isWindow( hwndEmEditorView ) then exit;
  SendMessage( hwndEmEditorView,EM_REPLACESEL,0,LPARAM( PChar( S+#13#10 )));
end;
//------------------------------

────────────────────
メモ帳やEmEditorを起動しておき
DebugPrintNotepad と DebugPrintEmEditor 関数に文字列を渡すと
それぞれのエディターに文字列が出力されます。

他のエディタに対応させたい場合、
エディタのクラス名とWindowの名前を調べて
同様のコードを書けばよいでしょう。


Delphi付属のツール WinSight や
VisualStudo付属のツール Spy++ を使って調べるとよいでしょう。

FindWindowのHELPをみると
    HWND FindWindow(

        LPCTSTR lpClassName,    // pointer to class name
        LPCTSTR lpWindowName    // pointer to window name
       );
となっています。

その WinSight や Spy++ にて
メモ帳を見ると 'NotePad' や 'Edit' と書かれていて
EmEditor の同じ項目には 'EmEditorMainFrame3' や 'EmEditorView' と
書かれているので、上記のソースのように指定してください。

 EM_REPLACESEL メッセージに対応していないエディタは場合は
SendMessageで送っても動作しませんので、注意してください。


◆これらのデバッグ出力命令は

{$IFOPT D+}
  OutputDebugString('xxxx の処理');
{$ENDIF}

このようにしておくと
[プロジェクト オプション]-[コンパイラ]タブ-[デバッグ]-[デバッグ情報]
のチェックのOn/Offによってコードがコンパイルされたりされなかったり
ということを切り替えることができます。

HELPのキーワード『$D』項目や『$IFOPT』項目も参照すると
よいでしょう。

参項────────────────────
[Delphi:47209] Re: デバッグの方法
[Delphi:62359] Re: Delphi 超初心者です

Delphi Acid Floor デバッグウィンドウ
http://www.wwlnk.com/boheme/delphi/vbtodel/vbfaq/vbd0060.htm