我有(静态)类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);但是在终结块中,我看不到私有var FImage..。
你能帮帮我吗?
谢谢!
顺便说一句:我想要属性图像是绝对静态的
发布于 2015-10-23 10:40:07
这是由于范围不同造成的。在类方法中,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;但是,这仍然让您从类外部调用一个私有方法,这并不理想。因此您可以使用一个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;不需要终结代码,编译器会自动确保类析构函数被调用。
https://stackoverflow.com/questions/33300350
复制相似问题