如何在Delphi中获得等效的静态(类)字段?

时间:2012-01-02 15:57:02

标签: delphi oop static delphi-7

我在一个非常昂贵的课程中有一定的操作。 (完全运行大约8秒)所以,现在我已经决定它可能应该在“初始化”屏幕的程序开始时运行。我在Delphi的任何地方都找不到表明存在静态字段的东西。

我基本上需要做的是加载一个记录列表,并在程序的整个生命周期中保持它们的存活。在Delphi中执行此操作的最佳方法是什么?

我会很简单地在C#中这样做:

class Foo{
  static List<...> Bar;
}

然而在Delphi中,我没有看到任何用于创建静态字段的内容。我所看到的是用于创建静态方法的class关键字

3 个答案:

答案 0 :(得分:5)

您可以使用全局变量。将其添加到单元的implementation部分,使其成为该单元的本地部分。

我的Turbo Delphi支持class var x:integer;,但我很确定Delphi 7不支持。{/ p>

答案 1 :(得分:4)

我认为现在是在Delphi中使用initializationfinalization的好时机。这是在单元的末尾,就在end.之前。您可以使用它来创建/释放这样的全局实例,或者只设置默认变量...

unit Unit1;

interface

uses
  Classes;

function MyList: TStringList;    

implementation

var
  GMyList: TStringList;

function MyList: TStringList;
begin
  Result:= GMyList;
end;

initialization
  GMyList:= TStringList.Create;
  MyList.Append('Value 1'); 
  MyList.Append('Value 2');
  MyList.Append('Value 3');

finalization
  GMyList.Free;

end.

这只需要像这样的特殊场景。 MyList将在申请期间继续存在。

请注意GMyListimplementation的声明MyListGMyList实际上是访问GMyList的全局函数。这是为了避免意外分配等。在任何其他单元中,您可以使用MyList功能访问GMyList,但无法直接访问{{1}}(这是您希望避免的错误)。

答案 2 :(得分:3)

如果你想要真实的东西,你需要一个更新的Delphi版本。

然而,帕斯卡总是有类似的范围,但为此你应该(有点幻想)将一个单位视为静态决赛阶段。

公共的函数和变量在接口部分中定义,私有部分在实现部分中定义。 所有这些或多或少都等同于类变量和类方法。

如果你命名你的单元loader.pas,并在接口部分定义一个函数“init”,你甚至可以把它称为类函数:loader.init()。

初始化和终结部分相当于类构造函数和类析构函数。

我上面描述的内容从turbo plascal到delphi 2007(我认为类变量在d2009中引入)是有意义的。总而言之,我建议只是换一个新的delphi。