delphi cannot make a visible window modal报错的解决过程

发布时间 2023-05-09 10:46:21作者: 一曲轻扬

抛出问题:

 排除过程:

1.在TFrmChangePW窗口的create事件里打断点,结果发现,根本没停顿,所以判断问题不在TFrmChangePW窗体里,而是showmodal这语句里出了问题,点中断,跳到抛出错误的地方:

2.if 里的四个条件,检查了第一个,第二个和第四个都是没问题的,第三个(fsModal in FFormState) 不是很了解,百度了下,发现它是判断当前窗体是否正以模态方式展示,如果是则抛出异常提示无法再次以模态方式展示,避免出现多个模态窗体的情况。

FFormStateTCustomForm 类的一个属性,表示窗体当前的状态,是一个集合类型,包括以下几个元素:

  • 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 的构造函数中,如果窗体继承自其他基类窗体,在构造函数中使用 inheritedinherited Create(AOwner) 是有区别的。 inherited 表示调用父类的默认构造函数,而 inherited Create(AOwner) 表示调用父类的构造函数,并且传入一个参数 AOwner。 如果基类窗体有自己的构造函数,并且需要传入参数进行初始化,那么就需要使用 inherited Create(AOwner) 调用基类构造函数,并且传入相应的参数。如果基类窗体没有自己的构造函数,只有默认构造函数,那么使用 inheritedinherited Create(AOwner) 的效果是一样的。很不巧,我的基类窗体中就是有自己的构造函数,所以出错了