我真的很困惑。我想要做的(看起来很简单)是在一个TDateTimePicker中显示一个日期+时间,集成了日历,并且能够在它的值改变之后读取它。
我想使用dd/MM/yyyy :mm格式。
由于TDateTimePicker不是TDateOrTimePicker,所以使用的TDateOrTimePicker有:
看上去不错,现在让我们读一读:
showmessage(DateTimeToStr(DateTimePicker1.Date)); 只正确显示日期。没有考虑到hh:mm部件的变化。我总是得到默认值。然后我想:还有一个时间属性,也许我需要在2次内读取这个值。
showmessage(DateTimeToStr(DateTimePicker1.Time));
showmessage(DateTimeToStr(DateTimePicker1.Date));但我的输出(和问题)和以前完全一样。现在,让我们尝试将这类属性更改为dtkTime,然后读取时间,然后将其切换回dtkDate,然后读取日期。
但不,还是不起作用。将类别属性从dtkDate切换到dtkTime会擦除我在hh:mm部件上的输入。
我知道我实际上应该和两个TDateTimePickers一起工作:一个是约会,一个是时间。
所以我的问题是:
还有一个特尔斐设计问题:
请注意,我发布这个问题主要是为了避免初学者做同样的调试器和挫折过程。
发布于 2017-03-23 16:11:21
我想要做的(看起来很简单)是在一个TDateTimePicker中显示一个日期+时间,集成了日历,并且能够在它的值改变之后读取它。 我想使用dd/MM/yyyy :mm格式
对不起,但你不能。TDateTimePicker设计为只处理日期或时间,而不是两者兼用。
如果将Kind属性设置为dtkDate,则可以指定自定义日期格式,但忽略任何时间格式,并且未定义使用Time属性。
如果将Kind属性设置为dtkTime,则可以指定自定义时间格式,但忽略任何日期格式,并且未定义使用Date属性。
读取Date属性时,仅值的日期部分有效。在一个完美的世界里,时间的部分将永远是零,但我看到它有时包含垃圾。但是,可以很容易地使用DateUtils.DateOf()函数忽略这一点:
Value := DateOf(DateTimePicker1.Date);Time属性和值的日期部分也是一样的。您可以使用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);否则,找一个第三方选择者(或者写你自己的)来支持你所需要的。
为什么有一个格式属性基本上是无用和误导性的?
这不是无用的,也不是误导的。它非常有用,但只在当前Kind设置的范围内。
拥有一个TimeFormat、DateFormat和适当的格式验证过程并不难。
TDateTimePicker只是一个Win32 日期和时间选择器控制的薄包装器,它没有这样的功能。当然,他们可以编写自定义逻辑,允许在保存了不同设置的Kind值之间进行切换,但这并不意味着要使用DTP控件。您只设置了一次Kind,一次Format,然后根据需要处理输入和输出。不能来回切换。仅仅因为您可以动态切换Kind并不意味着您应该这样做。如果您认为编写这样的自定义逻辑很容易,那么我们欢迎您在自己的代码中这样做。
发布于 2018-01-04 14:11:40
我也有同样的问题。安德烈解决方案的工作就像一个魅力感谢安德烈)。
问题:我们需要创建一个新的单元,创建一个新的组件,并将组件注册到另一个包中,以便能够在设计时设置表单。
解决方案:为了避免这种情况,只需在使用TDateTimePicker组件的表单中声明以下类: THackDateTimePicker
...
type
// this class is just to access protected Caption property
THackDateTimePicker = class(TDateTimePicker);
TSymbolInfoForm = class(TForm)
...
end;然后,只需实现以下OnChange事件:
procedure TSymbolInfoForm.dtpChange(Sender: TObject);
begin
TDatetimePicker(Sender).Datetime := StrToDateTime(THackDateTimePicker(Sender).Caption);
end;您可以将同一窗体上所有OnChange组件的所有TDateTimePicker事件链接到正常的OnChange事件.然后瞧!
发布于 2017-06-03 14:36:55
最近我也遇到了同样令人沮丧的问题。但是在我的例子中,我只需要从TDateTimePicker字段获得完整的日期和时间(不需要通过编程来设置它,但不会很困难)。因此,我所做的就是创建自己的TDateTimePicker,并创建一个新的公共属性,该属性获取字段标题并设置为DateTime (标题根据文档受到保护)。这是我的密码:
unit uZDateTimePicker;
interface
uses
Vcl.ComCtrls, SysUtils;
type
TZDateTimePicker = class(TDateTimePicker)
private
procedure SetDateAndTime;
protected
procedure Change; override;
end;
implementation
{ TZDateTimePicker }
procedure TZDateTimePicker.Change;
begin
SetDateAndTime
end;
procedure TZDateTimePicker.SetDateAndTime;
begin
DateTime := StrToDateTime(Caption);
inherited;
end;
end.就这么简单。
另外,如果您使用DevExpress组件,您将使用您想要的工作方式的TcxDateEdit。
https://stackoverflow.com/questions/42972112
复制相似问题