我有一个旧的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)
我需要查看比您发布的代码更多的代码,但以下代码已在多个应用程序中使用了多年: -
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);
希望这可以帮助您解决问题。
答案 1 :(得分: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或升级。
在这种情况下,通过从组合框的默认字符串列表中删除空行来解决问题。