我真的很困惑我想做的(似乎很简单)是在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
并不意味着您应该这样做。如果您认为编写这样的自定义逻辑很容易,那么欢迎您使用自己的代码进行编写。