1

我需要用户选择日期格式(dd/mm/yyyy 或 dd mmmm yyyy 等),但显示这些选项只是令人困惑。我想要做的是让 TComboBox 项目充满“14/09/2012”、“2012 年 9 月 14 日”、“2012 年 9 月 14 日星期五”等,当用户选择其中一种日期格式时,组合框会得到文本“dd mmmm yyyy”或任何日期格式(尽管我仍然希望他们能够输入其他内容,例如“d/m/yy”)。

但是,我还没有找到一种简单的方法来做到这一点 - 除了带有 TSpeedButton 的 TEdit 之外,它会打开一个带有选择选项的表单,如果没有办法使用 TComboBox 执行此操作,这是我的第二选择。

问题:如何让 TComboBox 下拉菜单显示日期,但文本属性在选择日期时获取日期格式?

4

3 回答 3

4

ownerdraw TCombobox 怎么样?

procedure TForm16.cbLongDateFormatDrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  with Control as TComboBox do
  begin
    if not (odSelected in State) then
      Canvas.Brush.Color:=clWindow
    else
      Canvas.Brush.Color:=clHighlight;
    Canvas.FillRect(Rect);
    Canvas.TextOut(Rect.Left +2 , Rect.Top, FormatDateTime(cbLongDateFormat.Items[Index], Now));
  end;
end;

procedure TForm16.FormCreate(Sender: TObject);
begin
  cbLongDateFormat.Items.Add('ddddd');
  cbLongDateFormat.Items.Add('dddddd');
  cbLongDateFormat.Items.Add('dd/mm/yyyy');
  cbLongDateFormat.Items.Add('d mmmm yyyy');
end;

在此处输入图像描述

于 2012-09-14T03:47:40.993 回答
2

不可能通过 ComboBox 上的 OnChange 事件直接执行此操作,因为在 OnChange 事件之后,文本属性将设置回用户选择的任何内容。但是,我可以向表单发送消息以进行更改。

procedure TfINISettings.cbLongDateFormatChange(Sender: TObject);
begin
  PostMessage(Handle, WM_USER, 0, 0);
end;

并在表单界面中声明一个过程

procedure DateFormatComboBoxChange(var msg: TMessage); message WM_USER;

处理此消息,并在实现中

procedure TfINISettings.DateFormatComboBoxChange(var msg: TMessage);
begin
  if cbLongDateFormat.ItemIndex <> -1 then
    cbLongDateFormat.Text := DateFormats[cbLongDateFormat.ItemIndex];
end;

其中 DateFormats 是一个包含我的日期格式的 TStringList。FormCreate 方法如下所示

procedure TfINISettings.FormCreate(Sender: TObject);
var
  d: String;
begin
  DateFormats := TStringList.Create;
  DateFormats.Add('ddddd');
  DateFormats.Add('dddddd');
  DateFormats.Add('d mmmm yyyy');
  for d in DateFormats do
    cbLongDateFormat.Items.Add(FormatDateTime(d, now));
end;

欢迎提出改进建议。

于 2012-09-14T01:29:25.060 回答
1

将您的日期/时间格式字符串存储在单独TStringList的.TComboBox.OnChangeTComboBox.ItemIndexTStringListTComboBox.Text

于 2012-09-14T00:43:17.467 回答