仅创建一次TDataModule

时间:2019-01-04 17:48:59

标签: delphi

我正在尝试构建一个procedure作为其父级在TDataModule中创建一个Application

问题是,第二次调用procedure时,dm参数仍然为nil。考虑到nil是以前创建的,因此我希望它有所不同。

这是我正在尝试的代码:

procedure UseDataModule(dm : TDataModule; cClass:TcomponentClass);
begin
    if dm = nil then
        cClass.Create(Application);
end;

对此procedure有一些要求:

  1. 给定的TDataModule应该创建一次

  2. 必须由procedure创建它,因为我有时想使用它,这就是为什么我不将其置于自动创建形式的原因

  3. 它的父母将永远是Application

2 个答案:

答案 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);