gpt4 book ai didi

delphi - 如何避免 TDateTime 数据舍入

转载 作者:行者123 更新时间:2023-12-03 18:13:11 25 4
gpt4 key购买 nike

我正在为 FMX TGrid 编写列和单元格类,它将在每个单元格中包含 TCalendarEditTTimeEdit 实例。除了正确处理这些子控件中所做的更改外,一切正常。

type
TFMTValue<T> = record
FieldValue: T;
Modified: boolean;
Appended: boolean;
Deleted: boolean;
end;

TDateTimeCell = class(TStyledControl)
private
FDate_Time: TFMTValue<TDateTime>;
procedure SetDateTime(const Value: TFMTValue<TDateTime>);
function GetDateTime: TFMTValue<TDateTime>;
protected
procedure SetData(const Value: TValue); override;
public
property Date_Time: TFMTValue<TDateTime> read GetDateTime write SetDateTime;
...
end;
...
function TDateTimeCell.GetDateTime: TFMTValue<TDateTime>;
begin
FDate_Time.Modified := (FDate_Time.Modified) or
(FDate_Time.FieldValue <> FCalendarEdit.Date +
+ FTimeEdit.Time);
FDate_Time.FieldValue := FCalendarEdit.Date + FTimeEdit.Time;
Result := FDate_Time;
end;

procedure TDateTimeCell.SetData(const Value: TValue);
begin
Date_Time := Value.AsType<TFMTValue<TDateTime>>;
inherited SetData(TValue.From<TDateTime>(FDate_Time.FieldValue));
ApplyStyling;
end;

procedure TDateTimeCell.SetDateTime(const Value: TFMTValue<TDateTime>);
begin
FDate_Time := Value;
FCalendarEdit.Date := DateOf(FDate_Time.FieldValue);
FTimeEdit.Time := TimeOF(FDate_Time.FieldValue);
FDate_Time.FieldValue:=FCalendarEdit.Date + FTimeEdit.Time; //this line helps but not in all cases
end;

这个想法是通过 TGrid OnGetValue 事件处理程序分配数据。显示日期和时间。捕获用户事件并设置 Modified 标志。问题是即使没有任何用户事件,这个标志有时也会设置为 true。我怀疑这是由于 TDateTime 的时间部分四舍五入所致。代码没有其他方法将值分配给 FCalendarEdit.DateFTimeEdit.Time

如何正确比较存储在 FCalendarEdit.DateFTimeEdit.Time 中的数据与存储在 FDate_Time.FieldValue 中的数据?

附加

以这种方式设置标志并不能解决问题。

  FDate_Time.Modified := (FDate_Time.Modified) or
(DateOf(FDate_Time.FieldValue) <> FCalendarEdit.Date) or
(TimeOf(FDate_Time.FieldValue)<> FTimeEdit.Time);

附录 2. 根据 @Ken-White 的宝贵建议。如果我们将比较线替换为

FDate_Time.Modified := (FDate_Time.Modified) or
(not SameDateTime(FDate_Time.FieldValue,
FCalendarEdit.Date + FTimeEdit.Time));

它工作正常。因此,TDataTime 比较必须仅由该函数完成。

最佳答案

TDateTimeDouble 类型,这意味着它是一个浮点值,因此在不指定可接受的增量(差异)..

特别是对于 TDateTime 值,您可以使用 DateUtils.SameDateTime 来比较小于一毫秒的相等性:

FDate_Time.Modified := (FDate_Time.Modified) or
(not SameDateTime(FDate_Time.FieldValue,
FCalendarEdit.Date + FTimeEdit.Time));

关于delphi - 如何避免 TDateTime 数据舍入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32975902/

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