我在数据库创建了窗体数组,创建了动态mainmenu,然后根据动态mainmenu的item得到窗体名,并且打开窗体,窗体采用的继承的方式,我有这样的想法,如果子窗体和父窗子的控件都是一样的,那如果我只要全部继承,然后在数据库中存入各窗体常用的sql,然后打开时调用就可以了!但是多表查询显示并且要表头显示中文的sql语句写会非常复杂,而且速度会不会非常慢,或都还有其它的不好的地方,如果可以,多做几个基类窗体,如果再能动态创建窗体并且指定要继承的基类窗体,那这样的话不是可以做小型的开发平台了
调试欢乐多
有点明白了,如图所示,我的软件中大约有50%的界面是这样的,所以我打算把主表(员工信息)做成一个基类窗体,顶部菜单的所有功能都继承,onshow时的sql语名直接根据窗体名在数据库中打到相应的sql语名并执行,tree的点击事件也做成一个sql语名存入数据库,查询就没有必要了,在每个窗体中单独设置,在明细表中只将顶部菜单继承,下面的控件全部采用感应控件,保存时只要ADOQuery1.UpdateBatch就可以了,当然要设置好主键和唯一键,高手们觉得我的想法是否合理呀
不如封成组件
或者放在一个Frame里
我也觉得你说的很有道理,这样的话也不需要做继承了吧!!每次都要用递归写treeview很麻烦!
cname:= adoquery6.FieldByName('formhint').AsString;(mainmenu创建时打开的窗体)
dname:=adoquery6.FieldByName('formaddnew').AsString;(打开的窗体增加或修改时再打开的明细窗体)
fcType:= TFormClass(FindClass(cname));
application.CreateForm(fctype,fname);
fname.Showmodal;
并且注册了窗体,一切非常完美,因为这样的话顶部菜单的操作基本上都可以在基类中写代码完成,接口我也写的不错,功能也全部实现了,本来以为万事大吉,沾沾自喜,但后来发现权限出现了问题,比如要打开的窗体为frm_bmbm,打开后根据frm_bmbm的hint属性发送到frm_main(公共单元)来查找各按钮的权限,但是值返回时发现他们无法找到动态创建的frm_bmbm的各按钮,比如frm_bmbm.baddnew.enable=false不起作用发现是动态创建的问题,那怎么办呀,如果不动态创建的话做基类窗体意义不大了
1.将各模块类似操作提取,抽象化,供主程序调用。如创建,保存,打开,初始化,刷新等功能都可以抽象出来,所有主程序与各模块的交互就使用抽象接口/函数;子模块完成抽象的具体实现,不关心与主程序的交互过程,代码量少,可以多人同时进行设计,风格容易控制。
2.抽象具体使用什么方式,看个人的经验,delphi也有些bug,个人掌握的知识面也不同,技术上可实现就行。个人认为用接口或继承都可以,如果使用可视化继承,第一层建议不要有添加任何控件,最下层添加各模块的具体控件,如有必要,可以加中间层。总之,不管什么技术,自己熟练掌握就行,能达到要求,方便调试,做到心里有数。
要一勞逸地解決這個問題的話,該交由權限系統去設計,而不要試圖在界面中解決,在界面中解決權限問題是很難得到合理的方案,只可以獲得一個臨時的可用方案。靈活的權限系統可以方便地整理獲取各Form中的權限需求,從而讓用戶設定。關於模塊的抽象關鍵是抓住對象的本質,即是你准備抽象出一個類時,你必須清楚這個類是要完成什麼任務,它需要干什麼,然後設計它要怎麼干。如果只是想實現相同代碼抽取,建議多使用函數庫的方式,而不是使用類層次的方式來實現。使用類層次的方式時,請考慮抽取對象的本質。
楼上两位说的很有道理,如果不用顶部的菜单,这个单元权限都无法控制,在基类窗体中有的控件才能控制,的确遇到了(如果你某个窗口不需要顶上那些按钮或左边边的tree 你怎么办? ),我现在又创建了几个基类,就是没有tree或者顶部菜单的,先试试吧,想了很久,不甘心放弃,动态创建了mainmenu,动态创建了窗体,我不甘心放弃,决定继续做下去,想想将来维护应该方便些,这个框架应该还不错的,将来说不定有可能做成一个小型开发平台,指定新窗体继承哪个基类窗体,所有操作语句在数据库中完成,但是注册窗体无法在数据库中实现,有待解决,不知道api有没有办法!!