2011-09-22 27 views
10

在Delphi XE更新1,我得到的模式窗體如果父(主)窗體的FormStyle設置爲fsStayOnTop看似隨意的行爲。「逗留在上面」的主要形式和模式對話框在Delphi XE

1)隨着MainFormOnTaskbar:= False(舊的方式),一切都「正常」。使用新的MainFormOnTaskbar:= True,當主窗體設置爲「保持在最前」時,模態窗體隱藏在主窗體後面。在大多數情況下,稱爲

modalForm.PopupParent := self; 

就在調用modalForm.ShowModal之前似乎有所幫助。 但並非總是如此。

2)我所有的模態形式很簡單,沒有多餘的裝飾,位於MainFormCenter,不使用形式繼承等而尚PopupParent修復只適用於其中約一半,而另一半仍然可以隱藏主要形式之後。最奇怪的是,在一種情況下,不相關的代碼行的排序會中斷或生成。請參閱此代碼中標記爲(1)和(2)的行:

procedure TEchoMainForm.DBMaintenancePrompt(actions : TMaintenanceActions); 
var 
    frm : TDBMaintenanceForm; 
begin 
    frm := TDBMaintenanceForm.Create(self); 
    try 
    frm.Actions := actions; // (1) 
    frm.PopupParent := self; // (2) 
    frm.ShowModal; 
    finally 
    frm.Free; 
    end; 
end; 

按此順序執行時,模式窗體將在主窗體頂部正確顯示。 但是,當我反轉線條時,模態形式隱藏在主體後面。標記爲(1)的行設置了模態窗體的屬性,這會導致在TRzCheckGroup中未選中時檢查多個複選框,該TRzCheckGroup坐在TRzPageControl(來自Raize組件)上。這是一個運行時線(1)上述執行setter方法:

procedure TDBMaintenanceForm.SetActions(const Value: TMaintenanceActions); 
var 
    ma : TMaintenanceAction; 
begin 
    for ma := low(ma) to high(ma) do 
    cgMaintActions.ItemChecked[ ord(ma)] := (ma in Value); 
    end; 
end; 

這是足夠的模態形式的主要形式後面顯示,如果該行的順序(1)和(2)是逆轉。

這可能指向TRzCheckGroup(在setter代碼運行時被操作),但我有兩個其他表單顯示相同的問題並且不使用TRzCheckGroup(或TRzPageControl)。我無法使用Raize組件單獨示例應用程序重現此問題。在setter期間禁用表單,頁面控件或TRzCheckGroup不起作用。

它似乎不是一個計時問題,因爲當模態窗體顯示隱藏一次,它總是這樣。行爲的改變只來自重新編排代碼行。

3)最後一個觀察:我的模態形式非常簡單,所以它們顯示得非常快,沒有明顯的延遲。但是當主要形式是fsStayOnTop時,那麼我經常可以看到它上面的模態表單顯示,然後看到它被推到後面。然後,在擊中Esc時,(不可見)模態窗體在主窗體頂部顯示幾分之一秒,然後關閉。

要麼我錯過了事後看起來很明顯的東西,要麼是心靈調試的呼喚,我不知道。有什麼想法嗎?


UPDATE。我試圖在發生的另一種形式上追蹤問題。它有幾個按鈕(Raize)和一個TSyntaxMemo(來自eControl.ru的增強型備忘錄組件)。這種形式與其他遇到問題的形式幾乎沒有任何共同之處。刪除部分代碼並進行測試後,我現在可以通過在爲備忘錄組件分配字符串的方法中進行細微更改來重現此問題:

這是我的原始代碼,它使包含編輯器的表單隱藏的主要形式背後:

procedure TEditorForm.SetAsText(const Value: string); 
begin 
    Editor.Text := Value; 
end; 

當我改變分配給一個空字符串,形式正確顯示:

procedure TEditorForm.SetAsText(const Value: string); 
begin 
    Editor.Text := ''; // CRAZY! Problem goes away 
end; 

當我指定一個字符到編輯器,表單再次開始隱藏:

procedure TEditorForm.SetAsText(const Value: string); 
begin 
    Editor.Text := 'a'; // Problem is back 
end; 

當然,其他兩個有問題的表單不使用此編輯器組件或其任何單元。

我試過刪除備忘錄控制並再次添加它(認爲創建命令等),但它沒有效果。如果我在代碼中創建備忘錄,則相同。只要將非空字符串分配給備忘錄的Text屬性,該表單就會隱藏起來。

+0

我有點困惑。你說它可以按照它們所在的順序使用數字行,但是那裏的代碼引用'Self'而不是對象實例的方法。發佈的代碼不會編譯,更不用說工作,不管線的順序如何。當你不發佈實際代碼時,很難解釋代碼異常。 :) –

+0

@Ken:現在修好了,謝謝。代碼是主窗體的一種方法,所以自引用是有效的。這是逐字代碼。我在SetActions中稍微簡化了代碼,但是在這裏編寫它編譯*和*仍然導致「隱藏」問題。 –

+0

@moodforaday:你有什麼模式窗體的'PopupMode'屬性設置爲?你有什麼'TApplication.ModalPopupMode'屬性設置爲? –

回答

-1

Windows不支持許多最頂級的應用程序形式。默認情況下,模態形式是最重要的。但你有自己的形式這種風格。

記住一個決定:刪除最主要的窗體(無可見效果),調用模態窗體,在模態完成時設置最頂層樣式。

0

前段時間我有同樣的問題。我的解決方案是將Self.BringToFront;添加到模態窗體的OnShow事件中。

相關問題