在智能指针上获取RTTI信息

时间:2019-04-13 02:27:18

标签: delphi smart-pointers rtti spring4d

使用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;

以上行可以由工厂处理。无论如何只是一个想法

0 个答案:

没有答案