Используя 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;
вышеуказанная строка может быть обработана на заводе. В любом случае, просто идея