powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Implicit
10 сообщений из 10, страница 1 из 1
Implicit
    #40009849
Mixrud
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть конструкция из record

Код: pascal
1.
MyField.V := 'Test';



Где V это Property, пускай String;

Хочется очень уйти от Property и сделать

Код: pascal
1.
2.
3.
4.
class operator TMyField.Implicit (const Value: String): TMyField;
begin
   Result.V := Value;
end;


Используя это так:

MyField := 'Test'.

Проблема в том что геттер и сеттер V работает с экземпляром класса,
притом регистрируется его интерфейс в определенных слоях. И снова создавать класс и регистрировать
интерфейс при каждом присвоении совсем не хочется. Как-то выкрутиться можно?
Нужно скопировать ссылку, находящуюся в MyField и передать перед присвоением в новое значение.
...
Рейтинг: 0 / 0
Implicit
    #40009867
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mixrud
притом регистрируется его интерфейс в определенных слоях. И снова создавать класс и регистрировать

Требуется перевод этой фразы для программистов, знакомых с интерфейсами, классами и ООП в целом.
...
Рейтинг: 0 / 0
Implicit
    #40009878
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MixrudMyField := 'Test'.

Обломись, оператор присваивания не поддаётся переопределению.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Implicit
    #40009911
Mixrud
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Очень близок к решению. Оно работает для GUI потока вроде норм.
Я не знаю, надо допилить и очень аккуратно для одной модельки пустить в прод.

В случае чего, я тяжелое не курю.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  TStringNullTest = record
  Private
    Class Var
      FLastRef: TStringNullTest;
      FLastValue: StringNull;
    Var
    FRef: TStringNull;
    FLifeTime: IInterface;
    procedure SetRef(const Value: TStringNull);
    procedure RecreateLifitime();
  Public
    class operator Implicit(value: StringNull): TStringNullTest;
    class operator Implicit(value: String): TStringNullTest;

    property Ref: TStringNull read FRef write SetRef;
  end;




{ TStringNullTest }

Код: 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.
class operator TStringNullTest.Implicit(value: StringNull): TStringNullTest;
begin
  Result.FRef := TStringNull.Create;
  Result.FRef.V := value;
end;

class operator TStringNullTest.Implicit(value: String): TStringNullTest;
begin
  TStringNullTest.FLastValue := value;
  TStringNullTest.FLastRef := Result;
end;

procedure TStringNullTest.RecreateLifitime;
var CaptureRef: TStringNullTest;
begin
  CaptureRef := Self;
  FLifetime := TLifetimeWatcher.Create(procedure
  begin
    // Вот тут-то мы и переопределили оператор присвоения. Заодно еще и деструктор появился в record ))))
    TStringNullTest.FLastRef.FRef := CaptureRef.FRef;
    TStringNullTest.FLastRef.FRef.V := TStringNullTest.FLastValue;
    TStringNullTest.FLastRef.RecreateLifitime();
  end);
end;

procedure TStringNullTest.SetRef(const Value: TStringNull);
begin
  FRef := Value;
  RecreateLifitime();
end;



Этот код валидный для такого примера

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  // Имитируем регистрацию
  T.Ref := TStringNull.Create;

  T.Ref.Value := 'Первое значение';

  T := 'Второе значение';

  T := 'третье';

  T := 'четвертое'
...
Рейтинг: 0 / 0
Implicit
    #40010009
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

MixrudMyField := 'Test'.

Обломись, оператор присваивания не поддаётся переопределению.

С чего вдруг?
Код: pascal
1.
2.
3.
4.
var
x, y: TMyRecord;
begin
   x := 12;      // Implicit conversion from an Integer
...
Рейтинг: 0 / 0
Implicit
    #40010014
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp// Implicit conversion from an Integer

Хм, действительно, идея приводить правую часть меня как-то не напала...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Implicit
    #40010043
Mixrud
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сваял лошадку.

Говнокод на допущениях:
1. Адрес record не изменится.
2. Интерфейсы получат nil в порядке их объявления в record.

Везде на форумах, stack owerflow - буржуи твердят задача не решаема. Решаема. В контроллере валютной сделки СВОП все проперти текстовые такой TStringNullTest получили. Работает как часики.

Вот он несуществующий оператор присвоения, противоречащий архитектуре Pascal.


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
pStringNullTest = ^TStringNullTest;
  TStringNullTest = record
  Private
    Class Var
      FIsImplicit: Boolean;
      FDefferedImplicitValue: StringNull;
    Var
    FRef: TStringNull;
    FLifeTimeValue: IInterface;
    FLifeTimeObject: IInterface;
    procedure SetRef(const Value: TStringNull);
    procedure RecreateLifitimeValue();
    procedure RecreateLifitimeObject();

  Public
    class operator Implicit(value: StringNull): TStringNullTest;
    class operator Implicit(value: String): TStringNullTest;
    class operator Implicit(value: TStringNullTest): TStringNull;

    property Ref: TStringNull read FRef write SetRef;
  end;



{ TStringNullTest }
Код: 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.
class operator TStringNullTest.Implicit(value: StringNull): TStringNullTest;
begin
  TStringNullTest.FIsImplicit := True;
  TStringNullTest.FDefferedImplicitValue := value;
end;

class operator TStringNullTest.Implicit(value: String): TStringNullTest;
begin
  TStringNullTest.FIsImplicit := True;
  TStringNullTest.FDefferedImplicitValue := value;
end;

class operator TStringNullTest.Implicit(value: TStringNullTest): TStringNull;
begin
  Result := value.FRef;
end;

procedure TStringNullTest.RecreateLifitimeObject;
var captureRef: pStringNullTest;
begin
  captureRef := @Self;
  FLifeTimeObject := TLifetimeWatcher.Create(procedure
  begin
    if not TStringNullTest.FIsImplicit and PropertyRegistry.ContainsKey(captureRef) then
     PropertyRegistry.Remove(captureRef);

    TStringNullTest.FIsImplicit := False;
    captureRef^.RecreateLifitimeObject();
  end);
end;

procedure TStringNullTest.RecreateLifitimeValue;
var CaptureRef: pStringNullTest;
begin
  CaptureRef := @Self;
  FLifeTimeValue := TLifetimeWatcher.Create(procedure
  var outRef: TModelProperty;
  begin
    if TStringNullTest.FIsImplicit and PropertyRegistry.TryGetValue(CaptureRef, outRef) then begin
      CaptureRef^.FRef := outRef as TStringNull;
      CaptureRef^.FRef.V := TStringNullTest.FDefferedImplicitValue;
      CaptureRef^.RecreateLifitimeValue();
    end;
  end);
end;

procedure TStringNullTest.SetRef(const Value: TStringNull);
var captureRef: pStringNullTest;
begin
  captureRef := @Self;
  FRef := Value;
  PropertyRegistry.Add(captureRef, Self);
  RecreateLifitimeValue();
  RecreateLifitimeObject();
end;



И реестр, который требуется оформить позже sinlgleton pattern

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
unit _ClassModelPropertyRegistry;

interface

uses _ClassSmallDictionary, _EngineNullable, _classModelProperty;

var
  PropertyRegistry: TSmallDictionary<Pointer, TModelProperty>;

implementation

initialization
  PropertyRegistry := TSmallDictionary<Pointer, TModelProperty>.Create;;

finalization
  PropertyRegistry.Free;
end.
...
Рейтинг: 0 / 0
Implicit
    #40010046
Mixrud
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Меня на работе пристрелят, за то что я вместо того, чтобы документацию по движку писать, занимался сегодня операторами присвоения в Delphi ))))
Иду спать сегодня счастливый!
...
Рейтинг: 0 / 0
Implicit
    #40010051
Mixrud
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Самое обидное в 10.3 все есть. Не нужно было бы городить паровоз ((
...
Рейтинг: 0 / 0
Implicit
    #40010090
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mixrud
Говнокод
опечатка в Lifitime
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Implicit
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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