我正在Delphi中开发一个带有DataModule的应用程序,当我从应用程序的主窗体引用DataModule时,我遇到了访问冲突,看起来
DataModule1
是nil
,这可以解释AV错误,但我不确定如何解决问题,因为每个文件中的所有内容似乎都已正确定义。
这是主要表单代码(标有AV线):
unit mainform;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Data.DB, Vcl.Grids, Vcl.DBGrids, Vcl.ExtCtrls, Vcl.Buttons, Vcl.DBCtrls,
Vcl.StdCtrls, datamod;
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
DBNavigator1: TDBNavigator;
DBGrid1: TDBGrid;
procedure Form1Create(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Form1Create(Sender: TObject);
begin
left:=(screen.width-width) div 2;
top:=(screen.height-height) div 2;
with DataModule1.dbConnect do // <---- This line gives the AV
begin
Close;
with Params do
begin
Clear;
Add('DriverID=SQLite');
Add('Database=c:\batool.db');
end;
Open;
end;
DataModule1.FDQuery1.Open;
end;
end.
这是数据模块代码:
unit datamod;
interface
uses
System.SysUtils, System.Classes, FireDAC.Stan.Intf, FireDAC.Stan.Option,
FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def,
FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.VCLUI.Wait,
FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.DApt, Data.DB,
FireDAC.Comp.DataSet, FireDAC.Comp.Client, FireDAC.Phys.SQLite,
FireDAC.Phys.SQLiteDef, FireDAC.Stan.ExprFuncs,
FireDAC.Phys.SQLiteWrapper.Stat;
type
TDataModule1 = class(TDataModule)
DataSource1: TDataSource;
dbConnect: TFDConnection;
FDQuery1: TFDQuery;
FDQuery1MRS_Item: TIntegerField;
FDQuery1MRS_Desc: TStringField;
FDQuery1MRS_Amount: TBCDField;
FDQuery1MRS_Actual: TBCDField;
FDQuery1MRS_Adjust: TBCDField;
FDQuery1MRS_NewAmt: TBCDField;
private
{ Private declarations }
public
{ Public declarations }
end;
var
DataModule1: TDataModule1;
implementation
{%CLASSGROUP 'Vcl.Controls.TControl'}
{$R *.dfm}
end.
您需要确保
DataModule
是在主表单之前创建的。