zoukankan      html  css  js  c++  java
  • delphi使用消息传递字符串有三种方式可以实现

    1、直接传递,但只能传递给同进程的窗口,无法实现跨进程的消息传递

    传递消息:

    [delphi] view plaincopy
     
    1. var  
    2.   Str: String;  
    3. begin  
    4.   Str := 'some string';  
    5.   PostMessage(Handle, 0, 0, Integer(Str));  
    6. end;  

    接收消息:

    [delphi] view plaincopy
     
    1. var  
    2.   Str: String;  
    3. begin  
    4.   Str := String(Msg.LParam);  
    5.   ShowMessage(Str);  
    6. end;  


    2、如果线程之间传递可以使用PostThreadMessage传递,PostThreadMessage是该函数将一个消息放入(寄送)到指定线程的消息队列里,不等待线程处理消息就返回。
    传递消息:

    [delphi] view plaincopy
     
    1. Procedure   TThread1.Execute;  
    2.   var  
    3.       sMes:String;  
    4.       pMes:^String;  
    5.       iTemp:Integer;  
    6.   begin  
    7.       sMes:=’Test’;  
    8.       New(pMes);  
    9.       pMes^:=sMes;  
    10.       PostThreadMessage(thread2.ThreadID,WM_StartRecording,Integer(pMes),0);  
    11.       iTemp:=111;  
    12.       PostThreadMessage(thread2.ThreadID,WM_OriginalData,iTemp,0);  
    13.   end;    

    接收消息:

    [delphi] view plaincopy
     
    1. procedure   TThread2.Execute;    
    2.   var    
    3.       msg:TMsg;    
    4.       sMes:String;    
    5.       pMes:^String;    
    6.       iTemp:Integer;    
    7.   begin    
    8.       //消息循环    
    9.       while   GetMessage(msg,0,0,0)   do    
    10.       begin    
    11.           Case   msg.message   of    
    12.               WM_StartRecording:    
    13.               begin    
    14.                   //传过来的是String;    
    15.                   pMes:=msg.wParam;    
    16.                   sMes:=pMes^;    
    17.                   Dispose(pMes);    
    18.               WM_OriginalData:    
    19.               begin    
    20.                   //传过来的是整数    
    21.                   iTemp:=msg.WParam;    
    22.               end;    
    23.               else   begin    
    24.                   TranslateMessage(msg);    
    25.                   DispatchMessage(msg);    
    26.               end;    
    27.           end;    
    28.       end;    
    29.   end;   

    使用该方法同时还可以传递stringlist,方法是:

    [delphi] view plaincopy
     
    1. 发送方:  
    2. a:TStrings;  
    3. a := TStringList.Create;  
    4. SendMessage(Formb.Handle,   WM_YOURMESSAGE,   0,   LongInt(a));     
    5. 接收方:  
    6. b:TStrings;  
    7. b := TStringList.Create;  
    8. b.Assign(TStrings(Msg.WParam));  
    9. TStrings(Msg.WParam).Free;  
    如果同一进程传递字符串可以使用PostMessage传递,该函数将一个消息放入(寄送)到与指定窗口创建的线程相联系消息队列里,不等待线程处理消息就返回,是异步消息模式。消息队列里的消息通过调用GetMessage和PeekMessage取得。
    发送消息:
    [delphi] view plaincopy
     
    1. <pre class="delphi" name="code">var  
    2.     pTel: ^string;  
    3. begin  
    4.      sTelTmp := '10086';  
    5.      New(pTel);  
    6.      pTel^ :=sTelTmp;  
    7.      SendMessage(Handle, WM_RCV_AUTO_REPORT, EV_TEL_MT_CALLOUT, Integer(pTel));  
    8. end;</pre><br>  
    9. <pre></pre>  
    10. <br>  
    11. 接收消息:  
    [delphi] view plaincopy
     
      1. <pre class="delphi" name="code">procedure OnReciveDataMsg(var Msg: TMessage); message WM_RCV_AUTO_REPORT;  
      2. var  
      3.     pTel: ^string;  
      4. begin  
      5.     pTel := Pointer(Msg.LParam);  
      6.     sTelPhone := G_GetRealTelPhone(pTel^);  
      7.     Dispose(pTel);  
      8. end;  
      9. </pre>  
      10. <pre></pre>  
      11. <p> </p>  
      12. <p><strong>3、使用WM_COPYDATA传递,进程间的数据传递好像只有用wm_copydata消息,它可以跨进程拷贝内存。</strong></p>  
      13. <p>发送消息:</p>  
      14. <pre class="delphi" name="code">procedure SendString(strMSG: string);  
      15. var  
      16.   Data: tagCOPYDATASTRUCT;  
      17.   pBuf: PChar;  
      18. begin  
      19.   GetMem(pBuf, Length(strMSG) + 1);  
      20.   
      21.   try  
      22.     ZeroMemory(pBuf, Length(strMSG) + 1);  
      23.     StrPCopy(pBuf, strMSG);  
      24.   
      25.     Data.cbData:= Length(strMSG);  
      26.     Data.dwData:= Length(strMSG);  
      27.     Data.lpData:= pBuf;  
      28.   
      29.     SendMessage(hTargetWin, WM_COPYDATA, Integer(Self.Handle), Integer(@Data));  
      30.   finally  
      31.     FreeMem(pBuf);  
      32.   end;  
      33. end;</pre>  
      34. <p><br>  
      35. 接收消息:</p>  
      36. <pre class="delphi" name="code">procedure WMCopyData(var MSG: TMessage); message WM_COPYDATA;  
      37. procedure WMCopyData(var MSG: TMessage);  
      38. var  
      39.   Data  : ^tagCOPYDATASTRUCT;  
      40.   strMSG: string;  
      41. begin  
      42.   Data:= Pointer(Msg.lParam);  
      43.   
      44.   strMSG:= StrPas(Data.lpData);  
      45.   
      46.   ShowMessage(strMSG);  
      47. end;</pre>  
      48. <p><br>  
      49. 可以根据实际情况使用相应的方式来实现消息传递字符串。<br>  
      50. </p>  
  • 相关阅读:
    mysql explain语句各项含义
    group_concat用法以及字符串太长显示不全
    合并两个word文档,保持样式不变
    读取word模板,填充数据后导出
    java获取配置文件信息
    mysql5.6免安装使用
    时间格式转换
    Mysql中(@i:=@i+1)的作用
    SVN服务器搭建和使用(一)
    按需讲解之Supervisor
  • 原文地址:https://www.cnblogs.com/moonwind/p/4425590.html
Copyright © 2011-2022 走看看