warrially warrially
关注数: 420 粉丝数: 531 发帖数: 14,409 关注贴吧数: 56
第一次用EXE+BPL+DLL项目总结  前段时间研究了一下BPL方式的开发,刚好最近有个小项目,于是尝试了一下,项目已完成。 有一些心得和体会,写下来与大家分享,请大家提出不足,另外有在研究BPL方面的朋友,有问题可以大家 共同探讨,以便进得更快一些。 关于一个项目的总结 ( EXE+BPL+DLL 模式) 以前一直采用一个独立的EXE文件的方式做项目,当时的感觉就是方便,不用考虑得太多,把所有的业务逻辑功能 做完后,编译成一个EXE执行文件就OK了,因为一直没有研究过BPL这种框架的编程,最近研究了一下,感触很深, 这种模式才是更方便的。而且对于团队模式更是方便,只要把各Team的BPL拿来就完成了。基于这种思想,最近应 用到一个新的项目上,已初见成效,现对这个项目总结如下:   一、规划   BPL框架编程规划很重要,一个项目要分成N个BPL,每个BPL的作用、分工在分析时必须确定下来,这一点很重要。   本项目分为以下几种包:   (1)、DBCommon.bpl --> 数据模块包,包括数据模块、数据库读写类模块 (数据访问层)   (2)、pubComon.bpl --> 公共函数、过程单元,公共变量单元、自定义结构类型单元、自定义类单元   (3)、BaseForm.bpl --> 所有窗体的基类单元、业务逻辑基类窗体单元   在(3)的基础上,按照不同的业务逻辑,建立不同业务的业务包,例:A.bpl,B.bpl,C.bpl...... (4)、A.bpl --> 业务包1 (5)、b.bpl --> 业务包2 ......根据业务逻辑的分类,建立不同的业务包。  二、设计   包的应用是有先后的,一些基础包必须首先建立好,以便供其他包在建立时被应用,基础包在修改后,所有应用该 基础包的必须重新编译,而且顺序不能搞错。例: DBCommon.bpl-->BaseForm.bpl-->A.bpl 当DBCommon.bpl修改并 重新编译后,后面两个包必须重新编译,且先编译BaseForm.bpl,后编译A>bpl BaseForm.bpl包中有整个项目的基类窗体单元,以及从该基类窗体继承的业务逻辑基类窗体单元,在基类窗体单元 中将整个项目的风格统一、包括字体,各控件包括第三方控件的样式、颜色等做到了规范统一,窗体关闭时应该释放的 内容等。而基类窗体的相关风格、样式是由主程序EXE在初始化时进行布局,这样如果想换风格,只要在公共变量单元中 修改相关的内容即可。 ( 注:本项目没有使用皮肤,只是通过颜色等风格进行控制 )     例1:为了使DevExpress组件的风格与整个项目的风格一致,特别是TcxGrid在选用dxOffice11样式时的颜色, 因为dxOffice11默认的颜色是采用深蓝色的那种,为了使TcxGrid的颜色与整个项目的颜色配套,就必须 调整,包括线的颜色,这个设置在EXE初始化时得到了安排,这样设计后,整体效果比较理想。     例2:项目中也采用了第三方控件RZ组件,这也是一个很好的三方控件,这个控件也有一个很好的样式统一控件, 只要控制好就可以与项目的风格融合到一起了。例TrzFrameController、TrzMenuController等,就是为了 统一风格而使用的。设置好这两个非可视控件的样式,就可以达到控件所有使用这个风格的控件了。而主 程序只要在初始化时,设置它们的风格就可得到一劳永逸的效果。 三、调用    框架确定了,包功能完成了,余下来就是主EXE载入Bpl运行了。载入包分为动态和静态两种方式。根据业务的规 划,三种基础包DBCommon.bpl,pubComon.bpl,BaseForm.bpl是静态载入,由主EXE编译时加入作为必须使用的
FMX下的消息处理惩罚 因为FireMonkey是为了跨平台而存在的,所以Windows下特有的概念在FMX下是不存在的,比如消息机制 然则你创建一个FM法度,发明仍然可以在Windows下工作,所以它必然是有消息处理惩罚机制的,只不过封装了起来,你无法直接操纵罢了 今天是要在FMX下实现Vcl下的WndProc函数,来达到处理惩罚消息的目标 unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, FMX.Forms, FMX.Platform.Win, FMX.Types, FMX.Layouts, FMX.Memo; type TForm1 = class(TForm) Memo1: TMemo; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private FHwnd: HWND; // 保存窗口句柄 FOldWndProc: LONG; // 保存原始的消息处理惩罚函数 public function WndProc(Hwnd: HWND; Msg:UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; end; var Form1: TForm1; implementation {¥R *.fmx} function WindowProc(Hwnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; begin // 因为在凡是开辟时,须要接见窗口内部的办法或控件等 // 为了便利起见,所以在这里做一个消息转发 Result := Form1.WndProc(Hwnd, Msg, wParam, lParam); end; procedure TForm1.FormCreate(Sender: TObject); begin // 获得主窗口句柄,在FMX框架下,Handle已经不是本窗口的句柄了,须要转换一下 FHwnd := FmxHandleToHwnd(Handle); // 保存原始的WindowProc地址 FOldWndProc := GetWindowLongPtr(FHwnd, GWL_WNDPROC); // 获得消息处理惩罚权 SetWindowLongPtr(FHwnd, GWL_WNDPROC, NativeInt(@WindowProc)); end; procedure TForm1.FormDestroy(Sender: TObject); begin // 因为窗口烧毁后无法再处理惩罚Windows传递来的消息,从而会产生内存接见错误 // 所以在窗口烧毁前要把消息处理惩罚权移交给原始的WindowProc SetWindowLongPtr(FHwnd, GWL_WNDPROC, FOldWndProc); end; function TForm1.WndProc(Hwnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; begin Result := 0; // 这里测试处理惩罚鼠标滚轮消息 if Msg = WM_MOUSEWHEEL then begin Memo1.Lines.Add(""亲~!你应用了鼠标滚轮哦~!""); Exit; end; Result := CallWindowProc(Ptr(FOldWndProc), Hwnd, Msg, wParam, lParam); end; end.
首页 1 2 下一页