我正在尝试编写一个动态创建TADOQuery
的函数。使用此函数,我可以在函数的参数中更改其SQL.Text
属性。我的函数调用应如何工作:
procedure TDlgMain.FormCreate(Sender: TObject);
var
Q: TADOQuery;
begin
Q := NewQuery('select * from Utenti');
Q.Open;
end;
该函数的代码和访问冲突错误的屏幕快照,有没有办法解决?
function NewQuery(Conn: TADOConnection; SQL: String): TADOQuery; overload;
function NewQuery(SQL: String): TADOQuery; overload;
function TDMDB.NewQuery(Conn: TADOConnection; SQL: String): TADOQuery;
begin
Result := TADOQuery.Create(nil);
Result.Connection := Conn;
Result.SQL.Text := SQL;
end;
function TDMDB.NewQuery(SQL: String): TADOQuery;
begin
Result := NewQuery(DBConn, SQL);
end;
答案 0 :(得分:1)
该错误表明您尝试通过TDataModule
使用它创建查询时尚未创建DMDB.NewQuery()
。
错误的原因有两个。
首先,使用IDE首先创建表单(在您的情况下为DlgMain: TDlgMain
),然后再创建数据模块(TDMDB: TDataModule
)。这会将模块创建之后的模块创建放置在项目文件(.dpr
)中,如下所示:(要查看.dpr
文件,请选择菜单Project - View source
)
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TDlgMain, DlgMain);
Application.CreateForm(TDMDB, DMDB);
Application.Run;
end.
第二,当您尝试在主表单OnCreate()
事件中创建连接时,当尚未创建数据模块时,结果就是您看到的AV。
您可以通过在创建主表单之前移动数据模块的创建来纠正错误:
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TDMDB, DMDB); // Create this before the form
Application.CreateForm(TDlgMain, DlgMain);
Application.Run;
end.
旁注,以防万一:
您可能已经知道,通过Application.CreateForm()
创建的第一个表单将成为主要表单,并且仍然有效。数据模块不是表单,因此您的DlgMain
仍然是第一个创建的表单,并成为主表单。