Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2005年11月23日] [更新 2012年05月04日] Delphi サンプルプログラム集
660_他のアプリへ文字列送信 ( Delphi 同士 )
動作確認等 Windows XP(SP3) + Delphi XE Pro
Windows 7 U64(SP1) + Delphi XE Pro
660_SendTextID.zip [1,085 KB] 2012年05月04日版 (EXE 同梱)



  • 2012年05月04日
  • Delphi XEで動作確認




WM_SETTEXT メッセージで他のアプリへ文字列送信


[650_他のアプリへデータ (文字列や画像) の送信 (Delphi 同士)] では、WM_COPYDATA メッセージを使用していますが、テキストのみの送信であれば、WM_SETTEXT メッセージが使用できます。

WM_SETTEXT メッセージは、受信側のコントロールのハンドルが分かれば、Delphi 製のアプリに限らず文字列、テキストが送信できます。
ここでは、受信側のアプリも、開発者がコーディング可能という利点を生かし、受信側のコントロールに ID 値を意図的に設定しておきます。すると、そのコントロールのハンドルが簡単に取得できます。
コントロールに ID 値を設定できるのは、ウィンドウハンドルを持つものに限ります。意図的に設定しない場合は不定となり、アプリケーションを起動する度に異なる値となります。
テストには、同梱の Sender.dpr と Receiver.dpr をコンパイルして作成した以下の実行ファイルを使用します。
  • Sender.exe        文字列を送るアプリ
  • Receiver.exe      文字列を受取るアプリ
このテストプログラムでは、分かりやすいように、このような名前のプログラムとしていますが、予約語等の名前は、原則使用しない方が無難です。


図1
設計時画面
  • 右が自アプリで、送信側
  • 左が他のアプリで、受信側
図2
両方のアプリを起動
図3
[送信]ボタンをクリック

リスト1
送信側のアプリのコード
WM_SETTEXT メッセージで文字列を他のアプリに送る
unit SenderUnit;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, XPMan;

type
  TSenderForm = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  SenderForm: TSenderForm;

implementation

{$R *.DFM}

//=============================================================================
//  Button1をクリックするとID値が1000のコントロールに文字列をセットする
//=============================================================================
procedure TSenderForm.Button1Click(Sender: TObject);
var
  hWindow   : HWND;
  RevHandle : HWND;
  Str       : String;
begin
  //受取る側のアプリのウィンドウハンドル
  hWindow := FindWindow('TReceivForm', nil);

  if hWindow <> 0 then begin
    //hWindowのID値が1000の子ウィンドウのハンドル
    RevHandle := GetDlgItem (hWindow, 1000);

    //そこにEdit1.Textを送る
    SendMessage(RevHandle, WM_SETTEXT, 0, LPARAM(PChar(Edit1.Text)));

    //hWindowのID値が1100の子ウィンドウのハンドル
    RevHandle := GetDlgItem (hWindow, 1100);

    //そこに文字列を送る
    Str := Edit1.Text + sLineBreak + Edit1.Text;
    SendMessage(RevHandle, WM_SETTEXT, 0, LPARAM(PChar(Str)));
  end;
end;

end.


リスト2
受信側のアプリのコード
文字列を受信するコントロールに ID 値を設定しておく
unit ReceiverUnit;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TReceivForm = class(TForm)
    Edit1: TEdit;
    Memo1: TMemo;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  ReceivForm: TReceivForm;

implementation

{$R *.DFM}

//=============================================================================
//  他のアプリから操作しやすいように、各EditのID値を変更しておく
//=============================================================================
procedure TReceivForm.FormCreate(Sender: TObject);
begin
  SetWindowLong(Edit1.Handle, GWL_ID, 1000);
  SetWindowLong(Memo1.Handle, GWL_ID, 1100);
end;

//=============================================================================
//  テキストをクリア
//=============================================================================
procedure TReceivForm.Button1Click(Sender: TObject);
begin
  Edit1.Clear;
  Memo1.Clear;
end;

end.