gpt4 book ai didi

datetime - 通过 RTTI 将 TDateTime 值传递给 OleVariant 属性

转载 作者:行者123 更新时间:2023-12-02 16:57:14 25 4
gpt4 key购买 nike

当我使用 RTTI 将 TDateTime 值分配给对象的 OleVariant 属性时,对象将变为浮点值。

该对象的设计使得该属性可以变为 Null 或任何数据类型的值。如果它变成 float ,则结果应计算为 float 之差。如果它变成 TDateTime,则结果应计算为两个 TDateTime 值的差。

如果我直接将值传递给它,它会正常工作,但中间有 RTTI。

我知道 TDateTime 在内部表示为 float ,但是是否有可能准确接收我发送的数据类型?

请查看以下代码示例中的 tkVariant 案例:

class procedure TRTTI.SetObjPropValue(obj: TObject; rprop: TRttiProperty; value: OleVariant);
var
rtyp: TRttiType;
vt: TVarType;
begin
if obj = nil then Exit();
if (rprop <> nil) and (rprop.IsWritable) then begin
case rprop.PropertyType.TypeKind of
tkInteger, tkInt64:
begin
value := TVarConv.NullableCurr(value);
if VarIsNumeric(value) then rprop.SetValue(obj, TValue.FromVariant(Trunc(value)));
end;
tkFloat:
begin
if rprop.PropertyType.Name = 'TDateTime' then
value := TVarConv.NullableDateTime(value)
else
value := TVarConv.NullableFloat(value);
if not VarIsNull(value) then rprop.SetValue(obj, TValue.FromVariant(value));
end;
tkChar, tkString, tkWChar, tkLString, tkWString, tkUString:
begin
rprop.SetValue(obj, TValue.FromVariant(VarToStr(value)));
end;
tkEnumeration:
begin
if rprop.PropertyType.Name = 'Boolean' then
value := TVarConv.NullableBool(value)
else
value := null;
if not VarIsNull(value) then rprop.SetValue(obj, TValue.FromVariant(value));
end;
tkVariant:
//Here I transmit the TDateTime value
rprop.SetValue(obj, TValue.FromVariant(value));
//An object receives Float
end;
end;
end;

最佳答案

这里的问题是TValue.FromVariant正在内部“解包”传递的 Variant ,将基础值存储在 TValue 中。在你的情况下,它正确地注意到 TDateTime存储在Variant中并将其存储为 TDateTime .

当你通过TValue时包含TDateTime (TypeKind tkFloat )一直到 SetValue TRttiProperty的它转换为属性的类型 Variant - 请参阅System.Rtti.Conv2Variant 。此方法忽略了 tkFloat 的事实可以是TDateTime但只是简单地输入 Variant将 float 存储到结果中。

解决方案很简单:不要使用TValue.FromVariant但只是TValue.From<Variant>(value) 。这样,您就可以将 Variant 值存储在 TValue 中,并按原样传递它,而无需对 setter 进行任何不必要的隐式类型转换。

报告为https://quality.embarcadero.com/browse/RSP-21176

关于datetime - 通过 RTTI 将 TDateTime 值传递给 OleVariant 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52167446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com