Delphi - 使用带有 属性 setter 的函数
Delphi - Using a function with a property setter
Delphi RIO - 定义了一个名为 TBizObj 的 class。其中一个属性与 DUNS 编号有关。 DUNS 数字有时会在左侧填充“0”以使其恰好为 9 个字符长,因此我有一个名为 SiteDUNS9 的 属性(基于 fSiteDUNS9)。调用程序设置 SiteDUNS9 属性,但调用者不必担心 DUNS 是否为 9 个字符,我将在 getter/setter 属性中处理它。
当我定义我的 属性 来调用这个函数时,我得到一个错误 'Incompatible types'。一切都是字符串......不涉及其他类型。这是代码的相关部分:
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 方法声明一个过程。正如 Property Access
帮助所说:
write fieldOrMethod
In a write specifier, if fieldOrMethod is a method, it must be a
procedure that takes a single value or const parameter of the same
type as the property (or more, if it is an array property or indexed
property).
在您的情况下,您可以这样写 setter:
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
.
对于 属性 setter,您需要使用 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;
Delphi RIO - 定义了一个名为 TBizObj 的 class。其中一个属性与 DUNS 编号有关。 DUNS 数字有时会在左侧填充“0”以使其恰好为 9 个字符长,因此我有一个名为 SiteDUNS9 的 属性(基于 fSiteDUNS9)。调用程序设置 SiteDUNS9 属性,但调用者不必担心 DUNS 是否为 9 个字符,我将在 getter/setter 属性中处理它。
当我定义我的 属性 来调用这个函数时,我得到一个错误 'Incompatible types'。一切都是字符串......不涉及其他类型。这是代码的相关部分:
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 方法声明一个过程。正如 Property Access
帮助所说:
write fieldOrMethod
In a write specifier, if fieldOrMethod is a method, it must be a procedure that takes a single value or const parameter of the same type as the property (or more, if it is an array property or indexed property).
在您的情况下,您可以这样写 setter:
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
.
对于 属性 setter,您需要使用 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;