Delphi - Использование функции с установщиком свойств - PullRequest
2 голосов
/ 22 декабря 2019

Delphi RIO - определили класс с именем TBizObj. Одно из свойств связано с номерами DUNS. Номера DUNS иногда дополняются нулями слева до длины ровно 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;

, тогда моя программа компилируется правильно.

1 Ответ

7 голосов
/ 22 декабря 2019

Вам необходимо объявить процедуру для метода установки. Как говорится в справке Property Access:

запись fieldOrMethod

В спецификатор запись , если 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;

Но, следуя соглашениям об именах, я бы порекомендовал вам назвать ваш установщик как SetSiteDUNS9 и вызов параметра Value.

...