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.