Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Helper для свойства типа String / 6 сообщений из 6, страница 1 из 1
06.09.2019, 21:39
    #39858649
niggafckr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Helper для свойства типа String
Есть следующий хелпер:

Код: pascal
1.
2.
3.
TStringHelper = record helper for String
  procedure add(str: string); inline;
end;



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

Код: pascal
1.
property a: String read FA write setA;



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

Код: pascal
1.
2.
3.
4.
procedure TMyClass.setA(a: String);
begin
  showMessage(a);
end;



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

Код: pascal
1.
2.
myObj.a := 'Моя ';
myObj.a.add('строка');



Здесь "showMessage()" вызывается только единожды. Почему так происходит?
...
Рейтинг: 0 / 0
06.09.2019, 21:51
    #39858651
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Helper для свойства типа String
niggafckr,

Код: pascal
1.
myObj.a.add('строка');



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

А значение 'a' у тебя меняется только потому что там идет работа по указателю.
...
Рейтинг: 0 / 0
06.09.2019, 21:56
    #39858654
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Helper для свойства типа String
Стоит сделать нормальный геттер твой код перестанет работать
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
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.



Код: plaintext
1.
2.
3.
4.
5.
6.
----- Set A directly------
Set:123
----- "Set" A through helper ------
Get:123
----- Get result ------
Get:123
123
...
Рейтинг: 0 / 0
06.09.2019, 21:59
    #39858656
niggafckr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Helper для свойства типа String
То есть, со свойствами такие хелперы работать не заставишь?
...
Рейтинг: 0 / 0
06.09.2019, 22:42
    #39858663
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Helper для свойства типа String
Так как это делаешь ты - нет.
...
Рейтинг: 0 / 0
07.09.2019, 00:37
    #39858672
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Helper для свойства типа String
niggafckrТо есть, со свойствами такие хелперы работать не заставишь?Всё прекрасно работает как и должно. Проблема в твоей интерпретации этой логики
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Helper для свойства типа String / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]