You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨单元修改对象属性读写权限:Delphi ADO组件访问异常求助

解决跨单元访问数据模块ADO组件的编译及运行时异常问题

错误原因拆解

  • 编译错误E2003 未声明的标识符: 'ADOQuery':Delphi数据模块(dmUnit1)内的组件默认是Private可见性,frmUnit1无法直接访问其内部的ADOQuery1组件。
  • 自行声明var ADOQuery1: TADOQuery;后出现运行时访问违规:你声明的是一个未初始化的局部TADOQuery变量,未关联到数据模块中已创建的ADOQuery1实例,本质是操作空指针导致内存访问错误。

解决步骤

  1. 修改数据模块组件的可见性
    打开dmUnit1,在Object Inspector中选中ADOQuery1组件,找到Visibility属性,将其从Private改为Public;也可直接在dmUnit1的interface段public区域确认组件声明(拖放生成的组件通常在published段,保留或移至public均可):

    type
      TdmUnit1 = class(TDataModule)
        ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
        DataSource1: TDataSource;
      public
        // 确保组件在此区域或published区域,保证跨单元可访问
      end;
    
  2. 正确访问数据模块内的组件
    在frmUnit1中,必须通过数据模块的实例访问ADOQuery1,而非直接使用组件名:

    • 若数据模块为自动创建(默认项目设置),直接调用全局实例:
      dmUnit1.ADOQuery1.Active := True;
      
    • 若数据模块为手动创建,需先完成实例化再操作:
      var
        dm: TdmUnit1;
      begin
        dm := TdmUnit1.Create(nil);
        try
          dm.ADOQuery1.Active := True;
          // 执行其他业务逻辑
        finally
          dm.Free;
        end;
      end;
      
  3. 清理错误声明
    删除frmUnit1中自行添加的var ADOQuery1: TADOQuery;声明,避免与数据模块的组件名冲突,同时消除未初始化变量的风险。

内容的提问来源于stack exchange,提问作者UnicornBoote

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 04:06:26