我真的很困惑。我想要做的(看起来很简单)是在 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 :一个用于日期,一个用于时间。
所以我的问题是:
- 有没有一种简单的方法可以解决我的简单且非常常见的问题(a 真正的日期时间选择器)?
还有一个Delphi设计问题:
- 为什么有一个基本没用的Format属性 误导?具有 TimeFormat、DateFormat 和正确的格式 验证过程并不难。
请注意,我发布这个问题主要是为了避免初学者进行同样漫长的调试过程和挫败感。
最佳答案
What I want to do (seems pretty simple) is to display a date + time in a TDateTimePicker, with the calendar integrated, and be able to read it after its value has changed.
I'd like to use the dd/MM/yyyy hh:mm format
抱歉,你不能。 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);
Is there an easy way to solve my simple and very common problem (a real DateTimePicker) ?
TDateTimePicker 的唯一真正解决方案是使用两个单独的 TDateTimePicker 控件,一个用于日期,另一个用于时间。您可以在需要时将这两个值组合在一起:
Value := DateOf(DateTimePicker1.Date) + TimeOf(DateTimePicker2.Time)
如果您想显示TDateTime
,只需执行相反的操作:
DateTimePicker1.Date := DateOf(Value);
DateTimePicker2.Time := TimeOf(Value);
否则,请找到支持您需要的第三方选择器(或编写您自己的选择器)。
Why is there a Format property that is basically useless and misleading ?
它并非无用且具有误导性。它非常有用,但仅限于当前 Kind
设置的范围内。
Having a TimeFormat, DateFormat, and proper format validation process isn't that hard.
TDateTimePicker
只是 Win32 Date and Time Picker control 的薄包装器,它没有这样的功能。当然,他们可以编写自定义逻辑来允许在保留不同设置的Kind
值之间进行切换,但这并不是DTP控件的真正用途。您设置一次Kind
,一次Format
,然后根据需要处理输入和输出。无需来回切换。仅仅因为您可以动态切换Kind
并不意味着您应该。如果您认为编写此类自定义逻辑很容易,欢迎您用自己的代码来完成。
关于delphi - 如何从 TDateTimePicker 读取日期和时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42972112/