使用 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;
上述生产线可以由工厂处理。无论如何只是一个想法