- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我使用 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 进行任何不必要的隐式类型转换。
关于datetime - 通过 RTTI 将 TDateTime 值传递给 OleVariant 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52167446/
我的问题简而言之:TDateTime A (03.09.2014 13:40) - TDateTime B (03.09.2014 13:40) = -1 我有两个要比较的 TDateTime 值,首
我想将秒添加到 TDateTime 变量中,以便结果是分钟的顶部。例如,如果是 08:30:25,我想更改 TDateTime 变量来存储 08:31:00。 我看到 TDateTime 有一个 De
我正在执行一个长循环,下载数千个文件。我想显示估计的剩余时间,因为这可能需要几个小时。然而,根据我所写的内容,我得到了平均毫秒。如何将此平均下载时间从毫秒转换为 TDateTime? 看看我在哪里设置
Delphi 5 中是否有任何方法可以将字符串转换为 TDateTime,您可以在其中指定要使用的实际格式? 我正在开发一个作业处理器,它接受来自各个工作站的任务。这些任务有一系列参数,其中一些是日期
我正在使用 C++ Builder 并收到以下错误: [ILINK32 Error] Error: Unresolved external '__fastcall System::Internal::
我正在为 FMX TGrid 编写列和单元格类,它将在每个单元格中包含 TCalendarEdit 和 TTimeEdit 实例。除了正确处理这些子控件中所做的更改外,一切正常。 type TFM
似乎无法将 NULL 分配给 TDateTime 变量(“未分配值”)。 我想象的唯一方法是使用这样的东西: function isNull(aDate : TDateTime) : boolean;
正在寻找返回两个 TDateTime 值之间的秒差的代码示例。具体来说,我试图比较两个 TDateTime 值,如果大于第二个阈值,它将运行特定方法。 谢谢! 最佳答案 尝试SecondsBetwee
有没有办法检查Delphi是否TDateTime变量具有有效内容而不会捕获转换异常? 我编写了一个应用程序,必须解析数百个以原始 Delphi 记录形式编写的大文件,其中包含 TDateTime fi
我需要通过 AJAX 向 delphi 服务器发送一个日期,该服务器接受浮点格式的日期并设置 TDateTime 属性。 例如。 var date: TDateTime; begin da
我正在使用 C++ Builder 并有以下问题: 我想检测一个日期/时间是否晚于另一个日期/时间,以及晚了多少。 这是我当前的代码: TDateTime testFirstDate("11/09/2
我在将日期设置为 TDateTime 变量时遇到问题。 我已经试过了,没有运气: TDateTime Mine; Mine = ("12/05/1990"); 我该怎么做? 这段代码有什么问题: TD
我正在使用 C++ 开发预约系统。 能否请我帮忙将字符串转换为 TDateTime 变量。 这是一个我希望得到帮助的示例; TDateTime appDateTime(2012, 9, 15, 14,
我正在使用 C++ Builder,我需要一些帮助来查看两次是否相同。 这是我的代码: TDateTime appDateFromVector = TimeOf(appointmentsForFind
我正在使用 C++ 并使用 TDateTime 数据类型。 如何获取当前系统日期/时间并将其放入 TDateTime 变量? 最佳答案 正如 Jesse 提到的,您可以使用 Now() 函数(或静态
我正在使用 C++ Builder 并使用 TDateTime 数据类型创建 GUI 应用程序。 当我在 TDateTime 对象上使用 MonthOf() 方法时,我得到的值比 TDateTime
我正在尝试为 Tdatetime 编写一个函数(但是当我打开我的程序时,他必须显示现在的数据) 下面我有一个函数用于 TDatetime 但我有一个错误: ((((''DecodeDateTime(d
我有一个对象,它有一个值,但该值可以是 integer , string , boolean或TDateTime 。所以,它是 Variant . 我使用VarType()检查其类型,但自 VarTy
无论用户的本地时区设置为何,使用 Delphi 2007,我都需要确定东部时区的时间 (TDateTime)。 我怎样才能做到这一点?当然,需要了解夏令时。 最佳答案 如果我理解正确,您需要相当于当前
我需要将 TDateTime 转换为具有微秒精度的String。如果是毫秒精度,可以使用格式: DateTimeToString(Result, 'd.m.yyyy hh:nn:ss.zzz', da
我是一名优秀的程序员,十分优秀!