2013-07-17 51 views
0

我有一箇舊的Delphi 7應用程序,經過一些更改後,給出消息「訪問衝突...在'ntdll.dll'...」該消息重複4次,並可能意味着Windows無法繪製一些東西:然後,一切正常。錯誤設置家長

觸發的消息的實際線路是:

Tester.FormTester.Parent := main.FormMain.TesterSheet; 

錯誤消息後,父設置是否正確,並

Tester.FormTester.Align := alClient; 

工作正常,對準FormTester到TesterSheet客戶區。

FormTester是以前創建的,但不可見。首先使其可見並不能解決問題。 TesterSheet先前已創建,但不可見。使用任何其他父(不包括Nil)不能解決問題。等待不能解決問題。在Win7和WinXP之間移動不會改變問題。

在Delphi IDE中運行時,我只得到了相同的錯誤,IDE捕獲並顯示爲異常。當我繼續處理異常(跟蹤到)時,我得到了和以前一樣的錯誤消息框。 (重複例外/留言)

這個問題的原因是什麼?建議的解決方案是什麼?

+0

您能否包含更完整的複製/粘貼代碼,以便我們知道您正在使用哪種類型的東西? –

+0

檢查設置「Parent」屬性前後可觸發的包含的兩個表單和組件上的每個事件。另外,通過調試器運行應用程序,並查看是否會在沒有IDE的情況下在運行時阻止其他異常。 – LightBulb

+0

我並不認爲檢查每一個表單和組件都是一個現實的解決方案,但它的工作原理:我立即注意到兩個組合框,我認爲已經被刪除,當我檢查它們時,我發現它們包含幾個空字符串在字符串列表中。從字符串列表中刪除空字符串解決了問題。 – david

回答

0

正如評論中所建議的,我'檢查了每個表單和組件'。我已經知道這不是導致問題的事件屬性,因爲我已經熟悉所有事件。

但我確實發現了兩個組合框,我沒想到會看到。

正如Empty string in Delphi/Windows combo box causes access exception所述,Delphi 7.0組合框存在一個已知問題,當您訪問空行時會導致訪問衝突錯誤:http://qc.embarcadero.com/wc/qcmain.aspx?d=2246

因爲沒有明顯的原因,這個已知的問題是在表單父項被設置時觸發的。

可能的解決方案包括刪除組合框,修補庫,應用7.1 Service Pack或升級。

在這種情況下,通過從組合框的默認字符串列表中刪除空行來解決問題。

+0

請注意[QualityCentral現在已關閉](https://community.embarcadero.com/blogs/entry/quality-keeps-moving-forward),因此您無法再訪問'qc.embarcadero.com'鏈接。如果您需要訪問舊的QC數據,請查看[QCScraper](http://www.uweraabe.de/Blog/2017/06/09/how-to-save-qualitycentral/)。 –

0

我需要看的比你已經發布,以確保更多的代碼,但下面的代碼已經在一些應用中一直爲我工作了多年: -

Procedure TfrmMain.ShowInPanel(pForm : TForm); 
Begin 
    If Assigned(FCurrForm) Then 
    FCurrForm.Close; 
    With pForm Do 
    Begin 
    FCurrForm := pForm; 
    Parent := pnlMain; // pnlMain is the panel where the form is shown 
    BorderStyle := bsNone; 
    Align := alClient; 
    Show; 
    Update; 
    End; 
End; 

它然後叫這樣的: -

lfrmCategories := TfrmCategories.Create(pnlMain); 
ShowInPanel(lfrmCategories); 

希望這會幫助您解決問題。