如何检查Delphi窗体是否已存在?实现单实例窗体创建
解决Delphi按窗体名创建单实例窗体的问题
要实现每种窗体仅保留一个实例,核心思路是创建前先检查该类的窗体是否已存在,如果存在就直接激活,不存在再创建。修改后的代码如下:
Procedure TMainForm.CreateFormFromName(const FormName: String); var fc: TFormClass; f: TForm; i: Integer; begin fc := TFormClass(FindClass(FormName)); // 遍历已有的窗体实例,查找目标类的窗体 for i := 0 to Application.Forms.Count - 1 do begin if Application.Forms[i].ClassType = fc then begin f := Application.Forms[i]; // 恢复最小化的窗体状态 if f.WindowState = wsMinimized then f.WindowState := wsNormal; // 激活窗体并置于前端 f.BringToFront; f.SetFocus; Exit; // 找到实例,直接退出,不再创建新窗体 end; end; // 未找到实例,创建新窗体 f := fc.Create(Application); f.Show; end; Procedure TMainForm.FormCreate(Sender: TObject); begin RegisterClass(TfrmTest); end;
关键说明:
- 遍历
Application.Forms集合检查已存在的窗体,通过ClassType匹配目标窗体类,确保判断准确 - 找到实例后,先恢复最小化的窗体,再通过
BringToFront和SetFocus让窗体回到用户视野 - 必须确保目标窗体类已通过
RegisterClass注册,否则FindClass会触发类未找到的异常
内容的提问来源于stack exchange,提问作者Seti Net
相关产品推荐
相关产品推荐

