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

Delphi中关闭主窗体Form2后保持Form1运行的实现方法

解决Delphi主窗体关闭后新窗体持续运行的问题

Delphi默认会在主窗体关闭时终止整个应用程序,所以直接关闭作为启动主窗体的Form2会导致刚打开的Form1也被关闭。要实现验证通过后关闭Form2且Form1正常运行,核心是把Form1设为新的主窗体,再关闭原主窗体。

具体实现代码

修改你原有的Button1Click事件处理代码,补充主窗体切换逻辑:

procedure TForm2.Button1Click(Sender: TObject);
var
  narozeni, dnes: TDateTime;
  vek: Real;
  mesic, den, rok: Integer; // 补充变量声明,避免编译错误
begin
  den := StrToInt(ComboBoxDen.Text);
  if ComboBoxMesic.Text = 'leden' then mesic := 1
  else if ComboBoxMesic.Text = 'únor' then mesic := 2
  else if ComboBoxMesic.Text = 'březen' then mesic := 3
  else if ComboBoxMesic.Text = 'duben' then mesic := 4
  else if ComboBoxMesic.Text = 'květen' then mesic := 5
  else if ComboBoxMesic.Text = 'červen' then mesic := 6
  else if ComboBoxMesic.Text = 'červenec' then mesic := 7
  else if ComboBoxMesic.Text = 'srpen' then mesic := 8
  else if ComboBoxMesic.Text = 'září' then mesic := 9
  else if ComboBoxMesic.Text = 'říjen' then mesic := 10
  else if ComboBoxMesic.Text = 'listopad' then mesic := 11
  else if ComboBoxMesic.Text = 'prosinec' then mesic := 12;
  rok := StrToInt(ComboBoxRok.Text);

  narozeni := EncodeDate(rok, mesic, den);
  dnes := Date();
  vek := (dnes - narozeni) / 365.25;
  
  if vek < 18 then begin
    ShowMessage('Pro hraní hazardních her Vám musí být více než 18 let!');
    Application.MainForm.Close;
  end
  else begin
    // 确保Form1已实例化(若未开启自动创建)
    if not Assigned(Form1) then
      Form1 := TForm1.Create(Application);
    Form1.Show;
    // 将Form1设置为应用新的主窗体
    Application.MainForm := Form1;
    // 关闭原主窗体Form2
    Self.Close;
  end;
end;

原理说明

  • Application.MainForm是Delphi应用的核心窗体,默认关闭它会触发Application.Terminate,终止整个程序
  • 通过将Form1赋值给Application.MainForm,让应用将Form1视为新的主窗体,此时关闭原主窗体Form2不会触发程序终止
  • 提前检查Form1是否已创建,避免重复实例化导致的异常

补充优化建议

  • 月份判断可以改用数组映射,减少冗长的if-else分支,比如:
    var
      MonthNames: array[1..12] of string = ('leden', 'únor', 'březen', 'duben', 'květen', 'červen', 'červenec', 'srpen', 'září', 'říjen', 'listopad', 'prosinec');
    begin
      for mesic := 1 to 12 do
        if ComboBoxMesic.Text = MonthNames[mesic] then
          Break;
    end;
    
  • 年龄计算可以用YearsBetween函数(需引用DateUtils单元),更准确:vek := YearsBetween(dnes, narozeni);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 14:43:17