相关疑难解决方法(0)

Delphi单元初始化并不总是被调用

我在.bpl中有一个单元,我需要一个我写的新函数的字符串列表.我希望stringlist在应用程序的生命周期内保持不变,这样每个调用都可以建立在之前调用的内容之上.

所以它在单元内全局声明,我在Initialization部分初始化它,如下所示:

var
  ProductLookup : TStrings;  
...

function foo : boolean;
begin
  result := (ProductLookup.IndexOfName('bar') >=0); //blow up here. It's nil. Why?
end;
....

initialization
  ProductLookup := TStringList.Create;  // This should get run, but doesn't.

finalization
  FreeAndNil(ProductLookup);

end.
Run Code Online (Sandbox Code Playgroud)

当我对它进行单元测试时,一切都很好.但是当它从主应用程序运行时,由于字符串列表为零而导致访问冲突.所以现在我在foo函数中检查nil并在必要时创建.但我不知道为什么初始化对我不起作用.我在初始化中放了一个调试消息,当它作为BPL加载时它不会运行,但如果我直接编译到我的dUnit exe中,它会运行.有任何想法吗?Delphi2005.

delphi initialization delphi-2005

9
推荐指数
1
解决办法
7762
查看次数

在类构造函数中完成类注册时未调用的类构造函数

我正在编写一个基于TDictionary的控制系统的简单依赖注入/反转,它包含抽象类引用及其各自的实现者类.

我的目标是:

  • 避免按类型直接实例化(显然).
  • 在dpr中包含一个类的单元应该足以让它注册并可通过di/ioc系统进行选择和实例化.
  • 仅在实现部分中声明具体的实现类.
  • 使用类构造函数而不是初始化部分.

顺便说一句,我知道使用类构造函数来利用智能链接并希望包含一个足以使类可用的单元相互击败.我也想使用类构造函数而不是初始化部分.我想将所有类初始化/注册代码放在一起,而不必在类构造函数和初始化部分之间进行拆分.

问题

我希望将类注册到工厂中的类构造函数中.不幸的是,编译器并不认为通过在自己的类构造函数中使用其类型来"触及"类.

当我将注册函数放在初始化部分时,编译器确实认为该类被触摸并调用类构造函数.但这违背了我在类构造函数中保留所有类初始化代码的操作的目标.

两个问题

  • 编译器是否应该考虑在自己的类构造函数中使用类"触及类",还是期望编译器做太多?
  • 在没有使用初始化部分的情况下,有没有人对如何实现我的目标有任何聪明的想法?

应用程序中使用的抽象类:

TSite = class abstract (TObject)
  function GetURL: string; virtual; abstract;
  property URL: string read GetURL;
end;

TSites = class (TList<TSite>);

TThisApplication = class abstract (TObject)
  function Sites: TSites; virtual; abstract;
end;
Run Code Online (Sandbox Code Playgroud)

TThisApplication的具体实现类(在实现部分中声明!)

  TThisApplicationConcrete = class(TThisApplication)
  class constructor ClassCreate;
  strict private
    FSites: TSites;
    function Sites: TSites; override;
  end;

class constructor TThisApplicationConcrete.ClassCreate;
begin
  RegisterImplementorClass(TThisApplication, TThisApplicationConcrete);
end;

function TThisApplicationConcrete.Sites: TSites;
var
  SiteList: TSites;
begin
  if not …
Run Code Online (Sandbox Code Playgroud)

delphi class-constructors

4
推荐指数
2
解决办法
1203
查看次数