我真的很困惑我想做的(似乎很简单)是在TDateTimePicker中显示日期和时间,并集成日历,并在其值更改后能够读取它。

我想使用dd / MM / yyyy hh:mm格式。

由于TDateTimePicker不是TDateOrTimePicker,因此请使用:


类型:dtkDate(显示日历)
格式:“ dd / MM / yyyy hh:mm”


看起来不错,现在让我们看一下:

showmessage(DateTimeToStr(DateTimePicker1.Date));


仅正确显示日期。没有考虑hh:mm部分的更改。我总是得到默认值。
然后我想:还有一个Time属性,也许我需要两次读取该值。

 showmessage(DateTimeToStr(DateTimePicker1.Time));
 showmessage(DateTimeToStr(DateTimePicker1.Date));


但是我有和以前完全一样的输出(和问题)。因此,现在,让我们尝试将此Kind属性更改为dtkTime,然后读取时间,然后将其切换回dtkDate,然后读取日期。

但是不,它仍然不起作用。将Kind属性从dtkDate切换到dtkTime会删除我在hh:mm部分的输入。



我知道我实际上应该使用2个TDateTimePickers:一个用于日期,一个用于时间。

所以我的问题是:


有没有一种简单的方法可以解决我的简单且非常常见的问题(
真正的DateTimePicker)?


还有一个Delphi的设计问题:


为什么会有一个基本上没有用的Format属性,
误导?具有TimeFormat,DateFormat和正确的格式
验证过程并不难。


请注意,我发布这个问题主要是为了避免初学者进行调试和挫折相同的工作。

最佳答案

我想做的(似乎很简单)是在TDateTimePicker中显示日期和时间,并集成日历,并在其值更改后能够读取它。

我想使用dd / MM / yyyy hh:mm格式


抱歉,您不能。 TDateTimePicker只能与日期或时间一起使用,而不能两者兼有。

如果将Kind属性设置为dtkDate,则可以指定自定义DATE格式,但是任何TIME格式都会被忽略,并且使用Time属性是不确定的。

如果将Kind属性设置为dtkTime,则可以指定自定义TIME格式,但是任何DATE格式都将被忽略,并且使用Date属性是未定义的。

读取Date属性时,只有该值的DATE部分有效。在理想情况下,TIME部分将始终为零,但是我看到它有时包含垃圾。但是,您可以使用DateUtils.DateOf()函数轻松忽略它:

Value := DateOf(DateTimePicker1.Date);


Time属性和值的DATE部分相同。您可以使用DateUtils.TimeOf()函数忽略任何潜在的垃圾:

Value := TimeOf(DateTimePicker1.Time);



有没有简单的方法来解决我的简单且非常常见的问题(真实的DateTimePicker)?


TDateTimePicker唯一真正的解决方案是使用两个单独的TDateTimePicker控件,一个控件用于日期,另一个控件用于时间。您可以在需要时将两个值组合在一起:

Value := DateOf(DateTimePicker1.Date) + TimeOf(DateTimePicker2.Time)


如果要显示TDateTime,请执行相反的操作:

DateTimePicker1.Date := DateOf(Value);
DateTimePicker2.Time := TimeOf(Value);


否则,请找到支持您需要的第三方选择器(或编写您自己的选择器)。


为什么会有一个Formatty属性,该属性基本上是无用的并且具有误导性?


这不是无用的和误导的。它非常有用,但仅在当前Kind设置的范围内。


具有TimeFormat,DateFormat和适当的格式验证过程并不难。


TDateTimePicker只是Win32 Date and Time Picker control的精简包装,后者没有这种功能。当然,他们可能已经编写了自定义逻辑,以允许在Kind值之间进行切换,同时保留了不同的设置,但这并不是DTP控件的真正用途。一次设置Kind,一次设置Format,然后根据需要处理输入和输出。没有来回切换。仅仅因为您可以动态切换Kind并不意味着您应该这样做。如果您认为编写这样的自定义逻辑很容易,那么欢迎您使用自己的代码进行编写。

07-24 19:37