我正在使用TDateTimePicker来允许用户选择一天(手动或通过单击按钮前进或后退一天)。然后,用户将看到该特定日期的日志条目。
该控件效果很好,但我想将用户限制在[OLDEST-DAY-IN-LOG]和[TODAY]之间,因为这些是有数据的日期限制。
我已经在TDateTimePicker上设置了MinDate和MaxDate,并且工作正常。选择允许范围之外的日期不会做任何事情。
我的问题是是否可以将无效日期绘制成灰色。在随附的图像中,选择的日期是01/04,今天是02/04。我希望看到03/04(及更高版本)被禁用。理想情况下,就像" 30"和" 31"你在图片中看到的是三月的最后几天。
这可能吗?如果相关,请使用Delphi 7.
答案 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/30
和maxDate = 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;
然后您应该更改颜色值以获得最佳对比度。这只是一个建议。
测试有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
它是如何完成的。
这有什么区别?
专家已经认识到了这一点。
向右TDateTimePicker
左侧是TMonthCalendar
和TComboBox
优势:
days without logfile
。25
处的漂亮虚线边框。但对日历没有影响。)
TComboBox
内或down-arrow
内点击,也可以在重点点击ENTER
打开日历后,使用日志文件带您到最后一个日期。
所有描述都可以通过几行附加代码来完成
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;