首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在TDateTimePicker中显示禁用的无效日期

在TDateTimePicker中显示禁用的无效日期
EN

Stack Overflow用户
提问于 2015-04-02 14:18:06
回答 2查看 1.5K关注 0票数 4

我使用TDateTimePicker允许用户选择一天(手动或单击按钮前进或后退一天)。然后,用户将看到当天的日志条目。

这个控件工作得很好,但是我想将用户限制在最老的日期日志和今天的日志之间,因为这是有数据的日期限制。

我已经在MinDate和MaxDate上设置了TDateTimePicker,这很好。选择超出允许范围的日期不会有任何效果。

我的问题是,是否可以把无效的日期画成灰色的。在附图中,所选日期为01/04,今日为02/04。我想看到03/04 (及以后)残疾。理想情况下,就像你在图片中看到的"30“和"31”,这是三月的最后一天。

这个是可能的吗?如果相关的话,可以使用Delphi 7。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-02 17:05:09

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

票数 2
EN

Stack Overflow用户

发布于 2015-04-02 21:19:41

如前所述,注释中已经提到了,答案样式只有normal and bold可以使用。使用TYearBoldManager,您可以实现这一点。

只订于三月三十日、三十一日及四月一日、二日、三日及四日

测试: win XP/3上的Delphi5

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

您可以用

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

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

要测试,有4个文件给你,MonthCalendarDemo

最新情况:

MonthCalendarDemo.dpr

代码语言:javascript
复制
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是怎么做的。

这里有什么区别?

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

向右TDateTimePicker

左边是TMonthCalendarTComboBox

优势:

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

  • 可以在TComboBox内部或down-arrow上单击,或者当焦点集中时,ENTER打开日历,并带您使用日志文件到最后一次约会。

  • 从那里,你可以舒适地用箭头键,有日志文件的日子的月份。

所有描述的都可以通过几行额外的代码来完成。

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29415232

复制
相关文章

相似问题

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