如前所述,评论和答案中提到的只有样式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;
然后您应该更改颜色值以获得最佳对比度。这里只是一个建议。
![在此处输入图像描述](https://i.stack.imgur.com/vDVDS.jpg)
![在此处输入图像描述](https://i.stack.imgur.com/3KBS2.jpg)
测试这里有 4 个文件,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
它是怎么做的。
这里有什么区别?
![在此处输入图像描述](https://i.stack.imgur.com/uKtnb.jpg)
专家们已经认识到了。
向右TDateTimePicker
在左边 aTMonthCalendar
和 aTComboBox
优势:
- 不需要 min-maxDate
- 可以有
days without logfile
。
- 完全控制日历。
- 大胆的日子很容易使用
- 可以看到你点击的地方(看看漂亮的虚线边框
25
。但对日历没有影响)。
- 如果您点击错误的日期,则不会消失。(可以随意点击,日历只会在您双击粗体时消失。这里:第 20 天和第 22 天)。
![在此处输入图像描述](https://i.stack.imgur.com/u3iBM.jpg)
TComboBox
可以在或内单击down-arrow
或 焦点命中时ENTER
打开日历,并通过日志文件将您带到最后一个日期。
![在此处输入图像描述](https://i.stack.imgur.com/ept5p.jpg)
![在此处输入图像描述](https://i.stack.imgur.com/kbyMJ.jpg)
- 从那里您可以舒适地使用箭头键查看有日志文件的月份和日期。
![在此处输入图像描述](https://i.stack.imgur.com/zrfaT.jpg)
所有描述都可以通过几行附加代码来完成
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;