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>  
  • 相关阅读:
    《DSP using MATLAB》Problem 6.17
    一些老物件
    《DSP using MATLAB》Problem 6.16
    《DSP using MATLAB》Problem 6.15
    《DSP using MATLAB》Problem 6.14
    《DSP using MATLAB》Problem 6.13
    《DSP using MATLAB》Problem 6.12
    《DSP using MATLAB》Problem 6.11
    P1414 又是毕业季II
    Trie树
  • 原文地址:https://www.cnblogs.com/moonwind/p/4425590.html
Copyright © 2011-2022 走看看