我有(静态)GT_MyClass 类
GT_MyClass = class
private
class var FImage : TJpegImage;
class function GetImage: TJpegImage;
public
property Image : TJpegImage read GetImage;
end;
在函数 GetImage 中,如果 FImage 尚不存在,我将创建它。
class function GT_Myclass.GetImage: TJpegImage;
begin
if not Assigned(FImage) then
begin
FImage := TJpegImage.Create;
end;
Result := FImage;
end;
在最终确定中我想要 FreeAndNil(FImage)
finalization
if Assigned(FImage) then
FreeAndNil(FImage);
但在终结 block 中我看不到私有(private)变量 FImage...
请问你能帮我吗?
谢谢!
顺便说一句:我希望属性图像绝对静态
最佳答案
这是由于范围的差异造成的。在类方法 GT_MyClass.GetImage
中,您的代码位于类的范围内,因此可以看到类成员。终结部分在全局范围内执行。因此,您可以通过限定名称来编译代码:
finalization
if Assigned(GT_MyClass.FImage) then
FreeAndNil(GT_MyClass.FImage);
事实上,测试分配的 GT_MyClass.FImage
是没有意义的,因为 Free
已经这样做了。所以你会写:
finalization
FreeAndNil(GT_MyClass.FImage);
或者您可以提供该类的另一种方法来更好地封装它:
type
GT_MyClass = class
private
class var FImage : TJpegImage;
class function GetImage: TJpegImage;
class procedure Finalize;
public
property Image : TJpegImage read GetImage;
end;
....
class procedure GT_MyClass.Finalize;
begin
FreeAndNil(FImage); // in scope of class, no need to qualify
end;
....
finalization
GT_MyClass.Finalize;
但这仍然让您从类外部调用私有(private)方法,这并不理想。所以你可以使用 class destructor ,它是从单元的最终代码执行的:
type
GT_MyClass = class
private
class var FImage : TJpegImage;
class function GetImage: TJpegImage;
class destructor ClassDestroy;
public
property Image : TJpegImage read GetImage;
end;
....
class destructor GT_MyClass.ClassDestroy;
begin
FreeAndNil(FImage); // in scope of class, no need to qualify
end;
不需要终结代码,编译器会自动确保调用类析构函数。
关于delphi - 在终结中使用私有(private)方法/var,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33300350/