SendMessage();的一个问题。(50分)

  • 主题发起人 主题发起人 coolingxyz
  • 开始时间 开始时间
C

coolingxyz

Unregistered / Unconfirmed
GUEST, unregistred user!
MainForm上有一个memo控件,我怎么在我的线程里用SendMessage();来使这个memo增加一行呢?请大家指教。我现在是通过Synchronize();方法的,能实现效果。就是不知道怎么用SendMessage()或PostMessage()来是实现。
 
l 利用WM_COPYDATA消息
使用该消息涉及一个TcopyDataStruct结构类型的指针。该结构中有三个成员:
dwData 是一个32位的附加参数
cbData 表示要传递的数据区的大小
lpData 表示要传递的数据区的指针
下面举个例子。该例子由两个程序构成,分别为SendData和GetData。
SendData程序向GetData程序发送消息,并传递edit1中的字符串;GetData在收到消息后,把SendData发送的字符串接受下来,并显示在相应的edit1中。
你把下面这段SendData程序例子移稙到你的线程中去就可以了.
1. SendData程序:
……
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
ds: TCopyDataStruct;
hd: THandle;
begin
ds.cbData := Length (Edit1.Text) + 1;
GetMem (ds.lpData, ds.cbData );
//为传递的数据区分配内存
StrCopy (ds.lpData, PChar (Edit1.Text));
Hd := FindWindow (nil, 'Form2');
// 获得接受窗口的句柄
if Hd <> 0 then
SendMessage (Hd, WM_COPYDATA, Handle,
Cardinal(@ds)) // 发送WM_COPYDATA消息
else
ShowMessage ('目标窗口没找到!');
FreeMem (ds.lpData);
//释放资源
end;

下面这段GetData例子用来接收线和发送的数据.
2. GetData程序:
TForm2 = class(TForm)
Edit1: TEdit;
private
{ Private declarations }
public
procedure Mymessage(var t:TWmCopyData);message WM_COPYDATA;
{ Public declarations }
end;
var
Form2: TForm2;
implementation
procedure TForm2.Mymessage(var t:TWmCopyData);
begin
Memo1.Lines.Add(StrPas(t.CopyDataStruct^.lpData));//接受数据并显示。
end;
使用这种方法是WIN32应用程序进行交互的最简单的方法。
 
接受答案了.
 
实际上在同一个程序里可以直接向Memo发送消息来完成,不需要这么麻烦的
1。发送消息取得最后位置
2。设置选择区
3。替换选择区
 
好像用#13就行吧
 
后退
顶部