在另一个表单上打开数据源会引发错误

时间:2015-07-17 08:24:41

标签: delphi delphi-xe2

我有一个包含多个表单的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;

3 个答案:

答案 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。我相信它会解决你的问题。让我知道它是否有效。 Ĵ