2011-03-17 67 views
0

今天早些時候,我去了一個我寫的Delphi應用程序中打開一個文件。出於某種原因,與文件網絡的連接關閉 - 原因不重要 - Windows創建了一個對話框,提醒我該問題。然而,我的應用程序的主窗體位於新創建的對話框的頂部(即,我的應用程序,文件打開對話框和警告對話框都有一個窗體)。警告對話框是模態的,並隱藏在主窗體後面。顯然,我有一個問題。爲什麼在主窗體後面顯示一個對話框?

任何想法是怎麼回事,或者我該如何解決這個問題?主窗體的位置屬性設置爲poDesigned,我在關閉/啓動時保存/加載表單的位置,我太多新手甚至不知道哪些信息會幫助您診斷問題。但要清楚的是,問題是而不是文件打開對話框 - 顯示在應該顯示的位置 - 問題在於警告對話框。

感謝一如既往 -

+1

哪個Delphi版本? – 2011-03-18 00:57:55

+1

對話框中的錯誤消息是什麼,以及Windows的版本是什麼? – 2011-03-18 01:18:11

+0

它是Delphi 2006和Win 7.錯誤信息是關於Windows無法連接到網絡的問題。 ...我感謝你和其他人對你的回覆。 – 2011-03-18 16:59:37

回答

2

我不明白爲什麼在Windows中創建您的應用程序的對話框。哪一個API調用導致了這種情況?普通文件操作不顯示UI。

很可能您使用的API函數可以顯示UI,可能來自shell API。任何可以顯示模式對話框的功能都將請求所有者HWND

例如,考慮MessageBox(),您知道的函數將在您的應用程序中顯示一個模式對話框。它的第一個參數被稱爲hWnd並記錄

要創建的句柄 消息框的所有者窗口。如果此 參數爲NULL,則消息框具有 沒有所有者窗口。

Raymond Chen在模態上有一個whole series of articles這解釋了爲什麼設置這個很重要。

我有一個預感,你正在調用一些Win32 API函數,顯示模態的用戶界面,並沒有正確設置所有者HWND。當然,我可能完全錯誤,但沒有更多的信息可以繼續。

2

您可以嘗試打開網絡共享文件前使用SetErrorMode停止此:德爾福的

var 
    OldErrorMode: Integer; 
begin 
    OldErrorMode := SetErrorMode(SEM_NOOPENFILEERRORBOX); 
    try 
    if OpenDialog1.Execute then 
    begin 
     // .... 
    end; 
    finally 
    SetErrorMode(OldErrorMode); 
    end; 
end; 

以後的版本(IIRC,D2007及更高版本)添加TOpenDialog.Execute的重載版本接受一個窗口句柄作爲參數;這會設置TOpenDialog的父窗口並阻止OpenDialog(及其生成的任何錯誤窗口)出現在主窗口後面。

注意:您可以使用Alt + Tab進入背景對話框(從Windows)循環直到應用程序恢復運行;這通常會在窗體頂部顯示隱藏的對話框。

+0

VCL不會爲您設置錯誤模式嗎?我從來沒有明確地調用過'SetErrorMode',所以我只能假設有人正在代我做! – 2011-03-17 23:59:21

+0

@David:不,不AFAIK。這就是我首先了解SetErrorMode的原因。:)而且,正如我所說,Delphi的後續版本在重載的Execute中提供了HWND參數來解決此問題。也許你沒有使用試圖顯示文件夾時出現錯誤的TOpenDialog? – 2011-03-18 00:11:14

+0

@Ken我總是正確設置我的主人'HWND'。這是真正的根本問題。事實上,我認爲你可能會誤導OP,並通過集中SetErrorMode來鼓勵在地毯下發生一定數量的實際問題,如果這確實是觀察到的行爲的原因。 – 2011-03-18 00:14:29

相關問題