Ets*_*liv 1 delphi datetime datetimepicker datetime-format delphi-xe7
我真的很困惑.我想做的事情(看起来很简单)是在TDateTimePicker中显示日期+时间,并集成日历,并且能够在其值发生变化后读取它.
我想使用dd/MM/yyyy hh:mm格式.
由于TDateTimePicker不是TDateOrTimePicker,因此使用的是:
看起来很好,现在让我们读一读:
showmessage(DateTimeToStr(DateTimePicker1.Date));
Run Code Online (Sandbox Code Playgroud)
仅正确显示日期.不考虑hh:mm部分的变化.我总是得到默认值.然后我想:还有一个Time属性,也许我需要读取2次的值.
showmessage(DateTimeToStr(DateTimePicker1.Time));
showmessage(DateTimeToStr(DateTimePicker1.Date));
Run Code Online (Sandbox Code Playgroud)
但我有与以前完全相同的输出(和问题).所以现在,让我们尝试将此Kind属性更改为dtkTime,然后读取时间,然后将其切换回dtkDate,然后读取日期.
但不,它仍然无效.将Kind属性从dtkDate切换到dtkTime会删除hh:mm部分的输入.
我知道我实际上应该使用2个TDateTimePickers:一个用于日期,一个用于时间.
所以我的问题是:
还有一个Delphi设计问题:
请注意,我发布这个问题主要是为了避免初学者做同样的调试和挫折的过程.
我想做的事情(看起来很简单)是在TDateTimePicker中显示日期+时间,并集成日历,并且能够在其值发生变化后读取它.
我想使用dd/MM/yyyy hh:mm格式
对不起,但你不能.A TDateTimePicker只能用于日期或时间,但不能同时使用.
如果将Kind属性设置为dtkDate,则可以指定自定义DATE格式,但忽略任何TIME格式,并且Time未定义使用该属性.
如果将Kind属性设置为dtkTime,则可以指定自定义TIME格式,但忽略任何DATE格式,并且Date未定义使用该属性.
读取Date属性时,只有值的DATE部分有效.在一个完美的世界中,TIME部分将始终为零,但我看到它有时会包含垃圾.但是,您可以使用以下DateUtils.DateOf()函数轻松忽略:
Value := DateOf(DateTimePicker1.Date);
Run Code Online (Sandbox Code Playgroud)
与Time属性和值的DATE部分相同.您可以使用该DateUtils.TimeOf()函数忽略任何潜在的垃圾:
Value := TimeOf(DateTimePicker1.Time);
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法来解决我的简单和非常常见的问题(一个真正的DateTimePicker)?
唯一真正的解决方案TDateTimePicker是使用两个独立的TDateTimePicker控件,一个用于日期,另一个用于日期.您可以在需要时将两个值组合在一起:
Value := DateOf(DateTimePicker1.Date) + TimeOf(DateTimePicker2.Time)
Run Code Online (Sandbox Code Playgroud)
如果你想显示一个TDateTime,只需反过来:
DateTimePicker1.Date := DateOf(Value);
DateTimePicker2.Time := TimeOf(Value);
Run Code Online (Sandbox Code Playgroud)
否则,找到支持您需要的第三方选择器(或编写自己的选择器).
为什么Format属性基本上没用且误导?
它没有用处和误导.它非常有用,但仅限于当前Kind设置的范围内.
拥有TimeFormat,DateFormat和正确的格式验证过程并不难.
TDateTimePicker它只是Win32 Date和Time Picker控件的一个瘦包装器,它没有这样的功能.当然,他们可以编写自定义逻辑,以允许在Kind保留不同设置的值之间切换,但这并不是真正意味着如何使用DTP控件.您可以根据需要设置Kind一次,Format一次,然后处理输入和输出.不来回切换.仅仅因为你可以Kind动态切换并不意味着你应该.如果您认为编写这样的自定义逻辑很容易,欢迎您使用自己的代码.