▼ TSさん
TSさんがわからないものは私には分かりません。
という振りはさておいて、コンボボックスの操作だけであれば特に共有メモリ
を使用する必要はありませんが、いかがでしょう。
> SendMessage(hStatusbar,XX_XXXXXX,i,LPARAM(CM.MemPtr))
lParamで共有メモリの情報を取得しなければ、あるいは取得可能なものは、
共有メモリの利用もいいかと思います。これについては、提示のHalbow資料館
の解説も、共有メモリの使用例というポリシーで、Halbowさんも書いています。
コンボボックスの操作だけであれば、
http://homepage2.nifty.com/Mr_XRAY/Delphi/plSetPrinter/OthesDialog.htm
が参考になると思います。年のため参考コードを以下に示します。
ただし、HDD内の半整備のコードですのであしからず。
受信側
unit ReceiverUnit;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TReceivForm = class(TForm)
Edit1: TEdit;
Button1: TButton;
ComboBox1: TComboBox;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
//送信側ではTReceivFormというクラス名のウィンドウに対して操作する
var
ReceivForm: TReceivForm;
implementation
{$R *.DFM}
//=============================================================================
// 他のアプリから操作しやすいように,EditとComboBoxにID値を付けておく
// 当然であるが,Handleプロパティを持たないコントロールにはID値を付けられない
// Edit1のテキストを空にするのにEdit1:=''; ではなくEdit1.Text:=EmptyStr; を使
// 用してみた。EmptyStrはSysUtilsにある
//=============================================================================
procedure TReceivForm.FormCreate(Sender: TObject);
begin
SetWindowLong(Edit1.Handle,GWL_ID,1000);
SetWindowLong(ComboBox1.Handle,GWL_ID,1100);
Edit1.Text:=EmptyStr;
ComboBox1.ItemIndex:=0;
end;
//=============================================================================
// テキストをクリア
//=============================================================================
procedure TReceivForm.Button1Click(Sender: TObject);
begin
Edit1.Clear;
end;
送信側
unit SenderUnit;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
type
TSenderForm = class(TForm)
Button1: TButton;
Edit1: TEdit;
Panel1: TPanel;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
SenderForm: TSenderForm;
implementation
{$R *.DFM}
//=============================================================================
// Button1をクリックすると
// ID値が1000のコントロールに文字列をセットする
// ID値が1100のコントロール(ここではコンボボックス)を操作
//=============================================================================
procedure TSenderForm.Button1Click(Sender: TObject);
var
hWindow : HWND;
RevHandle : HWND;
PStr : PChar;
Str : String;
i : Integer;
Cnt : Integer;
Len : Integer;
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)));
Memo1.Lines.Clear;
//hWindowのID値が1100の子ウィンドウのハンドル
//ここではコンボボックス
RevHandle:=GetDlgItem (hWindow,1100);
//その項目数
Cnt:=SendMessage(RevHandle,CB_GETCOUNT,0,0);
Panel1.Caption:='対象コンボボックスの項目数 : '+IntToStr(Cnt);
//削除の場合はdowntoで
for i:=Cnt-1 downto 0 do begin
//メモリ確保のために文字列の長さを取得
Len:=SendMessage(RevHandle,CB_GETLBTEXTLEN,i,0);
GetMem(PStr,Len+1);
try
//i番目の項目の文字列を取得
SendMessage(RevHandle,CB_GETLBTEXT,i,LongInt(PStr));
Str:=PStr;
Memo1.Lines.Add(PStr);
finally
FreeMem(PStr);
end;
//対象コンボボックスのItemに東という文字が含まれてる場合は項目から削除
if Pos('東',Str)<>0 then begin
SendMessage(RevHandle,CB_DELETESTRING,i,0);
if Cnt>2 then SendMessage(RevHandle,CB_SETCURSEL,1,0);
end;
end;
//対象コンボボックスの項目数を再取得
//ここではわかりきっているが確認のため
Cnt:=SendMessage(RevHandle,CB_GETCOUNT,0,0);
Panel1.Caption:='対象コンボボックスの項目数 : '+IntToStr(Cnt);
end;
end;
|