2011-03-31 109 views
0

問候德爾福訪問衝突

下面的代碼給出了一個錯誤:

"Project prKlanten.exe reaised exception class EAccessviolation with message 'acces violation at address 004d7767 in module 'prKlanten.exe'. 
Read of address 0000005C." 

procedure TfmOrder.FormCreate(Sender: TObject); 
begin 
    dm.atDier.Open; 
    while not dm.atDier.eof do 
    begin 
     cbKeuze.Items.Add(dm.atDier['Diernaam']); 
     dm.atDier.Next 
    end; 
     dm.atDier.Close; 
    end; 

任何人都知道爲什麼嗎?如果您需要更多信息,請隨時詢問。

[編輯]

欲瞭解更多信息,請參閱碧玉的職位,當你訪問一個不屬於你,如內存

+1

如果你在調試器下運行,它將斷開與我的答案更新錯誤 – 2011-03-31 06:32:43

+0

的線路。可疑是OnCreate中的呼叫。 – 2011-03-31 06:58:43

+1

請Jasper停止添加不是問題答案的答案。如果你想提供更多的細節,然後編輯問題。如果你不能編輯問題,因爲這不是你的問題,請問你自己的問題!如果沒有整理好,我將被迫投票結束,因爲太局部化了。 – 2011-03-31 08:46:54

回答

4

我敢打賭, dm尚未創建。

我敢打賭, cbKeuse.Items尚未創建。

我敢打賭,dm尚未創建。

更改該位並再次運行:

[snip] 
begin 
    Assert(dm<>nil); 
    Assert(dm.atDier<>nil); 
    dm.atDier.Open; 
    while not dm.atDier.eof do 
     [snip] 

不要斷言通過?

3

訪問衝突所引起:

  • 使用零指針
  • 緩衝溢出
  • 訪問未初始化的指針/對象
  • 訪問一個釋放的指針/對象

訪問衝突(或非法/未初始化指針)的可能來源:

  • DM未設置
  • dm.atDier未設置
  • cbKeuze是未設置
  • dm.atDier [ 'Diernaam']失敗

爲了給莫我們需要知道哪一行會導致訪問衝突。

加成 請問,如果你的代碼移動到一個臨時的OnClick臨時按鈕的AV還發生了什麼?換句話說,從OnCreate中刪除代碼,因爲你不能100%確定dm是完全可操作的。 OnActivate是另一種可能性,但您需要檢查第二次激活。