首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Delphi ShowMessage 被最小化視窗縮圖遮蓋:手動建立主視窗釋放登入視窗解決 Z-Order 問題

     編輯:程式設計綜合問答

問題現象

  • 登入視窗 (主視窗) 成功後,建立主介面視窗。
  • 主介面最小化 → 還原最大化後,ShowMessage 對話框被登入視窗的工作列縮圖遮蓋。
  • 僅發生於「最小化後還原」情境。

根本原因

Delphi 專案預設 Application.CreateForm(TLoginForm, LoginForm) 將登入視窗設為 MainForm。主介面視窗為次要表單,其 Owner 為 Application。當主介面最小化還原時,Z-Order 計算受 MainForm (登入視窗) 影響,導致模態對話框層級異常。

解決方案:手動控制視窗生命週期

// .dpr 專案原始檔
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  
  // 1. 手動建立並顯示登入視窗 (非 MainForm)
  LoginForm := TLoginForm.Create(nil);
  try
    if LoginForm.ShowModal = mrOk then
    begin
      // 2. 登入成功:釋放登入視窗,切換 MainForm
      LoginForm.Free;
      LoginForm := nil;
      
      // 3. 建立真正的主介面視窗
      Application.CreateForm(TMainForm, MainForm);
      Application.Run;
    end
    else
      Application.Terminate;
  except
    LoginForm.Free;
    raise;
  end;
end.

關鍵點解析

  1. 登入視窗非 MainForm:以 ShowModal 獨立運行,不佔用 Application.MainForm。
  2. 登入成功即 Free:徹底釋放資源,斷開 Z-Order 關聯。
  3. 主介面才是真正 MainForm:Application.CreateForm 設為主視窗,擁有正確的任務列按鈕與 Z-Order 權限。

替代方案 (不修改 .dpr)

  • 登入視窗隱藏而非關閉:LoginForm.Hide,主介面 Show。但登入視窗仍佔用 MainForm,Z-Order 問題可能殘留。
  • 對話框父視窗指定:ShowMessage('訊息', MainForm.Handle) (需自訂封裝),強制綁定父視窗句柄。

核心原則:真正的主視窗應為應用程式核心介面,登入/啟動畫面僅為臨時模態對話框,不應佔據 MainForm 身分。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved