我正在尝试构建一个procedure
作为其父级在TDataModule
中创建一个Application
。
问题是,第二次调用procedure
时,dm
参数仍然为nil
。考虑到nil
是以前创建的,因此我希望它有所不同。
这是我正在尝试的代码:
procedure UseDataModule(dm : TDataModule; cClass:TcomponentClass);
begin
if dm = nil then
cClass.Create(Application);
end;
对此procedure
有一些要求:
给定的TDataModule
应该创建一次
必须由procedure
创建它,因为我有时想使用它,这就是为什么我不将其置于自动创建形式的原因
Application
答案 0 :(得分:2)
尝试将您的代码更改为此:
procedure UseDataModule(var dm : TDataModule; cClass:TcomponentClass);
// the `var` qualifier is to allow the value of `dm` to be retained
// after `UseDataModule` exits, otherwise the Created instance will be discarded
// and you will have a memory leak
begin
if dm = nil then
dm := cClass.Create(Application);
end;
Imo,最好将UseDataModule
编码为一个函数,但这很大程度上取决于口味。还要注意,您可以写if notAssigned(dm)
代替if dm = Nil
。
我从您的评论中得知,您决定使用以下代码代替我的最初建议:
procedure UseDataModule(var dm : TDataModule; cClass:TcomponentClass);
begin
if dm = nil then begin
dm := cClass.Create(Application) as TDataModule;
end;
end;
这对我来说很好。
答案 1 :(得分:1)
另一种选择是使用与自动创建表单相同的代码,并检查是否已创建表单。
// Create data module if it doesn't already exist
if DM = nil then Application.CreateForm(TDM, DM);