我有一个包含多个表单的delphi项目。在其中一个表单中,我有一个包含字段的数据集,我想在另一个表单上打开此数据集,但是我收到以下错误消息,我以前没见过:
项目引发异常类$ C0000005,消息访问冲突位于0x005f536f:读取地址0x000000e8。
我做错了什么或以错误的方式解决这个问题?
非常感谢任何帮助。
谢谢,
代码:
uses frm1
procedure Tfrm2.FormCreate(Sender: TObject);
begin
frm1.ds.DataSet.Open;
end;
按钮代码点击frm1以启动frm2
procedure Tfrm1.btnCreateClick(Sender: TObject);
var Form2 : tfrm2;
begin
Form2 := tfrm2.Create(self);
Form2.Editing := False;
try
Form2.ShowModal
finally
Form2.Free;
end;
end;
答案 0 :(得分:1)
您的代码示例演示了非常糟糕的做法:
Unit1使用Unit2
Unit2使用Unit1
创建DataModule单元并使用Unit1和Unit2
将是这样的:
Unit1使用Unit2和DataModule单元
Unit2使用DataModule单元
无论如何,你的代码应该有效。您获得AccessViolation的原因 - 也许您有一些TADOQuery / TADOTable和/或TDAtaSource的事件未在您的代码示例中列出
答案 1 :(得分:0)
可执行代码是不完整的,但问题是你还没有创建form1的实例。所以frm1不可用。因此,此代码将避免访问冲突。
uses frm1
procedure Tfrm2.FormCreate(Sender: TObject);
begin
frm1 := TForm1.Create(Application);
frm1.ds.DataSet.Open;
end;
答案 2 :(得分:0)
首先,我不建议在每种形式中单独使用数据访问组件,而是将它们全部放在数据模块中。这样,您的应用程序的所有形式都可以访问您的数据访问组件,并且您的应用程序将看起来干净整洁。 关于错误,重要的是要提到form1(带数据集)应该通过其接口使用调用form2,而Form2(调用form1数据集的那个)应该通过其实现用途调用form1。我相信它会解决你的问题。让我知道它是否有效。 Ĵ