【Delphi】中使用消息Messages(一)

目录

什么是消息:

什么时候使用消息:

选择一个合适的消息方案:


什么是消息:

在程序开发中,消息(Messages)是一种在程序进程间进行通信的机制。

在程序中,消息可能来自:

  • 系统:用于通知应用程序用户输入、正在绘制阶段和其他系统范围的事件。
  • 我们自己的程序:程序不同模块之间通过消息进行通信。

什么时候使用消息:

编写应用程序时,通常是处理事件而不是消息。组件(控件)会公开我们可以处理的事件,但是它们在内部使用消息(对开发者来说是透明的)与其他组件通信并处理系统消息。

我们在下列情况下需要使用消息:

  • 应用程序必须响应事件未公开的系统或框架消息。
  • 自定义组件,组件间通过消息进行通信交互。
  • 多线程程序中,线程间通过消息进行通信。

选择一个合适的消息方案:

当我们使用delphi开发项目的时候,有两种不同的消息解决方案可供使用。当项目是应用程序时,通常会选择应用程序框架使用的消息传递解决方案:

  • FireMonkey 程序:需要使用跨平台的消息处理机制,使用 RTL
  • VCL程序:依赖Windows API进行消息传递。

如果我们是写一个自定义的组件(控件),无论组件使用的框架是FireMonkey还是VCL,我们都可以使用跨平台RTL消息传递系统。然而,在VCL组件上使用Windows API消息传递解决方案可能更明智,因为现有的VCL组件仅使用Windows API接收和发送消息,而且VCL框架不会像FireMonkey那样将Windows API消息转换为跨平台消息。

下一节:【Delphi】中使用消息Messages(二)​​​​​​​

Delphi和Python之间通讯可以使用消息队列来实现,具体步骤如下: 1. 在Delphi创建一个消息队列用于接收Python发来的消息。 2. 在Python使用消息队列模块创建一个消息队列,并将需要发送的消息放入队列。 3. Delphi通过轮询消息队列来获取Python发送的消息,并根据消息内容进行相应的处理。 4. Python可以通过轮询消息队列来获取Delphi发送的消息,并根据消息内容进行相应的处理。 下面是一个简单的示例代码: 在Delphi: ```delphi uses Windows, Messages; const WM_PYTHON_MSG = WM_USER + 1; // 定义Python消息ID type TForm1 = class(TForm) private { Private declarations } procedure HandlePythonMsg(var Msg: TMessage); message WM_PYTHON_MSG; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.HandlePythonMsg(var Msg: TMessage); var strMsg: string; begin strMsg := PChar(Msg.LParam); // 获取Python发送的消息 // 根据消息内容进行相应的处理 ShowMessage(strMsg); end; ``` 在Python: ```python import win32api import win32con import win32event import win32file import struct WM_PYTHON_MSG = win32con.WM_USER + 1 # 定义Python消息ID def send_msg_to_delphi(msg): hwnd = win32gui.FindWindow(None, "DelphiForm") # 获取Delphi窗口句柄 if hwnd: win32api.PostMessage(hwnd, WM_PYTHON_MSG, 0, msg) # 发送消息Delphi else: print("Can't find Delphi window") def recv_msg_from_delphi(): handle = win32event.CreateEvent(None, 0, 0, None) # 创建事件 overlapped = win32file.OVERLAPPED() overlapped.hEvent = handle buf = struct.pack("L", WM_PYTHON_MSG) # 构造消息格式 (err, msg) = win32file.ReadFile(handle, buf, overlapped) # 从消息队列获取消息 if err == win32file.ERROR_IO_PENDING: win32event.WaitForSingleObject(handle, 1000) # 等待事件 (err, msg) = win32file.GetOverlappedResult(handle, overlapped, True) if err == 0: print("Error reading from message queue") else: return msg.decode("utf-8") ``` 上述示例代码Delphi的 HandlePythonMsg 过程用于处理接收到的Python消息,Python的 send_msg_to_delphi 函数用于将消息发送给Delphi,recv_msg_from_delphi 函数用于从Delphi接收消息。注意,Delphi消息ID和Python消息ID必须一致。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海纳老吴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值