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

进度条达100%时自动切换Form1与Form2的实现及报错解决

解决方法

你遇到的挂起和无限循环,核心原因是进度条到100%时未先停止Timer,或是关闭Form1与显示Form2的顺序逻辑错误,导致事件反复触发引发异常。

正确的Timer事件代码示例(Delphi)

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  // 进度条增长逻辑
  if ProgressBar1.Position < 100 then
    ProgressBar1.Position := ProgressBar1.Position + 1
  else
  begin
    // 第一步:立即停止Timer,防止事件重复触发
    Timer1.Enabled := False;
    
    // 第二步:先显示Form2(ShowModal会阻塞当前线程,确保Form2正常加载)
    Form2.ShowModal;
    
    // 第三步:关闭当前Form1
    Self.Close;
  end;
end;

关键注意事项

  • 必须优先停止Timer:若不关闭Timer,它会持续触发Timer事件,即使进度条已到100%,代码会反复执行显示Form2和关闭Form1的逻辑,直接引发无限循环或程序挂起。
  • 调整窗口操作顺序:如果先关闭Form1再显示Form2,可能因主窗口关闭导致程序消息循环异常;先调用ShowModal让Form2接管消息循环,再关闭Form1能避免这类问题。

动态创建Form2的补充代码

如果Form2不是设计时创建的,需手动创建并释放:

procedure TForm1.Timer1Timer(Sender: TObject);
var
  TempForm2: TForm2;
begin
  if ProgressBar1.Position < 100 then
    ProgressBar1.Position := ProgressBar1.Position + 1
  else
  begin
    Timer1.Enabled := False;
    try
      TempForm2 := TForm2.Create(nil);
      TempForm2.ShowModal;
    finally
      TempForm2.Free;
    end;
    Self.Close;
  end;
end;

内容的提问来源于stack exchange,提问作者X12

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 08:27:06