抛出问题:
排除过程:
1.在TFrmChangePW窗口的create事件里打断点,结果发现,根本没停顿,所以判断问题不在TFrmChangePW窗体里,而是showmodal这语句里出了问题,点中断,跳到抛出错误的地方:
2.if 里的四个条件,检查了第一个,第二个和第四个都是没问题的,第三个(fsModal in FFormState)
不是很了解,百度了下,发现它是判断当前窗体是否正以模态方式展示,如果是则抛出异常提示无法再次以模态方式展示,避免出现多个模态窗体的情况。
FFormState
是 TCustomForm
类的一个属性,表示窗体当前的状态,是一个集合类型,包括以下几个元素:
fsCreating
:窗体正在创建中。fsShowing
:窗体正在展示中。fsModal
:窗体正在以模态方式展示。fsActivated
:窗体已经被激活。
3.结合出错提示,怀疑是三个条件的问题,于是在frm.showModal之前判断一下 fsmodal in frm.FormState,结果返回flase...这就很尴尬了...四个条件都没满足抛错条件,为什么会出错呢?
4.检查到 Frm: TFrmChangePW 这个窗体是继承自 TFrmChangePW = class(TFrmGPBase) ,再看看自己的构造函数:
constructor TFrmChangePW.Create(AOwner: TComponent); begin inherited; FChangeHeadImage := false; FErrTime := 0; end;
好像明白了点什么!把 inherited; 改成 inherited Create(AOwner); 问题解决了....
在 Delphi 的构造函数中,如果窗体继承自其他基类窗体,在构造函数中使用 inherited
和 inherited Create(AOwner)
是有区别的。 inherited
表示调用父类的默认构造函数,而 inherited Create(AOwner)
表示调用父类的构造函数,并且传入一个参数 AOwner
。 如果基类窗体有自己的构造函数,并且需要传入参数进行初始化,那么就需要使用 inherited Create(AOwner)
调用基类构造函数,并且传入相应的参数。如果基类窗体没有自己的构造函数,只有默认构造函数,那么使用 inherited
和 inherited Create(AOwner)
的效果是一样的。很不巧,我的基类窗体中就是有自己的构造函数,所以出错了
标签:delphi,基类,AOwner,visible,窗体,inherited,报错,Create,构造函数 From: https://www.cnblogs.com/yoooos/p/17381452.html