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. try
    21. ZeroMemory(pBuf, Length(strMSG) + 1);
    22. StrPCopy(pBuf, strMSG);
    23. Data.cbData:= Length(strMSG);
    24. Data.dwData:= Length(strMSG);
    25. Data.lpData:= pBuf;
    26. SendMessage(hTargetWin, WM_COPYDATA, Integer(Self.Handle), Integer(@Data));
    27. finally
    28. FreeMem(pBuf);
    29. end;
    30. end;</pre>
    31. <p><br>
    32. 接收消息:</p>
    33. <pre class="delphi" name="code">procedure WMCopyData(var MSG: TMessage); message WM_COPYDATA;
    34. procedure WMCopyData(var MSG: TMessage);
    35. var
    36. Data  : ^tagCOPYDATASTRUCT;
    37. strMSG: string;
    38. begin
    39. Data:= Pointer(Msg.lParam);
    40. strMSG:= StrPas(Data.lpData);
    41. ShowMessage(strMSG);
    42. end;</pre>
    43. <p><br>
    44. 可以根据实际情况使用相应的方式来实现消息传递字符串。<br>
    45. </p>
时间: 2024-10-11 03:52:48

delphi使用消息传递字符串有三种方式可以实现的相关文章

关于Delphi中的字符串的详细分析

关于Delphi中的字符串的详细分析 只是浅浅的解析下,让大家可以快速的理解字符串. 其中的所有代码均在Delphi7下测试通过. Delphi 4,5,6,7中有字符串类型包括了: 短字符串(Short String) 长字符串(Long String) 宽字符串(Wide String) 零结尾字符串(Null-Terminated String).PChar和字符数组 1.短字符串(Short String) 固 定长度,最大字符数个数为255,短字符串也成为长度字节(Length-byt

关于Delphi中的字符串的浅析(瓢虫大作,里面有内存错误的举例)

关于Delphi中的字符串的浅析 只是浅浅的解析下,让大家可以快速的理解字符串. 其中的所有代码均在Delphi7下测试通过. Delphi 4,5,6,7中有字符串类型包括了: 短字符串(Short String) 长字符串(Long String) 宽字符串(Wide String) 零结尾字符串(Null-Terminated String).PChar和字符数组 1.短字符串(Short String) 固定长度,最大字符数个数为255,短字符串也成为长度字节(Length-byte)字

DELPHI XE2 采用 JSON 的方式来序列化对象

DELPHI XE2 采用 JSON 的方式来序列化对象 以下代码测试通过.问题是里面的中文,在反序列化后是乱码. 1. 序列化对象为字符串,Subject 里面的中文看起来正常,仍然是中文: 2. 反序列化为对象后,Subject 里面的中文是乱码. XE2 处理 Unicode 还是有问题啊. TItemRecord = class private FID: string; FSubject: string; FADate: TDateTime; published property ID:

Mac OS X中,有三种方式来实现启动项的配置

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; font: 22.0px "Times New Roman"; color: #000000 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "Times New Roman"; color: #000000 } p.p3 { margin: 0.0px 0.0px 0.0px 0.0p

【转】Java 5种字符串拼接方式性能比较。

最近写一个东东,可能会考虑到字符串拼接,想了几种方法,但对性能未知,于是用Junit写了个单元测试. 代码如下: import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TestS

python字符串连接方式有哪些

在python开发中,会经常用到python字符串http://www.maiziedu.com/group/article/10646/,在python字符串操作中常用的无外乎就是替换.删除.截取.复制.连接.比较.查询.分割等等,今天小编不给大家讲那么多,就单独讲讲python字符串连接的方式有哪些,今天在写代码,顺便总结一下: 最原始的字符串连接方式:str1 + str2 python 新字符串连接语法:str1, str2 奇怪的字符串方式:str1 str2 % 连接字符串:'nam

创建String字符串的方式与区别

Java中创建一个字符串的方式有很多种,常见如: String s = new String("riqi"); String s = "riqi"; 但两者有什么区别呢? 要知道,Java中new一个对象实际上是在栈内存中创建一个引用类型指向到堆内存中的对象,而字符串对象一旦创建就不能变更. Java为String类型提供了缓冲池机制,即当使用双引号方式创建字符串对象时,Java环境首先会从字符串缓冲池中寻找相同内容的字符串,如果找到则直接拿过来使用,如果没有则创建

《解读window核心编程》 之 字符和字符串处理方式

推荐的字符和字符串处理方式 開始将文本字符串想象为字符的数组,而不是 char 或字节的数组. 用通用数据类型(如 TCHAR/PTSTR )来表示文本字符和字符串. 用明白的数据类型(如 BYTE 和 PBYTE )来表示字节,字节指针和数据缓冲区. 用 TEXT 或 _T 宏来表示字面量字符和字符串.但为了保持一致性和更好的可读性,请避免两者混用: 运行全局替换(比如用 PTSTR 替换 PSTR ) ; 改动与字符串有关的计算.比如,函数常常希望我们传给它缓冲区打小的字符数.而不是字节数.

spring mvc返回json字符串的方式

spring mvc返回json字符串的方式 方案一:使用@ResponseBody 注解返回响应体 直接将返回值序列化json            优点:不需要自己再处理 步骤一:在spring-servlet.xml文件中配置如下代码 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans&quo