如何识别Delphi中的StringList对象是否已创建

4

我在私有部分声明了一个TStringList变量。在按钮单击事件中,我想要访问这个TStringList对象。

sVariable:= TStringList.Create;
sVariable.add('Test1');

现在每当我点击那个按钮时,它每次都会新创建一个变量并分配内存。有没有使用属性/函数来确定是否为该变量创建了对象,并且它不会导致访问冲突错误?


小心,所有答案都忘了初始化变量/字段,而是依赖隐式初始化。 - Premature Optimization
+1 表示访问违规确实发生了 :-) - Premature Optimization
4
Delphi类实例确实会被初始化为零。这是可以依赖的事情。当您编写析构函数时,必须依赖它。 - David Heffernan
2个回答

10
if not Assigned(sVariable) then
  sVariable:= TStringList.Create;
sVariable.add('Test1');

5
另一种方法是扩展David的答案,通过具有读取方法的属性来实现。
TMyForm = class (TForm)
private
  FStrList : TStringList;
public
  property StrList : TStringList read GetStrList;
  destructor Destroy; override;
end;

implementation

function TMyForm.GetStrList : TStringList;
begin
  if not Assigned(FStrList) then
    FStrList := TStringList.Create;
  Result := FStrList;
end;

destructor TMyForm.Destroy;
begin
  FStrList.Free;
  inherited;
end;

编辑:在重写析构函数中添加了Free调用。

如果列表可能从代码的多个部分使用,则这是更好的方法,但如果仅在一个地方访问它,则可能过度设计。 - Gerry Coll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接