在另一种形式的 1 形式上打开数据源会引发错误

Opening datasource on 1 form in another raises error

我有一个包含多个表单的 delphi 项目。在其中一个表单上,我有一个包含字段的数据集,我想在另一个表单上打开这个数据集,但是我收到以下错误消息,这是我以前从未见过的:

项目引发异常 class $C0000005,在地址 0x000000e8 的 0x005f536f:read 处出现消息访问冲突。

我是不是做错了什么或处理方法不对?

如有任何帮助,我们将不胜感激。

谢谢,

代码:

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;

您的代码示例展示了非常糟糕的做法:

Unit1 using Unit2

Unit2 using Unit1

创建 DataModule 单元并从 Unit1 和 Unit2 使用它

会变成这样:

Unit1 using Unit2 and DataModule unit

Unit2 using DataModule unit

无论如何,您的代码应该可以工作。您获得 AccessViolation 的原因——也许您有一些 TADOQuery/TADOTable and/or TDAtaSource 的事件未在您的代码示例

中列出

可能代码不完整,但问题是您还没有创建 form1 的实例。所以 frm1 不可用。所以这段代码将避免访问冲突。

uses frm1

procedure Tfrm2.FormCreate(Sender: TObject); 
begin
  frm1 := TForm1.Create(Application);
  frm1.ds.DataSet.Open;
end;

首先,我不建议在每个表单中单独使用数据访问组件,而是将它们全部放在一个数据模块中。这样,您的应用程序的所有形式都可以访问您的数据访问组件,并且您的应用程序看起来干净且有条理。 关于错误,重要的是要提到 form1(带有数据集)应该通过其接口调用 form2,而 Form2(调用 form1 数据集的那个)应该通过其实现调用 form1。我相信它会解决你的问题。让我知道它是否有效。 J