VCL中消息处理初探

mORMot 学习记录2 -- TSQLRestStorageInMemory数据库 使用TSQLRestStorageInMemory 创建数据库的数据,增加10万数量大概400毫秒 测试环境: delphi 10.2     moRMOT : 1.18.2975 unit Unit2; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, S 阅读详情

TObject是基类,所以我们先看一下TObject的DISPATCH方法。Dispatch根据传入的message来寻找相应的消息处理方法,如果找不到的话,就继续向上到父类的消息处理方法表中寻找响应的处理方法,一直到找到为止,如果找到顶还没有,则调用DefaultHandle来处理该消息。message可以是任何的类型,Dispatch假设message的头两位是消息的ID,它就是根据ID来寻找消息处理方法的。虽然任何类型的message都可以被接受,但是TObject的子类还是希望传入的message参数是TMessage的记录类型或其他证明的记录类型。

以下声明和注释摘自与system.pas:

{ TObject.Dispatch accepts any data type as its Message parameter. The

first 2 bytes of the data are taken as the message id to search for

in the object's message methods. TDispatchMessage is an example of

such a structure with a word field for the message id.

}

TDispatchMessage = record

MsgID: word;

end;

类的继承关系如下:

TObject->TPersistent->TComponent->TControl

TControl是所以可视化组件的父类,TControl提供了一个新的方法,WndProc:

procedure TControl.WndProc(var Message: TMessage);

var

Form: TCustomForm;

KeyState: TKeyboardState;

WheelMsg: TCMMouseWheel;

begin

//如果处在设计期

if (csDesigning in ComponentState) then

begin

Form := GetParentForm(Self);//得到拥有该组件的窗体

if (Form <> nil) and (Form.Designer <> nil) and

Form.Designer.IsDesignMsg(Self, Message) then Exit //消息由窗体来处理

end;

//窗体可以为其拥有的组件来处理键盘消息。

if (Message.Msg >= WM_KEYFIRST) and (Message.Msg <= WM_KEYLAST) then

begin

Form := GetParentForm(Self);

if (Form <> nil) and Form.WantChildKey(Self, Message) then Exit;

end

//关于鼠标的消息

else if (Message.Msg >= WM_MOUSEFIRST) and (Message.Msg <= WM_MOUSELAST) then

begin

//如果组件不可以接受和处理双击消息,就将双击消息映射为单击消息。

if not (csDoubleClicks in ControlStyle) then

case Message.Msg of

WM_LBUTTONDBLCLK, WM_RBUTTONDBLCLK, WM_MBUTTONDBLCLK:

Dec(Message.Msg, WM_LBUTTONDBLCLK - WM_LBUTTONDOWN);

end;

case Message.Msg of

WM_MOUSEMOVE: Application.HintMouseMessage(Self, Message);//如果是鼠标移动的消息,则出现hint窗口

WM_LBUTTONDOWN, WM_LBUTTONDBLCLK://如果是左键被按下,或者双击,如果是自动拖动模式,则开始拖动,并将左键按下的状态加入组件的状态。

begin

if FDragMode = dmAutomatic then

begin

BeginAutoDrag;

Exit;

end;

Include(FControlState, csLButtonDown);

end;

WM_LBUTTONUP:

Exclude(FControlState, csLButtonDown); //如果是左键放开,则将左键按下的状态剔除。

else

with Mouse do

if WheelPresent and (RegWheelMessage <> 0) and //如果鼠标有滚轮,并且滚轮滑动时发出了消息

(Message.Msg = RegWheelMessage) then

begin

GetKeyboardState(KeyState); //将256虚拟键的状态拷贝到缓存中去

with WheelMsg do //填充记录

begin

Msg := Message.Msg;

ShiftState := KeyboardStateToShiftState(KeyState);

WheelDelta := Message.WParam;

Pos := TSmallPoint(Message.LParam);

end;

MouseWheelHandler(TMessage( WheelMsg)); //派发鼠标滚轮的消息

Exit;

end;

end;

end

else if Message.Msg = CM_VISIBLECHANGED then

with Message do

SendDockNotification(Msg, WParam, LParam); //处理自定义消息

Dispatch(Message); //派发未处理的消息

end;

但是只有TWinControl可以获得焦点:

procedure TWinControl.WndProc(var Message: TMessage);

var

Form: TCustomForm;

begin

case Message.Msg of

WM_SETFOCUS: //设置控件的焦点

begin

Form := GetParentForm(Self);

if (Form <> nil) and not Form.SetFocusedControl(Self) then Exit;

end;

WM_KILLFOCUS:

if csFocusing in ControlState then Exit;

//当鼠标有活动的时候发出该消息,如果鼠标没有被捕捉到,则消息发往鼠标下面的那个窗口,否则消息将发往捕捉到鼠标的那个窗口。

WM_NCHITTEST:

begin

inherited WndProc(Message); //调用父类的处理方法

//如果窗体被挡住并且在指定的点没有控件,则返回结果为在client区。

if (Message.Result = HTTRANSPARENT) and (ControlAtPos(ScreenToClient(

SmallPointToPoint(TWMNCHitTest(Message).Pos)), False) <> nil) then

Message.Result := HTCLieNT;

Exit;

end;

WM_MOUSEFIRST..WM_MOUSELAST:

if IsControlMouseMsg(TWMMouse(Message)) then //鼠标消息是否直接发往组件的窗体子组件

begin

{ Check HandleAllocated because IsControlMouseMsg might have freed the

window if user code executed something like Parent := nil. }

if (Message.Result = 0) and HandleAllocated then

DefWindowProc(Handle, Message.Msg, Message.wParam, Message.lParam);//调用默认的的消息处理方法对该消息进行默认处理。

Exit;

end;

WM_KEYFIRST..WM_KEYLAST:

if Dragging then Exit;

WM_CANCELMODE:

if (GetCapture = Handle) and (CaptureControl <> nil) and

(CaptureControl.Parent = Self) then

CaptureControl.Perform(WM_CANCELMODE, 0, 0);

end;

inherited WndProc(Message);

end;

TApplication在程序中发挥着重要的作用:

Application.Run;

procedure TApplication.Run;

begin

FRunning := True;

try

AddExitProc(DoneApplication);

if FMainForm <> nil then

begin

case CmdShow of

SW_SHOWMINNOACTIVE: FMainForm.FWindowstate := wsMinimized;

SW_SHOWMAXIMIZED: MainForm.Windowstate := wsMaximized;

end;

if FShowMainForm then

if FMainForm.FWindowstate = wsMinimized then

Minimize else

FMainForm.Visible := True;

//一个消息循环直到Terminated为True时才退出。

repeat

try

HandleMessage;

except

HandleException( Self);

end;

until Terminated;

end;

finally

FRunning := False;

end;

end;

procedure TApplication.HandleMessage;

var

Msg: TMsg;

begin

if not ProcessMessage(Msg) then Idle(Msg);

end;

function TApplication.ProcessMessage(var Msg: TMsg): Boolean;

var

Handled: Boolean;

begin

Result := False;

if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then //从现成的消息循环中取出消息并放入指定的消息结构中。

begin

Result := True;

if Msg.Message <> WM_QUIT then //如果不是退出消息则进行相应的处理

begin

Handled := False;

if Assigned(FOnMessage) then FOnMessage(Msg, Handled);

if not IsHintMsg(Msg) and not Handled and not IsMDIMsg(Msg) and

not IsKeyMsg(Msg) and not IsDlgMsg(Msg) then

begin

TranslateMessage(Msg);

DispatchMessage(Msg);

end;

end

else

FTerminate := True;

end;

end;

TSQLRestStorageInMemory 内存数据库 moRMOT 框架使用TSQLRestStorageInMemory 创建内存数据库初步研究 立即下载

相关推荐

Gnostice PDFtoolkit 5.0 VCL

Introduction ============ Gnostice PDFtoolkit is a powerful component suite for users of Delphi and C++Builder to edit, enhance, secure, merge, split, view, print, PDF documents and also process AcroForms documents. PDFtoolkit does not require PDF software such as Adobe PDF library, Adobe Acrobat Professional or Ghostscript. The ReadMe file contains information on where to start and how to get access to additional resources so that you can get the best out of Gnostice PDFtoolkit.

VCL的命令消息[转自csdn中myfirenze的专栏]

VCL的命令消息 Windows中的消息有三种:标准的窗口消息,命令消息,控件通知消息,再加上我们自定义的消息,所以Windows程序我们要处理四种消息,幸运的我们常用的开发工具都带了自己的Framwork,Visual C++中用的是MFC,Delphi和BCB用的VCL,这些Framwork都有一套自己的消息处理机制,它们处理前面三种系统已经定义的消息,所以我们要...

weixin_34241036的博客 246

RPMP:用于Pascal的RPMP-Restful插件中间件是基于mORmot和Qplugins框架二次开发的中间件插件框架,这是一个快速开发的业务框架。主要是中间件开发提供了一种解决方案。它的特点就是简单,通讯和通信和业务可以随意搭配,只要你愿意,非常直接灵活。对外提供Restful接口,可以很容易定制你的中间件,一件移动App前端服务器,Web服务器等。站在巨人的肩上才能看的更远... mORmot下载地址:https

RPMP 用于Pascal的RPMP-Restful插件中间件是基于mORmot和Qplugins框架二次开发的中间件插件框架,这是一个快速开发的业务框架。主要是中间件开发提供了一种解决方案。它的特点就是简单,通讯和通信和业务可以随意搭配,只要你愿意,非常直接灵活。对外提供Restful接口,可以很容易定制你的中间件,一件站在巨人的肩上才能看的更远... mORmot下载地址: : Qplugins下载地址: 未来更新计划 1,完善插件热更新功能 2,支持身份认证(jwt \ OAuth 2.0等) 3,访问控制,api接口管理(有好的建议可以提) 4,文档及偏业务插件完整流程 5,该框架完善完毕,后续会分出针对不同的应用场景的RPMP系列服务器 6,..... 关于作品 如果您基于该开源产品开发了产品,请给作者发送一个截图,主要为了宣传,完全自愿。谢谢 基于该框架所做的应用截图

TObject.Dispatch

由于TObject.Dispatch几乎被大量执行,为了提高效率,使用汇编语言撰写。在Dispatch方法中首先检查触发的消息ID是否在0~c000H之中,如果不在此范围调用DefaultHandler;如果是的话就调用GetDynaMethod从VCL组件中根据消息ID在动态方法表格中搜寻。如果找到能够处理消息的VCL事件处理函数就跳到此事件处理函数执行,否则就调用DefaultHandler虚...

weixin_30672019的博客 148

Gnostice_PDF_Toolkit_Pro_Plus_5.0.0.402_With_Source_for_DXE10.2_Downloadly.ir.rar

Gnostice_PDF_Toolkit_Pro_Plus_5.0.0.402_With_Source_for_DXE10.2_Downloadly.ir.rar

Synopse mORMot Framework SAD 1.18.pdf

Synopse mORMot Framework 的文档说明书。pdf格式的文档不太好找,我上传到这里共有需要的朋友下载。

Delphi与消息1:TObject中的Dispatch和DefaultHandler

 TObject是Delphi中的基类,它提供了消息的基本分装 TObject = class ....... procedure Dispatch(var Message); virtual; procedure DefaultHandler(var Message); virtual;end; 主要通过Dispatch和DefaultHandler方法

徐艳成的Blog 1271

Delphi使用SQLite3内存数据库

Delphi使用SQLite3,包括本地数据库和内存数据库,本地数据库加载到内存,内存数据库备份到本地,使用sqlite simple delphi包装类。

VCL中消息处理初探 (转)

VCL中消息处理初探 (转)[@more@]Tobject是基类,所以我们先看一下TObject的DISPATCH方法。Dispatch根据传入的message来寻找相应的消息处理方法,如果找不到的话,就继续向上到父类的消息处理...

cuiji1279的博客 119

从零到一:FAST_LIO与FAST_LIO2算法环境搭建与实战评测

本文详细介绍了FAST_LIO与FAST_LIO2算法的环境搭建与实战评测,包括算法原理、环境配置避坑指南、源码编译技巧及性能对比。FAST_LIO2凭借ikd-tree数据结构在动态环境中表现优异,处理速度提升至15ms,内存占用降低40%。文章还提供了常见问题排查和进阶优化技巧,助力开发者高效实现SLAM应用。

weixin_29271053的博客 470

windows系统下,如何为comfyui如何安装triton

​ 有些加速插件、模型在安装的时候,比如说sageattention的安装,就需要提前安装triton这个包,不过这个包有点特殊,windows下略微不好装,经常会装失败。 🎠如何安装 之前也有人介绍过,要到github上找个wheel文件,找到对应的版本安装下就好了。 问题是:https://github.com/woct0rdho/triton-windows/releases 这个git地址上,已经找不到wheel文件了... ​

聚梦小课堂 4497

由VCL中的代码理解VCL中的消息处理机制

 Delphi,一个非常优秀的开发工具,拥有强大的可视化开发环境、面向组件的快速开发模式、优秀的VCL类库、快速的代码编译器、强大的数据库和WEB开发能力、还有众多的第三方控件支持...(此处省略x千字,既然大家都知道了,不浪费口水了 ^_^)说到VCL的优秀就不能不提到其对Windows消息及API的较全面和完美的封装,正因为如此开发者在大多数情况下甚至不需理会Windows消息处理的细节,

drawwingmap的日记本 1562

AI 小说生成器本地部署完全指南

这篇文章介绍了本地部署AI小说生成器的完整指南,主要面向网文作者、内容创作者和AI爱好者。文章从环境搭建到创作实践,详细讲解了三种主流部署方案:Ollama(推荐新手)、LMStudio(图形界面)和text-generation-webui(高级定制)。内容涵盖硬件需求、系统架构、模型选择、API对接、提示词工程等关键技术环节,并提供了小说创作的特制提示词模板和参数调优建议。文章还讨论了长篇小说管理、多模型协作等进阶技巧,以及版权伦理等法律问题。最后推荐了相关工具资源和社区论坛,帮助读者实现安全、高效、可

珂珂可爱多 2251

我所理解的VCL消息處理流程

一、VCL消息處理流程:1.Application從windows消息隊列中取得屬於當前線程的所有消息。2.Application:translatemessage.3.Application:dispatchmessage分派消息  3.1 dispatchmessage根據消息中的handle來找到目標元件的回調函數,並調用這個回調函數(wndproc)。4.每個元件(TWincontrol及

ssz的技术博客 1342

大模型学习笔记四:LangChain开发框架解析

1、模型I/O封装LLMs:大语言模型Chat Models:一般基于LLMs,但按对话结构重新封装PromptTemple:提示词模板OutputParser:解析输出2、数据连接封装Document Loaders:各种格式文件的加载器Document transformers:对文档的常用操作,如:split,filter,translate,extract metadata,etcTextr Embedding Models:文本向量化表示,用于检索等操作。

谢白羽 4282

CANoe信号传输故障排查指南

本文提供了全面的CANoe信号传输故障排查指南,涵盖从硬件连接、通道配置到软件脚本与数据库加载的全链路诊断。针对常见的通道指示灯不亮、信号无法发送及ECU握手失败等问题,给出了基于CANoe工具和CAPL脚本的详细排查步骤与解决方案,帮助工程师系统化定位并解决实车测试中的通信故障。

ice55的博客 257

VCL消息处理机制

说到VCL中的消息处理就不能不提到TApplication,Windows会为每一个当前运行的程序建立一个消息队列,用来完成用户与程序的交互,正是通过Application完成了对Windows消息的集中处理! 首先通过Application.Run进入消息循环进行消息的处理,其中调用了HandleMessage。 procedure TApplication.Han...

189

KIBANA可视化管理界面说明

更说明转自https://blog.csdn.net/IT_ZRS/article/details/125496588 1 主要结构功能 使用浏览器访问 ip:5601 默认端口,进入首页 Discover:日志管理视图 主要进行搜索和查询 Visualize:统计视图 构建可视化的图表 Dashboard:仪表视图 将构建的图表组合形成图表盘 Timelion:时间轴视图 随着时间流逝的数据 APM:性能管理视图 应用程序的性能管理系统 Canvas:大屏展示

tian830937的专栏 7083

VCL消息处理机制的内幕

由VCL中的代码理解VCL中的消息处理机制 Delphi,一个非常优秀的开发工具,拥有强大的可视化开发环境、面向组件的快速开发模式、优秀的VCL类库、快速的代码编译器、强大的数据库和WEB开发能力、还有众多的第三方控件支持...(此处省略x千字,既然大家都知道了,不浪费口水了 ^_^) 说到VCL的优秀就不能不提到其对Windows消息及API的较全面和完美的封装,正因为如此开发者在大多数

Jenhy的专栏 702

【Matlab】matlab代码实现迭代学习控制

该文介绍了在Matlab中实现迭代学习控制(ILC)的方法。ILC通过利用历史轨迹数据来优化重复任务的控制性能。文章提供了一个步进电机控制示例,包括:1)定义正弦轨迹;2)设置100次迭代和0.1学习率;3)建立二阶系统模型;4)执行ILC算法计算控制输入;5)绘制期望轨迹与实际输出的对比图。该示例展示了ILC的基本实现过程,并指出实际应用可能需要更复杂的设计。代码演示了误差计算、控制输入更新和结果可视化等关键步骤。

unber的博客 200

uniapp - 微信支付报错 requestPayment:fail:HBuilder mainifest.json中配置的支付appid和生成订单使用的appid不一致,如果是HB调试请在线打包

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,微信支付,报错,errMsg,requestPayment:fail:HBuildermainifest.json中配置的支付appid和生成订单使用的appid不一致,如果是HB调试请在线打包,http://ask.dcloud.net.cn/article/282,已经都检查了还是报错,如何解决这个问题,还是不行,错误,苹果微信支付报错,安卓app微信支付出错,打包,在线打包也不行,本地打包,支

🏆 前端领域优质创作者 3500

Delphi VCL 的消息处理机制(1)

开始学习 Delphi VCL 的消息处理机制。自从我写下《Delphi的对象机制浅探》,至今正好一个星期,我也基本上把 Delphi VCL 的消息处理框架读完了。我的学习方法就是阅读源代码,一开始比较艰苦,后来线索逐渐清晰起来。   我在分析 VCL 消息机制的过程中,基本上只考查了三个类 TObject、TControl 和 TWinControl。     推荐阅读:     《De

流年~~ 2225

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Delphi语言的VCL框架

因此,main 函数的作用是初始化应用程序,并启动消息循环,而 TApplication 组件负责处理消息循环并转发消息。除了 TApplication 和 TWinControl 组件外,VCL 还提供了一些其他的组件来处理特定类型的消息,如 TTimer 组件用于处理定时器消息,TMessage 组件用于处理自定义消息等等。在 Delphi 应用程序中,TApplication 组件负责处理应用程序的消息循环,但它并不直接处理应用程序的 main 函数入口。

zhangzhechun的专栏 2284

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Delphi VCL消息处理机制(2)

=============================================================================== ⊙ VCL 的消息处理从 TWinControl.MainWndProc 开始 =========================================================================

流年~~ 1677

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

上一篇: BroadcastSystemMessage
下一篇: 由VCL中的代码理解VCL中的消息处理机制
Dcdu
博客等级 码龄21年 44粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值