2011-06-06 84 views
2

告訴我,這裏是一個問題:簡單的代碼和錯誤發生在窗體關閉

第一種形式:

procedure TForm2.N6Click(Sender: TObject); 
var About:TAbout; 
begin 
About:=TAbout.Create(Application); 
try 
    About.ShowModal; 
finally 
    About.Free; 
end; 
end; 

第二形態:

procedure TAbout.Button1Click(Sender: TObject); 
begin 
About.Close; 
end; 

上About.Close我有錯誤:EAccessViolation。我沒有做任何其他形式關於,約的代碼是空的,只需按下按鈕。

+0

如果我在右下角(接近)單擊X - 一切都OK! – Michael 2011-06-06 22:03:12

回答

7

當您在TForm2.N6Click方法中聲明About變量時,不使用全局關於全局變量。

但是在About表單中,當您嘗試在About變量上調用Close變量時,可以使用全局變量,在本例中該變量保持未初始化狀態。

嘗試刪除本地About聲明,它應該工作。

+0

Doug,thans !!!作品!!! – Michael 2011-06-06 22:16:21

+5

是的,Doug找到了錯誤的原因。是的,建議的解決方案工作,但它並不是真的。通過在本地程序中使用全局變量創建和釋放一個'TAbout'對象,您正在拍攝自己的腳。看到我的答案。 – 2011-06-06 22:22:43

11

雖然道格是正確的,最簡單的辦法是隻做出改變

procedure TAbout.Button1Click(Sender: TObject); 
begin 
    Close; 
end; 

這無論如何是過程的「正確」的版本。如果您單擊當前TAbout表單(即Self)的Button1,則當然希望關閉當前的TAbout表單(即Self)。 Close是類中的Self.Close的縮寫。

TAbout的一種形式。您可以創建此類的任何數量的實例,所謂的對象。通常在您的項目中有一個全局變量About,並且在您的應用程序啓動時自動創建此對象。爲了證明這一點,你只需要做

procedure TForm2.N6Click(Sender: TObject); 
begin 
    About.ShowModal; 
end; 

另一種方法,是禁用的自動創建About形式(項目/選項),然後創建一個新的實例每次你需要一個時間。然後,你做

procedure TForm2.N6Click(Sender: TObject); 
var About:TAbout; 
begin 
    About := TAbout.Create(nil); 
    try 
    About.ShowModal; 
    finally 
    About.Free; 
    end; 
end; 

任何情況下,你想

procedure TAbout.Button1Click(Sender: TObject); 
begin 
    Close; // same thing as Self.Close; 
end; 
+0

道格不是麪糰。麪糰是你製作麪包的來源。 – 2011-06-06 22:41:53