TMenu是什么?他是VCL中封装的TMainMenu和TPopupMenu的基类。与其说对TMenu失望,其实是对VCL中对TMainMenu和TPopupMenu的失望。
为什么呢?这基本上还得归咎于微软自己。微软在推出Windows的同时,却坚决的在推Office系列产品。而且Office的更新速度和Windows几乎一样快。更重要的是,Office系列产品的界面风格,特别是菜单,和标准Windows的完全不同。
当微软的Office推广地非常好的时候,我们都在渴望也能设计出一样的界面。对于只是外表改变的需求来讲,很自然地可以考虑重新覆盖TMenuItem的Draw方法。
可是,当你真的想这么干的时候,你会发现两件事,一件让你高兴,一件让你失望。先说高兴的事吧:
负责Draw工作的两个方法:AdvancedDrawItem和MeasureItem都是声明的Virtual类型的函数。也就是说,我们完全可以通过覆盖这些方法的方式去实现。而且,显然的,TMenuItem的设计者,显然已经考虑到这样的扩展了。
而且,通过观察AdvancedDrawItem的实现,你更可以发现你需要修改的代码点。
if(ParentMenu<>nil)and(ParentMenu.OwnerDrawor(ImageList<>nil))and
(Assigned(FOnAdvancedDrawItem)orAssigned(FOnDrawItem))then
begin
DrawItem(ACanvas,ARect,Selected);
ifAssigned(FOnAdvancedDrawItem)then
FOnAdvancedDrawItem(Self,ACanvas,ARect,State);
endelse
if(ParentMenu<>nil)and(notParentMenu.IsRightToLeft)then
NormalDraw
else
BiDiDraw;
请注意看NormalDraw和BiDiDraw。那么我们的OfficeDraw只要并列选择就可以了。当然了,如果要完全放弃原来的画法,那就更容易了。
遗憾的是,我们必须听另一个让人失望的事。那就是,Menus单元中,所有创建TMenuItem的地方,都是直接调用TMenuItem.Create的方式。如果你想派生一个TOfficeMenuItem类,你无法找到能创建你的类的地方。
这种情况,一般的设计就是,在TMenu类中有一个虚拟方法,返回一个类型为TMenuItem的实例。至于用哪个具体的类型,可以有TMenu的派生类来决定。比如,你自定一个TOfficeMenu,当创建TMenuItem的实例的时候,使用TOfficeMenuItem创建。简单一点就是下面的代码:
function CreateMenuItem: TMenuItem; override;
而实现的时候,简单用下面的代码实现:
Result := TOfficeMenuItem.Create;
每当我不得不面对这个现实的时候,我就开始考虑是不是有办法绕过去。有一种办法,是实现TMenuItem的OnDrawItem事件。还有一种办法,就是直接使用HOOK的方式替换TMenuItem类。
我能想到的上面两个方法,都只算是在特定应用中解决问题的办法。作为热衷组件化设计的我来讲,显然更愿意自己实现一个TOfficeMenu和TOfficeMenuItem。并且不是仅仅通过修改事件,而是完全通过面向对象的多态性来完成这个功能。
失望TMenu是因为其扩展性方面的欠考虑,因为此,导致VCL中默认就代用两种方式。而第三方蓬勃发展的如TBX系列和Raze系列界面控件,也都证明了其设计方面的欠缺。
其实我们也可正好可以思考一下,设计,应该考虑好开闭原则。特别是“对未来的派生是开放的”这一点。怎么样的设计都可以完成目前的功能。可是能不能考虑到以后的扩展,那就是设计的好坏了。
分享到:
相关推荐
所有源码都有经过测试,可以运行,放心下载~
CSDN Matlab研究室上传的资料均有对应的仿真结果图,仿真结果图均是完整代码运行得出,完整代码亲测可用,适合小白; 1、完整的代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
Amanda:Amanda机器学习实践.docx
数据集格式:VOC格式+YOLO格式 压缩包内含:3个文件夹,分别存储图片、xml、txt文件 JPEGImages文件夹中jpg图片总计:826 Annotations文件夹中xml文件总计:826 labels文件夹中txt文件总计:826 标签种类数:1 标签名称:["Snake"] 每个标签的框数: Snake 框数 = 1147 总框数:1147 图片清晰度(分辨率:像素):清晰 图片是否增强:否 标签形状:矩形框,用于目标检测识别 重要说明:暂无 特别声明:本数据集不对训练的模型或者权重文件精度作任何保证,数据集只提供准确且合理标注
RCEP伙伴国技术性贸易壁垒对中国出口贸易的影响研究_刘主光.caj
【光伏功率预测】基于matlab粒子群算法优化高斯过程回归PSO-GPR光伏功率预测(多输入单输出)【Matlab仿真 4373期】
【DELM回归预测】基于matlab蜂虎狩猎算法改进深度学习极限学习机BEH-DELM数据回归预测【Matlab仿真 3847期】
CSDN Matlab研究室上传的资料均有对应的仿真结果图,仿真结果图均是完整代码运行得出,完整代码亲测可用,适合小白; 1、完整的代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
内容概要:本文综述了数据挖掘技术的核心概念和技术,详细介绍了多种数据挖掘算法,包括关联规则挖掘算法(如Apriori、FP-tree),分类算法(如决策树的ID3/C4.5、K-NN、贝叶斯分类)和聚类算法(如K-均值、层次聚类和密度聚类)。此外,文档也探讨了KDD(知识发现过程)、聚类与分类的区别以及聚类分析算法的评估指标等关键议题。 使用场景及目标(期末突击):①理解和掌握数据挖掘的基本原理与常用算法;②应用于各种数据分析场景,如客户分群、推荐系统、市场篮子分析等。
页面居中设置的process
【光伏功率预测】基于matlab高斯过程回归GPR光伏功率预测【Matlab仿真 4372期】
1、嵌入式物联网单片机项目开发例程,简单、方便、好用,节省开发时间。 2、代码使用IAR软件开发,当前在CC2540/CC2541上运行,如果是其他型号芯片,请自行调整。 3、软件下载时,请注意接上硬件,并确认烧录器连接正常。 4、有偿指导v:wulianjishu666; 5、如果接入其他传感器,请查看账号发布的其他资料。 6、单片机与模块的接线,在代码当中均有定义,请自行对照。 7、若硬件有差异,请根据自身情况调整代码,程序仅供参考学习。 8、代码有注释说明,请耐心阅读。
数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数):3154 标注数量(json文件个数):3154 标注类别数:7 标注类别名称:["Healthy-mango","Damaged-mango","Anthracnose","Bacterial-Black-spot","Others","Fruitly","Mechanical-damage"] 每个类别标注的框数: Healthy-mango count = 603 Damaged-mango count = 4419 Anthracnose count = 2840 Bacterial-Black-spot count = 831 Others count = 485 Fruitly count = 2469 Mechanical-damage count = 33 使用标注工具:labelme=5.5.0 标注规则:对类别进行画多边形框polygon 重要说明:可以将数据集用labelme打开编辑,json数据集需自己转成mask或者yolo格式或者coco
一、主要功能 Ventoy能够支持在同一个U盘上存储多个不同的操作系统镜像,并在启动时提供选择菜单,方便用户选择要启动的操作系统。它无需反复格式化U盘,只需将ISO、WIM、IMG、VHD(x)、EFI等类型的文件拷贝到U盘里面就可以启动了,无需其他操作。同时,Ventoy还支持大部分常见类型的操作系统,如Windows、Linux、Unix、VMware、Xen等。 二、使用优势 便捷性:使用Ventoy制作启动盘非常简单,用户只需将U盘插入电脑,运行Ventoy安装程序,按照提示操作即可完成启动盘的创建。此外,Ventoy支持一次性拷贝多个不同类型的镜像文件,并在启动时显示一个菜单供用户选择,大大提高了使用的便捷性。 多系统支持:Ventoy能够支持几乎所有主流的操作系统,满足用户在操作系统选择和使用上的灵活性需求。 快速启动:Ventoy在启动时能够快速加载操作系统选择菜单,减少了用户的等待时间,提高了工作效率。 更新与维护:Ventoy项目保持活跃的更新,开发者不断修复漏洞、优化性能,并增加对新操作系统和硬件的支持。
管理员模块: 系统管理员管理:管理系统管理员的账户和权限。 药品类别管理:管理药品的分类信息。 药品信息管理:管理药品的详细信息,如名称、规格、价格等。 药品供应商管理:管理药品供应商的信息。 员工信息管理:管理医院员工的资料和信息。 药品出库管理:管理药品出库的流程和记录。 药品销量查询统计:查询和统计药品的销售情况。 员工模块: 员工资料修改:员工可以修改自己的个人信息。 药品销售登记:员工记录药品的销售情况。 出库信息查询:员工查询药品出库的相关信息。 环境说明: 开发语言:Java,jsp JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea 部署容器:tomcat
【ELM回归预测】基于matlab人工兔算法优化极限学习机ARO-ELM数据回归预测【Matlab仿真 3834期】
1、嵌入式物联网单片机项目开发例程,简单、方便、好用,节省开发时间。 2、代码使用IAR软件开发,当前在CC2540/CC2541上运行,如果是其他型号芯片,请自行调整。 3、软件下载时,请注意接上硬件,并确认烧录器连接正常。 4、有偿指导v:wulianjishu666; 5、如果接入其他传感器,请查看账号发布的其他资料。 6、单片机与模块的接线,在代码当中均有定义,请自行对照。 7、若硬件有差异,请根据自身情况调整代码,程序仅供参考学习。 8、代码有注释说明,请耐心阅读。
Comsol含色散材料光子晶体能带求解。 包含一维光子晶体和二维光子晶体。 共十余个mph文件,包含多个技巧。
【风电功率预测】基于matlab ARIMA结合支持向量机SVM风电功率预测【Matlab仿真 4571期】
【ESN回归预测】基于matlab粒子群算法优化回声状态网络PSO-ESN数据回归预测【Matlab仿真 4383期】