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.
|