【发布时间】:2015-10-06 17:23:41
【问题描述】:
我正在为 FMX TGrid 编写列和单元格类,它们将在每个单元格中包含 TCalendarEdit 和 TTimeEdit 实例。除了正确处理这些子控件中所做的更改外,一切正常。
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;
这个想法是通过TGridOnGetValue事件处理程序分配数据。显示日期和时间。捕获用户活动并设置Modified 标志。问题是即使没有任何用户活动,有时也会将此标志设置为 true。我怀疑这是由于 TDateTime 的时间部分四舍五入造成的。代码没有其他方式将值分配给FCalendarEdit.Date 和FTimeEdit.Time。
如何正确比较FCalendarEdit.Date 和FTimeEdit.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的比较只能通过这个函数来完成。
【问题讨论】:
-
好吧,如果
FDate_Time.FieldValue <> FCalendarEdit.Date + FTimeEdit.Time那么值真的发生了变化。除此之外,我无法弄清楚您的代码要做什么。 minimal reproducible example 会很好。也许您还需要进行更多调试,以便了解发生了什么。 -
TDateTime 是一个浮点(双精度)值。您可以使用
DateUtils.SameDateTime在一毫秒内查看它们是否相同,但如果它们是 MS 或更多,则它们不是相同的日期/时间值。您认为您需要为它们使用的准确度与数据库值相等吗? -
@David,谢谢,我已将问题本地化并附加了帖子。拜托,请看一看。
-
@Ken-White,谢谢,我已将代码更改为
SameDateTime并附加了帖子。请,请看一看。我只需要 1 分钟的精度。 -
@David,请随意对问题做任何您想做的事情。您以顶级 IT 专业人士的角度来评判人们,我因此而尊重您。但是这个论坛的大多数访问者都不是专业人士(至少不是在 IT 领域)。我们根本不明白您希望在这里提出什么样的问题。另一方面,您不明白其他人的想法可能与您不同。
标签: delphi datetime firemonkey