【问题标题】:ISO 8601 string date picker (Delphi, DevExpress)ISO 8601 字符串日期选择器(Delphi、DevExpress)
【发布时间】:2012-05-29 02:55:38
【问题描述】:

我们的 Delphi 应用程序使用数据库绑定的 TcxGridDBColumns 让用户将 ISO 8601 格式的日期 (YYYY-MM-DD) 作为字符串进行操作。我想为最终用户提供一个基于日历的日期选择器。

TcxDateEditProperties 不能(直接)使用,因为底层数据库使用字符串字段。所以据我了解,我可以选择

  1. 在所有表中创建一个额外的日期列(TDateTime DB 字段),并在 TDataSet 的 BeforePost 事件上将日期转换为 ISO 8601 字符串列

  2. 创建自定义 Tcx***Properties 类。这可能涉及从TcxPopupEditProperties 继承。

由于有很多表受到影响,我宁愿使用#2。你能指出帮助我的文件吗?还是有#3?

【问题讨论】:

  • 你问DevEx support了吗?他们很有帮助。
  • 感谢您的意见,是的,他们一直很有帮助。

标签: delphi devexpress iso8601 tcxgrid


【解决方案1】:

如果您所说的文档是关于编写自定义组件的,那么您可以在此处查看Creating Custom Delphi Components,以及 Delphi 附带的文档“组件编写器指南”pdf(它有关于自定义 DBGrid 和导航月份的示例,年和日)。这可用于选项 2 的起点

【讨论】:

  • 我宁愿使用 DevExpress 的解决方案,因为我认为它会导致需要维护的代码行数最少。
【解决方案2】:

有一个#3:不需要额外的列,DateEdit 可以理解当前系统格式(其中用户更改被写回)和 ISO 格式的字符串。在 BeforePost 中,我将系统格式转换回数据库中所需的 ISO。作为额外的奢侈,以下事件将现有 ISO 日期更改为用户的默认日期格式:

procedure T_RVVorbereitung.cxGridAnalysisDateGetDataText(
  Sender: TcxCustomGridTableItem; ARecordIndex: Integer; var AText: string);
var
  ADate                                 : TDateTime;
begin
  try
    try
      ADate := TIso8601.DateTimeFromIso8601(AText);         // YYYY-MM-DD
    except
      ADate := StrToDate(AText);
    end;
    AText := DateToStr(ADate);
  except
    // neither system nor ISO date: show as it is
  end;
end;

【讨论】:

    猜你喜欢
    • 2021-01-17
    • 2011-12-21
    • 1970-01-01
    • 2012-11-22
    • 2021-03-17
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多