首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从TDateTimePicker读取日期和时间

如何从TDateTimePicker读取日期和时间
EN

Stack Overflow用户
提问于 2017-03-23 09:34:50
回答 4查看 20K关注 0票数 2

我真的很困惑。我想要做的(看起来很简单)是在一个TDateTimePicker中显示一个日期+时间,集成了日历,并且能够在它的值改变之后读取它。

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

由于TDateTimePicker不是TDateOrTimePicker,所以使用的TDateOrTimePicker有:

  • 类别: dtkDate (显示日历)
  • 格式:“dd/mm/yyyy:mm”

看上去不错,现在让我们读一读:

代码语言:javascript
复制
showmessage(DateTimeToStr(DateTimePicker1.Date)); 

只正确显示日期。没有考虑到hh:mm部件的变化。我总是得到默认值。然后我想:还有一个时间属性,也许我需要在2次内读取这个值。

代码语言:javascript
复制
 showmessage(DateTimeToStr(DateTimePicker1.Time));
 showmessage(DateTimeToStr(DateTimePicker1.Date));

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

但不,还是不起作用。将类别属性从dtkDate切换到dtkTime会擦除我在hh:mm部件上的输入。

我知道我实际上应该和两个TDateTimePickers一起工作:一个是约会,一个是时间。

所以我的问题是:

  • 有一个简单的方法来解决我的简单和非常常见的问题(一个真正的DateTimePicker)吗?

还有一个特尔斐设计问题:

  • 为什么有一个格式属性基本上是无用和误导性的?拥有一个TimeFormat、DateFormat和适当的格式验证过程并不难。

请注意,我发布这个问题主要是为了避免初学者做同样的调试器和挫折过程。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-03-23 16:11:21

我想要做的(看起来很简单)是在一个TDateTimePicker中显示一个日期+时间,集成了日历,并且能够在它的值改变之后读取它。 我想使用dd/MM/yyyy :mm格式

对不起,但你不能。TDateTimePicker设计为只处理日期或时间,而不是两者兼用。

如果将Kind属性设置为dtkDate,则可以指定自定义日期格式,但忽略任何时间格式,并且未定义使用Time属性。

如果将Kind属性设置为dtkTime,则可以指定自定义时间格式,但忽略任何日期格式,并且未定义使用Date属性。

读取Date属性时,仅值的日期部分有效。在一个完美的世界里,时间的部分将永远是零,但我看到它有时包含垃圾。但是,可以很容易地使用DateUtils.DateOf()函数忽略这一点:

代码语言:javascript
复制
Value := DateOf(DateTimePicker1.Date);

Time属性和值的日期部分也是一样的。您可以使用DateUtils.TimeOf()函数忽略任何潜在的垃圾:

代码语言:javascript
复制
Value := TimeOf(DateTimePicker1.Time);

有一个简单的方法来解决我的简单和非常常见的问题(一个真正的DateTimePicker)吗?

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

代码语言:javascript
复制
Value := DateOf(DateTimePicker1.Date) + TimeOf(DateTimePicker2.Time)

如果您想显示一个TDateTime,只需做相反的操作:

代码语言:javascript
复制
DateTimePicker1.Date := DateOf(Value);
DateTimePicker2.Time := TimeOf(Value);

否则,找一个第三方选择者(或者写你自己的)来支持你所需要的。

为什么有一个格式属性基本上是无用和误导性的?

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

拥有一个TimeFormat、DateFormat和适当的格式验证过程并不难。

TDateTimePicker只是一个Win32 日期和时间选择器控制的薄包装器,它没有这样的功能。当然,他们可以编写自定义逻辑,允许在保存了不同设置的Kind值之间进行切换,但这并不意味着要使用DTP控件。您只设置了一次Kind,一次Format,然后根据需要处理输入和输出。不能来回切换。仅仅因为您可以动态切换Kind并不意味着您应该这样做。如果您认为编写这样的自定义逻辑很容易,那么我们欢迎您在自己的代码中这样做。

票数 10
EN

Stack Overflow用户

发布于 2018-01-04 14:11:40

我也有同样的问题。安德烈解决方案的工作就像一个魅力感谢安德烈)。

问题:我们需要创建一个新的单元,创建一个新的组件,并将组件注册到另一个包中,以便能够在设计时设置表单。

解决方案:为了避免这种情况,只需在使用TDateTimePicker组件的表单中声明以下类: THackDateTimePicker

代码语言:javascript
复制
...
type
  // this class is just to access protected Caption property
  THackDateTimePicker = class(TDateTimePicker);

  TSymbolInfoForm = class(TForm)
  ...
end;

然后,只需实现以下OnChange事件:

代码语言:javascript
复制
procedure TSymbolInfoForm.dtpChange(Sender: TObject);
begin
   TDatetimePicker(Sender).Datetime := StrToDateTime(THackDateTimePicker(Sender).Caption);
end;

您可以将同一窗体上所有OnChange组件的所有TDateTimePicker事件链接到正常的OnChange事件.然后瞧!

票数 2
EN

Stack Overflow用户

发布于 2017-06-03 14:36:55

最近我也遇到了同样令人沮丧的问题。但是在我的例子中,我只需要从TDateTimePicker字段获得完整的日期和时间(不需要通过编程来设置它,但不会很困难)。因此,我所做的就是创建自己的TDateTimePicker,并创建一个新的公共属性,该属性获取字段标题并设置为DateTime (标题根据文档受到保护)。这是我的密码:

代码语言:javascript
复制
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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42972112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档