【问题标题】:Delphi - Using a function with a property setterDelphi - 使用带有属性设置器的函数
【发布时间】:2019-12-22 16:21:09
【问题描述】:

Delphi RIO - 定义了一个名为 TBizObj 的类。其中一项属性与 DUNS 编号有关。 DUNS 编号有时会在左侧填充 '0' 以精确到 9 个字符长,因此我有一个名为 SiteDUNS9 的属性(基于 fSiteDUNS9)。调用程序设置 SiteDUNS9 属性,但调用者不必担心 DUNS 是否为 9 个字符,我将在 getter/setter 属性中处理它。

当我定义我的属性来调用这个函数时,我得到一个错误“不兼容的类型”。一切都是字符串......不涉及其他类型。这是代码的相关部分:

type
  TBizObj = class(TObject)   
  private
  ...
  fSiteDUNS9:  string;
  ... 

  function FixDunsLength9(DUNS:string) :string;

  published
  ...
  property SiteDUNS9:  string read fSiteDUNS9 write FixDunsLength9;  

  end; // End of the tBizObj Class;

implementation
...  
function TBizObj.FixDunsLength9(DUNS:string):string;
begin
  //  This is a setter function for the DUNS9 routine
  result := glib_LeftPad(DUNS, 9, '0');
end;

我遵循了 Embaracadero 网站上的示例,但仍然无法确定我做错了什么。 http://docwiki.embarcadero.com/RADStudio/Rio/en/Properties_(Delphi)

如果我将属性定义更改为

 property SiteDUNS9:  string read fSiteDUNS9 write fSiteDUNS9;

然后我的程序编译正确。

【问题讨论】:

  • setter 需要是一个接受字符串参数并且不返回值的过程。在文档中查找示例。
  • @David - 我做了,但没听懂... :( 作为答案提交,我会接受。
  • procedure FixDunsLength9(const DUNS: string);,但你最好调用像SetSiteDUNS9这样的setter。

标签: delphi properties setter


【解决方案1】:

您需要使用procedure 而不是function 作为属性设置器。如果您需要它用于其他目的,我会保留现有功能,并为 setter 定义一个单独的过程:

type
  TBizObj = class(TObject)
  private
    ...
    fSiteDUNS9: string;
    ...
    function FixDunsLength9(const DUNS: string): string;
    procedure SetSiteDUNS9(const Value: string);
  published
    ...
    property SiteDUNS9: string read fSiteDUNS9 write SetSiteDUNS9;
  end;
  // End of the tBizObj Class;

implementation

...

function TBizObj.FixDunsLength9(const DUNS: string): string;
begin
  Result := glib_LeftPad(DUNS, 9, '0');
end;

procedure TBizObj.SetSiteDUNS9(const Value: string);
var
  NewValue: string;
begin
  NewValue := FixDunsLength9(Value);
  if fSiteDUNS9 <> NewValue then
  begin
    fSiteDUNS9 := NewValue;
    ...
  end;
end;

【讨论】:

  • 这样更好,因为可以在类中的任何其他地方重用 FixDunsLength9 函数。
  • 好主意。谢谢!
【解决方案2】:

您需要为 setter 方法声明一个过程。正如Property Access 帮助所说:

字段或方法

write 说明符中,如果 fieldOrMethod 是方法,则它必须是 采用单个值或 const 参数的过程 类型作为属性(或更多,如果它是数组属性或索引 属性)。

在您的情况下,您可以编写这样的设置器:

type
  TBizObj = class(TObject)   
  private
    FSiteDUNS9: string;
    procedure FixDunsLength9(const DUNS: string);
  published
    property SiteDUNS9: string read FSiteDUNS9 write FixDunsLength9;
  end;

implementation

procedure TBizObj.FixDunsLength9(const DUNS: string);
begin
  if DUNS <> FSiteDUNS9 then
  begin
    DoSomeExtraStuff;
    FSiteDUNS9 := DUNS;
  end;
end;

但按照命名约定,我建议您将 setter 命名为 SetSiteDUNS9 和参数调用 Value

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    相关资源
    最近更新 更多