Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Helper для свойства типа String  [new]
niggafckr
Member

Откуда:
Сообщений: 9
Есть следующий хелпер:

TStringHelper = record helper for String
  procedure add(str: string); inline;
end;


И есть класс "myClass" со свойством

property a: String read FA write setA;


Метод "setA()" делает такое:

procedure TMyClass.setA(a: String);
begin
  showMessage(a);
end;


И если вызвать хелпер "add()" для этого свойства, то "showMessage()" не сработает, но значение запишется в поле напрямую:

myObj.a := 'Моя ';
myObj.a.add('строка');


Здесь "showMessage()" вызывается только единожды. Почему так происходит?
6 сен 19, 21:39    [21965750]     Ответить | Цитировать Сообщить модератору
 Re: Helper для свойства типа String  [new]
rgreat
Member

Откуда:
Сообщений: 5212
niggafckr,

myObj.a.add('строка');


Тут работает только геттер а не сеттер и геттер сразу.

А значение 'a' у тебя меняется только потому что там идет работа по указателю.
6 сен 19, 21:51    [21965754]     Ответить | Цитировать Сообщить модератору
 Re: Helper для свойства типа String  [new]
rgreat
Member

Откуда:
Сообщений: 5212
+ Стоит сделать нормальный геттер твой код перестанет работать
program Project11;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

type
  TStringHelper = record helper for String
    procedure add(str: string);
  end;

  TXXX = class
  private
    FA: String;
    function getA: String;
    procedure setA(const Value: String);
  published
    property a: String read getA write setA;
  end;


{ TStringHelper }

procedure TStringHelper.add(str: string);
begin
  Self:=Self+#13#10+Str;
end;

{ TXXX }

function TXXX.getA: String;
begin
  Result := FA;
  WriteLn('Get:'+FA);
end;

procedure TXXX.setA(const Value: String);
begin
  FA := Value;
  WriteLn('Set:'+FA);
end;

var
  X : TXXX;

begin
  x:=TXXX.Create;
  WriteLN('----- Set A directly------');
  x.a:='123';
  WriteLN('----- "Set" A through helper ------');
  x.a.add('456');
  WriteLN('----- Get result ------');
  WriteLN(x.a);

  ReadLn;
end.


----- Set A directly------
Set:123
----- "Set" A through helper ------
Get:123
----- Get result ------
Get:123
123
6 сен 19, 21:56    [21965758]     Ответить | Цитировать Сообщить модератору
 Re: Helper для свойства типа String  [new]
niggafckr
Member

Откуда:
Сообщений: 9
То есть, со свойствами такие хелперы работать не заставишь?
6 сен 19, 21:59    [21965760]     Ответить | Цитировать Сообщить модератору
 Re: Helper для свойства типа String  [new]
rgreat
Member

Откуда:
Сообщений: 5212
Так как это делаешь ты - нет.
6 сен 19, 22:42    [21965772]     Ответить | Цитировать Сообщить модератору
 Re: Helper для свойства типа String  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2157
niggafckr
То есть, со свойствами такие хелперы работать не заставишь?
Всё прекрасно работает как и должно. Проблема в твоей интерпретации этой логики
7 сен 19, 00:37    [21965806]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить