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

Delphi中引用DataModule触发Access Violation问题求助

Delphi中DataModule为nil导致Access Violation的解决方法

问题描述

主窗体的FormCreate事件中访问DataModule1.dbConnect时触发Access Violation错误,排查确认DataModule1全局变量为nil,尽管单元引用和类型定义均正确。

根本原因

Delphi不会自动创建DataModule的全局实例,除非将其加入项目的自动创建表单列表,或者手动编写代码实例化。

解决方法

方法1:将DataModule加入自动创建列表

  • 操作步骤:

    1. 打开Delphi的Project菜单 → 选择Options
    2. 切换到Forms选项卡
    3. 在Available forms列表中找到DataModule1,将其移动到Auto-create forms列表
    4. 点击确定保存设置

    此方式下,程序启动时会自动创建DataModule1实例,主窗体创建时可直接访问。

方法2:手动实例化DataModule

如果不想依赖自动创建,可手动在主窗体使用前创建实例,推荐在项目的.dpr文件中处理(确保实例创建时机早于主窗体):

修改项目主文件(.dpr):

program YourProjectName;

uses
  Vcl.Forms,
  mainform in 'mainform.pas' {Form1},
  datamod in 'datamod.pas' {DataModule1};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  // 先创建DataModule实例
  DataModule1 := TDataModule1.Create(Application);
  Application.CreateForm(TForm1, Form1);
  Application.Run;
  // 程序退出时释放实例
  DataModule1.Free;
end.

也可以在主窗体的FormCreate事件开头添加创建代码:

procedure TForm1.Form1Create(Sender: TObject);
begin
  // 检查并手动创建DataModule实例
  if DataModule1 = nil then
    DataModule1 := TDataModule1.Create(nil);

  left:=(screen.width-width) div 2;
  top:=(screen.height-height) div 2;

  with DataModule1.dbConnect do
  begin
      Close;
      with Params do
      begin
          Clear;
          Add('DriverID=SQLite');
          Add('Database=c:\batool.db');
      end;
      Open;
  end;
  DataModule1.FDQuery1.Open;
end;

注意:手动创建实例后,需在程序退出时释放,避免内存泄漏。例如在主窗体的FormDestroy事件中添加:

procedure TForm1.FormDestroy(Sender: TObject);
begin
  if DataModule1 <> nil then
    DataModule1.Free;
end;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 18:02:43