在定稿中使用 private method/var
Use private method/var in finalization
我有(静态)Class 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);
但是在完成块中我看不到私有变量 FImage...
你能帮帮我吗?
谢谢!
顺便说一句:我想 属性 图像绝对静态
这是因为范围不同。在 class 方法中,GT_MyClass.GetImage
您的代码在 class 的范围内,因此可以看到 class 成员。终结部分在全局范围内执行。因此,您可以通过限定名称来编译代码:
finalization
if Assigned(GT_MyClass.FImage) then
FreeAndNil(GT_MyClass.FImage);
事实上,测试 GT_MyClass.FImage
被分配是没有意义的,因为 Free
已经这样做了。所以你会写:
finalization
FreeAndNil(GT_MyClass.FImage);
或者您可以提供 class 的另一种方法,它更好地封装了这个:
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 外部调用私有方法,这并不理想。因此,您可以使用 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;
不需要终结代码,编译器会自动确保 class 析构函数被调用。
我有(静态)Class 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);
但是在完成块中我看不到私有变量 FImage...
你能帮帮我吗?
谢谢!
顺便说一句:我想 属性 图像绝对静态
这是因为范围不同。在 class 方法中,GT_MyClass.GetImage
您的代码在 class 的范围内,因此可以看到 class 成员。终结部分在全局范围内执行。因此,您可以通过限定名称来编译代码:
finalization
if Assigned(GT_MyClass.FImage) then
FreeAndNil(GT_MyClass.FImage);
事实上,测试 GT_MyClass.FImage
被分配是没有意义的,因为 Free
已经这样做了。所以你会写:
finalization
FreeAndNil(GT_MyClass.FImage);
或者您可以提供 class 的另一种方法,它更好地封装了这个:
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 外部调用私有方法,这并不理想。因此,您可以使用 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;
不需要终结代码,编译器会自动确保 class 析构函数被调用。