在程式中我有四个窗体分别是:
frmBase所有窗体的基类         Type  为 T frmBase = class(TForm)
frmInfoBase资料维护基类       type  为 TfrmInfoBase = class(TfrmBase)
frmBaseInfoBase窗体           type  为 TfrmBaseInfoBase= class(TfrmInfoBase)
frmBaseSheetType实际操作窗体  type  为 TfrmBaseSheetType = class(TfrmBaseInfoBase)
后三个窗体中我都有设置工具条ToolBar,且命名相同,在frmInfoBase窗体中我对ToolBar中的每一个按钮都编写了代码,带上关键字inherited如下:
procedure TfrmInfoBase.acSaveExecute(Sender: TObject);
begin
  inherited;
if QBaseInfo.State in [dsInsert,dsEdit] then
   QBaseInfo.Post ;
end;
在frmBaseInfoBase和frmBaseSheetType中没有再对ToolBar中的按钮写程式,现在问题是:
一:当我运行frmBaseSheetType窗体时,提示为有相同的按钮名字,根据提示我将三个窗体中凡是有相同的Name的控件和ToolBar中相当按钮,分别更改为不同Name,
二:在frmBaseSheetType显示时,上面同时出现三个窗体中的工具条按钮,而只有第一个frmInfoBase工具条中的按钮可用,其下面两个frmBaseInfoBase和frmBaseSheetType工具条都呈灰色,
三:虽然第一个工具条可用,但只要一点击,便死机,
问题点:
一:从运行程式时的提示,显然它们是互相继承了,按道理在不同的窗体form中,可有相同的按钮和控件命名,而运行时却提示不能运行,一定要改成不同名字才能通过,
二:在程式运行中,显示时能显示三个工具条,这说明它已经断承了前两个的工具条
三:即然已断承,可点击运行按钮,却死机。
以上几点本人实在猜不透,是我程式写错,还是要在frmBaseInfoBase和frmBaseSheetType中加上别的代码,请高手指点,谢谢!

解决方案 »

  1.   

    别猜了,看你还是新手,还是先别弄窗体继承这个比较复杂的问题吧。据说这个问题Delphi解决得不是很好。
      

  2.   

    楼主:你对继承的概念还不是很清楚,所以我建议你现阶段不要设计继承的窗体。每个窗体单独设计。日后你精通了OOP再做不迟。多做几个窗体也不是很费事的:-)
      

  3.   

    根据提示我将三个窗体中凡是有相同的Name的控件和ToolBar中相当按钮,分别更改为不同Name????
    继承下来的控件是不允许该名字的吧!
      

  4.   

    所以说:你的窗体继承方法有问题?
    你是怎么继承窗体的!
    =============================
    撇开问题不谈:给你些建议。
    delphi的窗体继承虽好,但不能滥用。
    继承的层次不要太深,不然问题出会更多!
    =============================
    我现在的做法是:只做一个blankform,里面什么控件都没有,但在public中有些属性,方法什么的。
    以供从它继承的窗体调用。
      

  5.   

    g961681(技术庸人(要转DOTNET了)):其实我也在看刘艺的“面向对象编程思路”对断承也不是完全没有概念,况且我手上有一个现在的断承案例,运行很成功,我现在是按它的思路和代码重新写一次,但却运行不了,对源代码我仔细看过也没发现有什么不对,四个窗体中frmBase中,没有放任何控件,在Public中有一个Constructor,在frmInfoBase窗体中有一个TToolBar name为ToolBar,一个TwwLookUpDialog:wwLookUpDig, 一个TADOQuery1:QBaseInfo,TADOQuery2:QISUnipue,一个TDataSource:dsBaseInfo,一个TActiveList:ALToolBar,在TToolBar是有11个TToolButton分别命名为tbtNew,tbtModify等,在frmBaseInfoBase和frmBaseSheetType中也有跟frmInfoBase完全一样的控件和同样的命名,但运行时却提示有错,所以我只好将控件名及其它相同的名字改过来,如ToolBar改为ToolBar_1,ToolBar_2,QBaseInfo改为QBaseInfo_1,QBaseInfo_2等,
    至于: lyre(大头鬼)说:每个窗体单独设计,这个方法虽然可行但却还是停留在面向过程编程的档次,我想借我手中一个案例来提高一下我对DELPHI的认识,况且DELPHI编程也接触将近一年了,遗憾的是还是有面向过程编程的思路,所以想借此论坛,恳请各位高手帮我充一下电,谢谢!
      

  6.   

    刘艺的<<面向对象编程思想>>书面上写的很清楚,让你从RAD快手成为oop高手,但不是要完全放弃RAD二者的结合才能发挥出Delphi更大的威力.本人觉得继承对窗体来说不太适合.到是可以考虑将控件进行封装.这样的话应该可以发挥二者的优势.
      

  7.   

    Mrkang(谁比我菜我不愿意):我手上这个窗体断承的案例,别人写得很成功,可一到我照抄时就出错,我很欣赏他的这种风格,只在一个窗体写代码,其余窗体只作一些连接定义很快就可以搞定,根本不要每个窗体都去写同样的代码。
      

  8.   

    g961681(技术庸人(要转DOTNET了)):這問題快半個月還沒有解決,你能給我一個例子嗎,一簡單的例子就行,但要有命令按鈕,並能繼承其指令,如果分不夠,我可另外開帖加給你,謝謝!
      

  9.   

    新建一个工程,为P1,这个工程有一个主窗体MAIN,在主菜单单击NEW-other-p1,你会看见主窗体MAIN,单击OK,就建立了一个继承窗体。
      

  10.   

    youcheng1(晓松):你可能把我的問題理解錯了