Delphi属性stackoverflow错误

前端之家收集整理的这篇文章主要介绍了Delphi属性stackoverflow错误前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的物业类:
unit SubImage;

interface

type
TSubImage = class
private
  { private declarations }
  function getHeight: Integer;
  function getWidth: Integer;
  procedure setHeight(const Value: Integer);
  procedure setWidth(const Value: Integer);
protected
  { protected declarations }
public
  { public declarations }
  property width : Integer read getWidth write setWidth;
  property height : Integer read getHeight write setHeight;
published
  { published declarations }
end;
implementation

{ TSubImage }

function TSubImage.getHeight: Integer;
begin
  Result:= height;
end;

function TSubImage.getWidth: Integer;
begin
  Result:= width;
end;

procedure TSubImage.setHeight(const Value: Integer);
begin
  height:= Value;
end;

procedure TSubImage.setWidth(const Value: Integer);
begin
  width:= Value;
end;

end.

分配:

objSubImg.width:= imgOverview.width;
objSubImg.height:= imgOverview.heigh

有趣的错误

stackoverflow at xxxxxx

我正在学习德尔福的房产.我创建了一个类,但它给出了一个错误.我无法理解,我的错误在哪里?

另外我不明白为什么我们使用属性而不是setter / getter方法.无论如何有人可以帮助我,我该如何修复此代码

我无法设置属性值.

解决方法

这是一个非终止递归. getter看起来像这样:
function TSubImage.getHeight: Integer;
begin
  Result := height;
end;

但高度是财产.所以编译器将其重写为:

function TSubImage.getHeight: Integer;
begin
  Result := getHeight;
end;

这是一个非终止递归.因此堆栈溢出.

您需要声明字段来存储值:

type
  TSubImage = class
  private
    FHeight: Integer;
    FWidth: Integer;
    function getHeight: Integer;
    function getWidth: Integer;
    procedure setHeight(const Value: Integer);
    procedure setWidth(const Value: Integer);
  public
    property width: Integer read getWidth write setWidth;
    property height: Integer read getHeight write setHeight;
  end;

然后获取并设置值:

function TSubImage.getHeight: Integer;
begin
  Result:= FHeight;
end;

procedure TSubImage.setHeight(const Value: Integer);
begin
  FHeight:= Value;
end;

对于其他财产也是如此.

在这个简单的示例中,您不需要使用getter和setter函数.您可以声明这样的属性

property width: Integer read FWidth write FWidth;
property height: Integer read FHeight write FHeight;

但我想你知道并正在探索getter / setter函数是如何工作的.

至于为什么我们使用属性而不是getter和setter函数,这取决于代码的清晰度和可读性.您可以使用getter和setter函数替换属性.毕竟,这就是编译器所做的一切.但是写起来通常更清楚:

h := obj.Height;
obj.Height := h*2;

h := obj.GetHeight;
obj.SetHeight(h*2);
原文链接:https://www.f2er.com/delphi/101753.html

猜你在找的Delphi相关文章