我在DataModule窗体中定义了一个TADOQuery,一个TADOConnection,两个中间的Connection和ConnectionString都设置好了,在另一个继发承窗体中有一个TDataSource,将TDataSource的DataSet设置到ADOQuery,当编译时提示为:
Project Furnishings.exe raised exception class EAccessViolation with message Access Violation at address 004CBFD in module 'Furnishings.exe' Read of address 00000060, process stopped,use step or Run to continue.这样的提示是怎么回事,数据库的连接都没有错,为何编译时就出现这样的问题?如果将TADOQuery与DataSource放到同一窗体,并将TADOQuery的Connectionsting重新设置,编译又正常通过。就是不能设置到DataModule窗体中的TADOConnection,这是为什么?请指点!

解决方案 »

  1.   

    看你的问题很像是TDataSource 对象没初始化(Read of address 00000060),也就是在窗体(另一个继发承窗体)的适当处加入DataSource:=TDataSource.Create;楼主最好把问题源码发上来,才能确定具体哪里错了
      

  2.   

    请将
    Application.CreateForm(TForm1, Form1);
    Application.CreateForm(TDataModule1, DataModule1);
    改为
    Application.CreateForm(TDataModule2, DataModule2);
    Application.CreateForm(TForm1, Form1);
      

  3.   

    sorry请将
    Application.CreateForm(TForm1, Form1);
    Application.CreateForm(TDataModule1, DataModule1);
    改为
    Application.CreateForm(TDataModule1, DataModule1);
    Application.CreateForm(TForm1, Form1);
      

  4.   

    在TDataModule1没创建时,是不是在Form1时就要用到了DataModule1里面的数据..这样就出错了..
      

  5.   

    其实在程式里我没写任何代码,我全是在属性里设置,也许上面两位说的对,一是:对象没初始化,二是:在TDataModule1没创建时,是不是在Form1时就要用到了DataModule1里面的数据发,我的DataModule模块是放在dmClient窗体中,单元名为DataModule,在dmClient窗中放一个TADOConnection:ADOcnFurnish,用属性ConnectionString直接连到数据库,一个TADOquery:ADOFushing用Connection属性直接连到ADOcnFurnish,在另一个继承窗体frmBaseInfo放一个TDataSource:dsFutnish,用 DataSet属性连接到dmClient.ADOcnFurnish,该frmBaseInfo是继承frmBase,在frmBaseInfo的interface中我也加了uses DataModule,在frmBase中我就写了一个回车键等效于TAB键的命令,里面没放任何控件。你们所说的加代码,我都不知加在那里,请指教,我以前都是这样连,这样做都没出问题,而这次不知为何。谢谢!
      

  6.   

    你的是继承窗体,要自己写CREATE构造器,在构造器里,第一句写上inherited;
      

  7.   

    继承窗体中我写了
    procedure TfrmBaseInfo.FormCreate(Sender: TObject);
    begin
      inherited;
    if not dmClient.ADOFushing.Active then dmClient.ADOFushing.Open ;
    end;
      

  8.   

    设置断点测试if not dmClient.ADOFushing.Active then dmClient.ADOFushing.Open ;就出现我的问题点所给出的错误提示。
      

  9.   

    此时,你的dmClient还没有创建。
      

  10.   

    我将它改成
    Application.CreateForm(TdmClient, dmClient);
    if not dmClient.ADOFushing.Active then dmClient.ADOFushing.Open ;
    错误提示为:Project Furnishings.exe raised exception class EAccessViolation with message ‘ADOFushing:Missing SQL property'.process stopped,use step or Run to continue.这是为什么?那里没写好.
      

  11.   

    经过高手指点,刚才那问题是解决了,但新的问题要来了,只要点击编辑按钮执行
    dmClient.QCompanyInfo.Edit ;它就死机,画面不动,点退出都没反应,只能按ctrl+alt+del键,结束任务才能关闭,真麻烦,还得请高手把把脉
      

  12.   

    我已经是单步啦,编辑按钮就放了这二条语句
    begin
    inherited;
    dmClient.ADOFushing.Edit;
    end;
      

  13.   

    楼主都说过是编译错误了,因此错误不在编码。在IDE设计过程中,当一个窗体使用到另一个窗体定义的资源,那么另一个窗体要先打开。再者楼主说你的窗体继承自一个DataModule,窗体可以继承自一个DataModule吗?不知是小弟的功底不够还是怎么地?
      

  14.   

    inherited写在create里而不是formcreate里面
    //我来给你写
    //1构造器
    constructor  TfrmBaseInfo.create();
    begin
      inherited;
    end;procedure TfrmBaseInfo.FormCreate(Sender: TObject);
    begin
      ADOFushing.open;
    end;//模块放在窗体里?谁教你的。
      

  15.   

    notruiyi(notruiyi)你所说的这个constructor  TfrmBaseInfo.create();
    begin
      inherited;
    end;根本就无法通过。我不明白,为何要一个构造器,是构造一个什么,就一句inherited;不明白,也试过,编译没通过,提示为Incompatible types,你所说的模块放在窗体里,我窗体里没有放模块,要放也是新建一个单元文件,然后放在单元文件中,
    wizardqi(男巫) 说我继承自一个DataModule,DataModule来存放数据连接的窗体,我只能引用它里面控件,更本就没有继承,也许是我上面没说清,也许是你所说“不知是小弟的功底不够还是怎么地?”,不过还是很感谢两位给我的帮助和忠告。
      

  16.   

    //不会忘了连接吧
    procedure TDataModule1.DataModuleCreate(Sender: TObject);
    begin
       ADOConnection1.Connected := true;
    end;procedure TDataModule1.DataModuleDestroy(Sender: TObject);
    begin
       ADOConnection1.Connected := false;
    end;
      

  17.   

    没有忘记连接啊,我在程式中都以连上了,奇怪的是只要将ADOFushing放在TfrmBaseInfo窗口里,重新编写ConnectionString的连接,只要不去连TDataModule1的ADOConnection1操作一切正常。