2013-01-03 52 views
1

有人可以幫我這個:德爾福XE3形式打開和關閉

我有形式1和形式2

in form1 1 :use form2. 
in form1 put a button with code Form2.Showmodal; 
form2 is made invisible 
form2 has one button: 
  • form2.close =作品,但不會關閉只是隱藏的形式。 -form2.free - 訪問衝突或關閉,form1被凍結(taskmngr將其殺死)
  • Form2。釋放 - acccess viololation或關閉..如果我單擊form1上的打開按鈕以重新打開表單,它會導致訪問衝突..
  • Form2.close + onClose action:= cafree; - 訪問衝突..
  • Form2.closemodal - 已經被示爲從Form1的模式沒有影響..

我該怎麼處理和再利用窗口2?

感謝一堆..它必須是簡單的我可以俯瞰。

小號

+0

沒有看到'Form2'(和'Form1')有什麼樣的代碼,很難理解這個問題可能是什麼。 –

回答

2

首先,從自動創建刪除表2。

Project > Options > Forms 
Remove Form 2 from "Auto-create forms" 

這確保不會自動創建此表單。

當您創建它的一個實例時,請不要通過它的名稱引用它(如Form2)。相反,創建一個臨時變量。如果你想顯示其在模態,做這樣的事情:

procedure Button1Click(Sender: TObject); 
var 
    F: TForm2; 
begin 
    F:= TForm2.Create(nil); 
    try 
    F.ShowModal; 
    finally 
    F.Free; 
    end; 
end; 

不要你可以給它的任何名稱是指您的形式,如Form2。如果您將其作爲另一個變量進行實例化(如上所示)(F),然後確保您對其進行的所有調用都是通過此變量進行的。其實,只要你從自動創建的形式消除這種形式,可以徹底刪除聲明這種形式:

var 
    Form2: TForm2; 

如果你希望它在非模式狀態顯示,而主表格仍然可以訪問,但必須完全不同。讓我知道如果這是你需要的,我會調整我的答案。

+0

好吧我把上面的代碼在form1中的按鈕打開form2..in form2按鈕我把Form2.close;這再次違反了訪問規則...... – Sardukar

+0

不要致電關閉,上面的代碼是您需要以模態狀態顯示窗體的全部內容。 –

+0

o好吧我只是使用borderIcon得到它,但可以用Tbutton完成嗎? – Sardukar

3

form2.close =工作但不關閉只是隱藏窗體。

是的,它確實關閉了窗體。這就是封閉表單的默認行爲 - 隱藏自己。如果是模式表單,則Close()僅將表單的ModalResult設置爲非零值,這會導致ShowModal()退出並關閉/隱藏表單。

form2.free - 無論是訪問衝突或關閉,在Form1被凍結(taskmngr殺吧)

它是不安全的Free()形式從屬於同一個事件處理程序的內部形成。在事件處理程序退出後,VCL仍然需要訪問表單對象。要安全地釋放表單,您必須使用Release(),這表示在表單安全的情況下,稍後自動釋放表單。

Form2。發佈 - acccess viololation或closes..if我則單擊打開按鈕在Form1上重新打開它給訪問衝突的形式..

的唯一途徑Release()可能導致AV是,如果你使用的是無效的形式調用它指針。如果重新打開表單導致AV,那麼你的代碼中有一些嚴重的錯誤。

Form2.close + onClose action:= cafree; - 訪問衝突..

caFree導致窗體自己調用Release()。往上看。

Form2.closemodal - 沒有效果..

你不應該直接調用CloseModal()。改用Close()或設置ModalResult