进度条达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
相关产品推荐
相关产品推荐

