您好,请教动态生成控件和进程间通信的问题,谢谢您。(100分)

  • 主题发起人 主题发起人 pcgod
  • 开始时间 开始时间
P

pcgod

Unregistered / Unconfirmed
GUEST, unregistred user!
您好,

1.我想要实现如下功能,请问该怎么作:

输入一个数字,比如 5, 就会生成 5 个可以用来输入字符串的 edit控件。

也就是说, 在我程序开始运行时, 先让操作者输入一个数字,然后再生成相应数目的edit控件 来让操作者再输入其它内容。

请问该怎样实现?? 谢谢您。

2.进程通信的问题:(两个程序如何通信?)
比如有两个程序:
1 个 只有一个 form,一个 输入框(edit),一个按钮;
另一个: 只有一个form,一个文本控件(label)
我想要实现:

在程序1 edit1中输入的内容在 程序2的label 中显示出来。 请问我该怎样用sendmessage 和 postmessage 处理? 初学,最好能给一些代码。
 
var
EditNumber:Integer=0; //全局变量,存放生成的Edit数量
procedure TForm1.Button1Click(Sender: TObject);
var
i:Integer;
begin
EditNumber:=StrToInt(edtNum.Text);
for i:=1 to EditNumber do
with TEdit.Create(Self) do
begin
Name:='MyEdit'+IntToStr(i);
Text:='';
Left:=20;
Top:=50+i*40;
Parent:=Form1;
end;
TEdit(FindComponent('MyEdit2')).Text:='Hello!'; //访问例子
end;
 
一个程序给另一个程序发WM_COPYDATA消息来传递文本内容。
例:
程序1发送代码:
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word);
var
Data: TCopyDataStruct;
hd: THandle;
begin
//hd := xxxxxx; 获取第二个程序窗口的handle, 可以用FindWindow
Data.dwData := 0;
Data.cbData := Length(Edit1.Text);
Data.lpData := AllocMem(Length(Edit1.Text));
move(Edit1.Text[1], pchar(Data.lpData)^, length(Edit1.Text));
SendMessage(hd, Handle, Integer(@Data));
freemem(Data.lpData, length(Edit1.Text));
end;

程序2的接收代码就不写了。 只要截取WM_COPYDATA消息并判断wparam为程序1的handle并复制传过来的数据就可以了。
 
Pearl先生您好,首先感谢您对我的指导,您能否将程序2的接收代码写个例子给我?
我初学delphi,不会消息处理。
对您说的:
“只要截取WM_COPYDATA消息并判断wparam为程序1的handle并复制传过来“
您能否写个例子给我? 不胜感激,谢谢您。还有,怎样才能较快的掌握delphi和win 32的
编程? 您能否指导一下我? 谢谢。
 
接收:
type
TForm2=class(TForm)
private
procedure WMCopyData(var Message: TWMCopyData); message WM_COPYDATA;
end;
....
procedure TForm2.WMCopyData(var Message: TWMCopyData);
var
hd: THandle;
buffer: string;
begin
hd := findwindow(nil, 'Form1'); // 获取发送程序的主form的handle
if Message.From=hd then
with Message.CopyDataStruct^ do
begin
setlength(buffer, cbData);
move(pchar(lpData)^, buffer[1], cbData);
label1.caption := buffer;
message.result := 1;
end;
end;
 
多人接受答案了。
 
后退
顶部