CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

两个程序之间如何发送、接收消息?

楼主richboy(凡俊)2001-05-23 01:08:00 在 Delphi / VCL组件开发及应用 提问

制作两个程序,一个程序上面只有一个按钮,另一个程序上面只有一个TMemo控件,编译两个程序,然后先运行只有TMemo控件的那个程序,然后再运行只有TButton控件的那个程序,怎么做才可以让TButton控件按下时TMemo控件中的文本变为指定的文本,如"hello   World!"? 问题点数:100、回复次数:20Top

1 楼comsun(comsun)回复于 2001-05-23 01:13:00 得分 0

使用   ServerSocket   和   ClientSocket   进行连接,发送字符串即可。或者使用   NMUDP   控件发送也很好。这是在远程或本地机都可以的方法。要是本地机,直接使用共享内存的方法,看看CreateSharedMemory   函数的说明吧。Top

2 楼rh(花覆茅檐)回复于 2001-05-23 01:14:00 得分 0

你可以setwindowtext  
  你可以sendmessageTop

3 楼BigBen(江南草)回复于 2001-05-23 08:07:00 得分 0

form2.button1click(sender:TObject);  
  begin  
    sendmessage(findwindowEx(findwindow('tform1','form1'),0,'tmemo1','memo1'),  
      wm_settext,0,'hello,World!');  
  end;Top

4 楼Kingron(单身走我路……)回复于 2001-05-23 08:43:00 得分 0

呵呵,很多的方法,用消息可以,DDE也可以,共享内存也可以,用WM_SetTEXT也可以.....Top

5 楼richboy(凡俊)回复于 2001-05-23 12:38:00 得分 0

为什么BigBen(江南草) 的代码运行完出现Incompatible   types:'Integer'   and   'String'错误?Top

6 楼richboy(凡俊)回复于 2001-05-23 15:09:00 得分 0

大家帮帮忙!谢谢!Top

7 楼shuyi(舒易)回复于 2001-05-23 15:13:00 得分 0

最省事的方法是共用ini文件Top

8 楼richboy(凡俊)回复于 2001-05-23 15:14:00 得分 0

是向Memo发送指定的字符,并不是从INI加载。Top

9 楼kingsong(牛大锅)回复于 2001-05-23 15:37:00 得分 0

...Top

10 楼Kingron(单身走我路……)回复于 2001-05-23 15:40:00 得分 0

'hello,World!'改成integer(pchar('Hello,World!'))就可以了.Top

11 楼richboy(凡俊)回复于 2001-05-23 23:26:00 得分 0

sendmessage(findwindowEx(findwindow('TForm1','Form1'),0,'tmemo1','memo1'),  
      wm_settext,0,integer(pchar('helloWorld!')));  
  用上面的代码无法实现,大虾请赐教!Top

12 楼summernightrain(夏夜雨)回复于 2001-05-24 00:29:00 得分 0

你要传字符串就用共享内存好了。  
   
  Top

13 楼summernightrain(夏夜雨)回复于 2001-05-24 00:34:00 得分 0

具体方法是:  
   
  一个程序改了一块共享内存后再发消息给另一个程序。。  
   
  1。改共享内存。  
  2。postmessage(handle,WM_USER(自定义),0,0)  
   
  另一个程序收到消息后再去都这块内存。  
   
  再窗口中添加过程,  
    procedure   RecvMsg(Msg:TMessage);message   WM_USER;  
   
  再这个过程中去查询那个内存的值。。。Top

14 楼richboy(凡俊)回复于 2001-05-24 08:31:00 得分 0

具体点的例子?有没有呀?Top

15 楼summernightrain(夏夜雨)回复于 2001-05-25 11:07:00 得分 0

你想要例子,我可以编一个,把你的油箱告诉我。Top

16 楼richboy(凡俊)回复于 2001-05-25 16:54:00 得分 0

我的邮箱richboys@21cn.com,谢谢!Top

17 楼summernightrain(夏夜雨)回复于 2001-05-26 13:35:00 得分 0

你要例子我已经发了!!!Top

18 楼summernightrain(夏夜雨)回复于 2001-05-26 13:41:00 得分 100

这里我再把我的代码关键的部分拿出来,欢迎大家批评指正....  
   
  这是发送的部分:  
   
  主窗口上包含两个Button   ,一个输入Edit1,一个提示Label.  
  procedure   TfrmSendMsg.Button1Click(Sender:   TObject);  
  var  
      Win:HWND;  
      Post:Pointer;  
      pStr:PShortString;  
      Str:String;  
  begin  
      Str:=Edit1.Text;  
      MapHandle:=CreateFileMapping(DWord(-1),nil,PAGE_READWRITE,0,250,'summer');  
      if   (MapHandle>0)   then  
          begin  
              Post:=MapViewOfFile(MapHandle,FILE_MAP_WRITE,0,0,0);  
              pStr:=Post;  
              pStr^:=Str;     //写共享内存  
          end;  
      Win:=FindWindow('TfrmRecvMsg',nil);  
      If   Win>0   then  
          Begin  
              PostMessage(Win,WM_USER+100,0,0);     //发消息给接收程序的主窗口...  
              Edit1.SetFocus;  
              Label2.Caption:='发送完成!';  
          end  
      Else  
          Begin  
              Label2.Caption:='接收器没有运行!';  
          end;  
  end;  
   
  这是接收部分:  
  主窗口包含一个Memo1.  
   
  unit   RecvMsg;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Classes,   Graphics,   Controls,   Forms,   Dialogs,  
      StdCtrls;  
   
  type  
      TfrmRecvMsg   =   class(TForm)  
          Memo1:   TMemo;  
          Label1:   TLabel;  
      private  
          procedure   GetMsg(var   Msg:   TMessage);Message   WM_USER+100;   //在这里增加接收的过程  
          {   Private   declarations   }  
      public  
          {   Public   declarations   }  
      end;  
   
  var  
      frmRecvMsg:   TfrmRecvMsg;  
   
  implementation  
   
  {$R   *.DFM}  
   
  {   TfrmRecvMsg   }  
   
  procedure   TfrmRecvMsg.GetMsg(var   Msg:   TMessage);  
  var  
      MapHandle:THandle;  
      pStr:Pointer;  
      Str:String;  
  begin  
      MapHandle:=CreateFileMapping(DWord(-1),nil,PAGE_READWRITE,0,255,'summer');  
      if   (MapHandle>0)   then  
          begin  
              pStr:=MapViewOfFile(MapHandle,FILE_MAP_READ,0,0,10);   //得到共享内存的指针  
              Memo1.Lines.Add('收到一条消息!!');  
              Memo1.Lines.Add(Pchar(pStr));  
          end;  
      CloseHandle(MapHandle);  
  end;  
   
  end.  
  Top

19 楼richboy(凡俊)回复于 2001-05-26 17:28:00 得分 0

谢谢大家!感谢summernightrain(夏夜雨)我已经收到你的邮件了,谢谢!Top

20 楼fuyuan_cao(CFY)回复于 2001-08-15 09:38:40 得分 0

gzTop

相关问题

  • 发送接收消息
  • 如何让程序没有窗口又能接收到消息!
  • 如何接收其它程序发来的消息并响应?
  • 如何使程序首先接收系统消息??
  • 我的程序为什么接收不到消息
  • 如何让后台程序接收到消息
  • 我的DLL是显示调用的,但是为何程序主窗口发送消息时,主窗口接收不到?
  • 我应该在我的SDK程序中的何处接收我的客户端发送来的消息?(100分伺候!!!)
  • 求邮件发送和接收的程序!
  • 跪求支持CDMA Modem的短信发送和接收程序

关键词

  • 控件
  • 内存
  • 消息
  • 代码
  • 程序
  • tmemo
  • 接收
  • 共享内存
  • maphandle
  • memo

得分解答快速导航

  • 帖主:richboy
  • summernightrain

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo