Получение информации RTTI по ​​умному указателю - PullRequest
0 голосов
/ 13 апреля 2019

Используя Spring, когда я объявляю умный указатель для записи

SmartPerson =  IShared<Pperson>;

А затем создайте его

Smartperson := Shared<PPerson>.Make;

* кстати, думаю, это действительно круто.

Как мне получить RTTI на интеллектуальном указателе? Очевидно, я знаю, что он основан на записи TPerson, но какие шаги необходимы для того, чтобы что-то изменить, что происходит, когда Spring выделяет указатель в первую очередь?

Я вижу, что при создании указателя записи используется такой код

 tkPointer: IShared<Pointer>(Result) := Shared.TRecordFinalizer.Create(TypeInfo(T));

и следующий код

constructor Shared.TRecordFinalizer.Create(typeInfo: PTypeInfo);
var
  Size : integer;
begin
  inherited Create;
  fTypeInfo := typeInfo.TypeData.RefType^;
  size := GetTypeSize(fTypeInfo);
  fValue := AllocMem(Size);
end;       

Мой вопрос: как мне получить, например, поле записи, на которую указывает смарт-указатель, используя сам смарт-указатель?

Надеюсь, что это имеет смысл, и, возможно, еще один тупой вопрос.


Чтобы дать более подробную информацию о проблеме. У меня есть фабрика, которая использует RTTI для создания элемента управления для поля записи.

procedure TForm3.Button1Click(Sender: TObject);
begin
  Task := Shared<pTaskRecord>.make;
  Task.AnalysisDates.ES := now;

  Task.TaskType := TTaskTypes.DelayTask;

  ControlFactory := TControlFactory.create(Self);

  Edit := Controlfactory.GetControl('TAnalysisDates','ES');
  if assigned(Edit) then
  begin
    AddObject(Edit.Invoke);
    Edit.Value := @Task.AnalysisDates;
   end;
 end;  

Который работает. Возвращает TDateEdit на основе тегов атрибута записи

Возможно, я подумала, что я могла бы сделать, это

Edit := Controlfactory.GetControl(Task,Task.ES);  
//passing in my smart pointer, along with field

тогда на заводе будет все, что нужно для подключения элемента управления без необходимости делать это в коде самостоятельно.

  Edit.Value := @Task.AnalysisDates;

вышеуказанная строка может быть обработана на заводе. В любом случае, просто идея

...