You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检查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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 12:42:31