动态设置包含datetime的对象的属性

时间:2018-02-12 11:38:37

标签: delphi rtti delphi-10.1-berlin

我有许多不同的方法可以使用Delphi的RTTI创建,调用和设置不同对象的属性。但现在我遇到了一个错误,设置TDateTime会触发错误,如:"无法将变量转换为double"。在搜索此错误时Google无法提供帮助。

到目前为止,我定义了任何类型的对象,例如:

TExample = class
private
  FDateField : TDateTime;
published
  property DateField : TDateTime read FDateField write FDateField;
end;

然后我将此对象放在TObjectList中,然后循环一些与问题无关的内部逻辑。但是当我来到DateField属性时,它会触发错误。我试图像这样设置它:

objPropValue := '12/02/2018 12:25:00';
objPropName := 'DateField';
if IsPublishedProp(parameterObject, objPropName) then
begin
  SetPropValue(parameterObject, objPropName, objPropValue); <- doesn't work on DateField
end;

这只是一个硬编码示例,objPropValueName在循环中设置,可以是任何其他类型。我也尝试了不同的格式,但我似乎无法找到正确的方法。

1 个答案:

答案 0 :(得分:1)

尽管出现错误消息,但您要在此处尝试将字符串分配给日期,而您无法做到。如果你做了这个

    objPropValue := '12/02/2018 12:25:00';
    objPropName := 'DateField';
    if IsPublishedProp(parameterObject, objPropName)  then
    begin
      SetPropValue(parameterObject, objPropName, StrToDateTime(objPropValue));
    end;

它会正常工作。当然,这仅仅是为了说明。如果objPropValue是一个变体(你不会显示),你可以使用

    objPropValue := StrToDateTime('12/02/2018 12:25:00');
    objPropName := 'DateField';
    if IsPublishedProp(parameterObject, objPropName)  then
    begin
      SetPropValue(parameterObject, objPropName, objPropValue);
    end;

代替。