在TDateTimePicker中将无效日期显示为已禁用

时间:2015-04-02 14:18:07

标签: delphi tdatetimepicker

我正在使用TDateTimePicker来允许用户选择一天(手动或通过单击按钮前进或后退一天)。然后,用户将看到该特定日期的日志条目。

该控件效果很好,但我想将用户限制在[OLDEST-DAY-IN-LOG]和[TODAY]之间,因为这些是有数据的日期限制。

我已经在TDateTimePicker上设置了MinDate和MaxDate,并且工作正常。选择允许范围之外的日期不会做任何事情。

我的问题是是否可以将无效日期绘制成灰色。在随附的图像中,选择的日期是01/04,今天是02/04。我希望看到03/04(及更高版本)被禁用。理想情况下,就像" 30"和" 31"你在图片中看到的是三月的最后几天。

这可能吗?如果相关,请使用Delphi 7.

TDateTimePicker control in Delphi

2 个答案:

答案 0 :(得分:2)

TDateTimePicker是Win32 DTP control的包装器,它不提供您正在寻找的功能。没有自定义绘制下拉日历的选项,可用的唯一每日样式是普通粗体

答案 1 :(得分:1)

正如已经在评论和答案中提到的那样,只能使用样式normal and bold。使用TYearBoldManager,您可以实现它。

仅设定3月30,31和4月1,2,3,4

测试:在win XP / 3上的Delphi5

minDate = 2015/03/30maxDate = 2015/04/04

您可以使用

设置bold日期
procedure TForm1.FormCreate(Sender: TObject);
begin
   MonthCalendar1.CalColors.MonthBackColor :=  $6A7678;
   MonthCalendar1.CalColors.TextColor := $4D5858;

   FYearBoldManager := TYearBoldManager.Create;
   FYearBoldManager.MakeBold(3, 30);
   FYearBoldManager.MakeBold(3, 31);
   FYearBoldManager.MakeBold(4, 1);
   FYearBoldManager.MakeBold(4, 2);
   FYearBoldManager.MakeBold(4, 3);
   FYearBoldManager.MakeBold(4, 4);
   ...
end;

然后您应该更改颜色值以获得最佳对比度。这只是一个建议。

enter image description here

enter image description here

测试有4个文件here , MonthCalendarDemo

更新:

MonthCalendarDemo.dpr

program MonthCalendarDemo;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  UMonthBoldStorage in 'UMonthBoldStorage.pas';

{$R *.RES}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

看看UMonthBoldStorage.pas它是如何完成的。


这有什么区别?

enter image description here

专家已经认识到了这一点。

向右TDateTimePicker

左侧是TMonthCalendarTComboBox

优势:

  • 不需要min- maxDate
  • 可以days without logfile
  • 完全控制日历。
  • 大胆的日子很容易使用
  • 可以看到您点击的位置(查看25处的漂亮虚线边框。但对日历没有影响。)
  • 如果您点击错误的日期,则不会消失。(可以根据需要点击,只有双击大胆的日期,日历才会消失。这里:第20天和第22天)。

enter image description here

  • 可以在TComboBox内或down-arrow内点击,也可以在重点点击ENTER打开日历后,使用日志文件带您到最后一个日期。

enter image description here

enter image description here

  • 从那里你可以舒服地使用箭头键,那些带有日志文件的日子可以通过。

enter image description here

所有描述都可以通过几行附加代码来完成

procedure TForm1.MonthCalendar1DblClick(Sender: TObject);
var
   year, month, day : Word;
begin
    DecodeDate(MonthCalendar1.Date,Year, Month, Day);
    if FYearBoldManager.GetDayStatus(month, day) then begin
       if ValidDate then MonthCalendar1.Visible:=False;
    end;
end;

procedure TForm1.MonthCalendar1Click(Sender: TObject);
var
   year, month, day : Word;
begin
   DecodeDate(MonthCalendar1.Date,Year, Month, Day);
   if FYearBoldManager.GetDayStatus(month, day) then begin
      lastValidDate := MonthCalendar1.Date;
      ValidDate:=True;
   end else begin
      MonthCalendar1.Date := lastValidDate;
      ValidDate:=False;
   end;
end;

function TForm1.getComboBoxText(var validText:AnsiString):Boolean;
var
actText :AnsiString;

begin
    if ComboBox1.Text = '' then  actText := validText else actText := ComboBox1.Text;
    Try
    MonthCalendar1.Date :=  StrToDateTime(Copy(actText,1,10));
    if actText <> validText then validText := actText;
    lastValidDate := MonthCalendar1.Date;
    ValidDate:=True;
    Result := True;
    except
      Result := False;
    end;
end;

procedure TForm1.ComboBox1Click(Sender: TObject);
begin
     if getComboBoxText(validText) then MonthCalendar1.Visible:=True;
end;

procedure TForm1.ComboBox1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
     if getComboBoxText(validText) then MonthCalendar1.Visible:=True;
end;