我在数据库创建了窗体数组,创建了动态mainmenu,然后根据动态mainmenu的item得到窗体名,并且打开窗体,窗体采用的继承的方式,我有这样的想法,如果子窗体和父窗子的控件都是一样的,那如果我只要全部继承,然后在数据库中存入各窗体常用的sql,然后打开时调用就可以了!但是多表查询显示并且要表头显示中文的sql语句写会非常复杂,而且速度会不会非常慢,或都还有其它的不好的地方,如果可以,多做几个基类窗体,如果再能动态创建窗体并且指定要继承的基类窗体,那这样的话不是可以做小型的开发平台了

解决方案 »

  1.   

    什么意思呀,你必得有必要吗,如果5个表左右要显示的话那代码会比较长,数据量一大,又要从数据库里读取sql,这样会非常慢吧,不知道有没有这方面尝试过的谈一下自己的想法
      

  2.   


    有点明白了,如图所示,我的软件中大约有50%的界面是这样的,所以我打算把主表(员工信息)做成一个基类窗体,顶部菜单的所有功能都继承,onshow时的sql语名直接根据窗体名在数据库中打到相应的sql语名并执行,tree的点击事件也做成一个sql语名存入数据库,查询就没有必要了,在每个窗体中单独设置,在明细表中只将顶部菜单继承,下面的控件全部采用感应控件,保存时只要ADOQuery1.UpdateBatch就可以了,当然要设置好主键和唯一键,高手们觉得我的想法是否合理呀
      

  3.   

    你只是需要每个窗口顶上都有那几个按钮而已
    不如封成组件
    或者放在一个Frame里
      

  4.   


    我也觉得你说的很有道理,这样的话也不需要做继承了吧!!每次都要用递归写treeview很麻烦!
      

  5.   

    说的非常有道理,得到写好接口程序,我动态创建了mainmenu,根据mainmenu的item创建了窗体,
    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不起作用发现是动态创建的问题,那怎么办呀,如果不动态创建的话做基类窗体意义不大了
      

  6.   

    个人实践:
    1.将各模块类似操作提取,抽象化,供主程序调用。如创建,保存,打开,初始化,刷新等功能都可以抽象出来,所有主程序与各模块的交互就使用抽象接口/函数;子模块完成抽象的具体实现,不关心与主程序的交互过程,代码量少,可以多人同时进行设计,风格容易控制。
    2.抽象具体使用什么方式,看个人的经验,delphi也有些bug,个人掌握的知识面也不同,技术上可实现就行。个人认为用接口或继承都可以,如果使用可视化继承,第一层建议不要有添加任何控件,最下层添加各模块的具体控件,如有必要,可以加中间层。总之,不管什么技术,自己熟练掌握就行,能达到要求,方便调试,做到心里有数。
      

  7.   

    關於權限在設計上,Form 的界面設計與權限分開,即設計FORM時只考慮用戶界面的需求。這樣就不可避免地出現每個Form上的權限類型事實上是不一樣的。只有增刪改打印...等固定有限權限是不能體現權限上的細微之處的。
    要一勞逸地解決這個問題的話,該交由權限系統去設計,而不要試圖在界面中解決,在界面中解決權限問題是很難得到合理的方案,只可以獲得一個臨時的可用方案。靈活的權限系統可以方便地整理獲取各Form中的權限需求,從而讓用戶設定。關於模塊的抽象關鍵是抓住對象的本質,即是你准備抽象出一個類時,你必須清楚這個類是要完成什麼任務,它需要干什麼,然後設計它要怎麼干。如果只是想實現相同代碼抽取,建議多使用函數庫的方式,而不是使用類層次的方式來實現。使用類層次的方式時,請考慮抽取對象的本質。
      

  8.   

    谢谢高手的指点,现在权限完成了,我原来的设计思想是在form onshow时frm_main.ModuleIfTrue(Data1.ADOQuery8,Frm_ygxill);传值给frm_main,frm_main得到这个窗体的所有组件,每个组件的hint值作为一个控件点存入数据库,控件该组件的enable属性,这样比较灵活多变,并且就象楼上所说的只有增刪改打印...等固定有限權限是不能體現權限上的細微之處的,是的其实软件最好有些个性化,要比较方便的让客户操作,比如打开销售单时会有个收款过程,打开收款过程然后----,由于做了继承,不知道为什么传值比较返回,现在我只能来控件基类窗体的按钮状态了,现在权限也实现了,一套还认为不错的框架完成了,动态mainmenu打基类窗体,基类窗体顶部所有的按钮操作都在基类窗体中完成,子类中的代码相对较少,将来维护比较方便,谢谢各位的指导!!
      

  9.   

    呵呵  这种情况 用组合比用继承更灵活 继承的局限性是明显如果你某个窗口不需要顶上那些按钮或左边边的tree 你怎么办?楼主可以去看看策略模式 有帮助
      

  10.   


    楼上两位说的很有道理,如果不用顶部的菜单,这个单元权限都无法控制,在基类窗体中有的控件才能控制,的确遇到了(如果你某个窗口不需要顶上那些按钮或左边边的tree 你怎么办? ),我现在又创建了几个基类,就是没有tree或者顶部菜单的,先试试吧,想了很久,不甘心放弃,动态创建了mainmenu,动态创建了窗体,我不甘心放弃,决定继续做下去,想想将来维护应该方便些,这个框架应该还不错的,将来说不定有可能做成一个小型开发平台,指定新窗体继承哪个基类窗体,所有操作语句在数据库中完成,但是注册窗体无法在数据库中实现,有待解决,不知道api有没有办法!!