2014-01-15 23 views
0

我有一個主窗體,使用下面的代碼來創建一個子窗體,當一個按鈕被點擊。要創建的表單(frmNewMember)已從自動創建表單列表中刪除。德爾福 - AV錯誤時使用第二種形式

procedure TfrmMain.btnAddMemberClick(Sender: TObject); 
var 
    NewMemberForm: TForm; 
begin 
    NewMemberForm := TfrmNewMember.Create(Application); 
    try 
    NewMemberForm.ShowModal; 
    finally 
    NewMemberForm.Free; 
    end; 
end; 

AV在我嘗試在表單內創建的過程中嘗試使用組件時出現。例如:

procedure DoSomething; 
begin 
    frmNewMember.edtPostcode.Text := 'TEST'; 
end; 

這會產生一個讀取錯誤爲000003BC的AV。這是否發生,因爲我試圖訪問不存在的frmNewMember的實例?我確信這有一個簡單的答案,但我已經遍佈整個地方搜索,似乎無法擺脫AV錯誤。

+2

是的,正是因爲如此。你(幾乎可以肯定)訪問自動聲明的全局表單變量,它指的是nil(該表單不是自動創建的)。更好地從你的'DoSomething'過程向該表單類發展方法。 – TLama

+0

@TLama感謝您的回覆。我如何參考我從主窗體創建的窗體?我需要將NewMemberForm變量傳遞給我的子表單嗎? – Babah254

+0

@PeterVonča我現在明白了。謝謝你的幫助。事情很簡單,但我不明白它背後的邏輯。 'frmNewMember'取代了NewMemberForm,一切正常。 – Babah254

回答

0

這是你的問題:

frmNewMember 

這是全局變量,Delphi的IDE(UN)有益宣佈你。你從來沒有分配過它,所以它仍然是零。因此訪問衝突。

您已停止使用自動創建,這是正確的做法。下一步是清除這些無用全局變量的代碼。一旦你這樣做了,你不能再犯這個錯誤。

您仍然需要獲取該函數的表單引用。但是現在,您可以將其作爲參數傳遞給它。或者使函數成爲表單的一種方法。這也讓你的代碼更好,所以你一直在贏。

我覺得這個問題是因爲的詛咒VB。全局表單變量被添加來允許Delphi模仿VB的行爲。我們早已意識到VB在這方面吸引人。但是我們仍然留下了這些可怕的環球。


旁白:

  • 局部變量也可以被聲明爲TfrmNewMember。
  • 自從您用try/finally管理生活以來,沒有必要將構造函數傳遞給應用程序。通過零而不是。
+0

我明白你在說什麼,但是我沒有實施它。我試圖做一些研究,但仍然沒有運氣。另外,@TLama的代碼不允許我通過點擊按鈕來訪問我的程序。正確? – Babah254

+0

你的'DoSomething'並不好,因爲它現在。您需要將它作爲參數傳遞給表單引用,或者將其作爲表單的一種方法。 –