我使用TDateTimePicker允许用户选择一天(手动或单击按钮前进或后退一天)。然后,用户将看到当天的日志条目。
这个控件工作得很好,但是我想将用户限制在最老的日期日志和今天的日志之间,因为这是有数据的日期限制。
我已经在MinDate和MaxDate上设置了TDateTimePicker,这很好。选择超出允许范围的日期不会有任何效果。
我的问题是,是否可以把无效的日期画成灰色的。在附图中,所选日期为01/04,今日为02/04。我想看到03/04 (及以后)残疾。理想情况下,就像你在图片中看到的"30“和"31”,这是三月的最后一天。
这个是可能的吗?如果相关的话,可以使用Delphi 7。

发布于 2015-04-02 17:05:09
TDateTimePicker是Win32 DTP控制的包装器,它不提供您想要的功能。没有自定义绘制下拉日历的选项,每天唯一可用的样式是普通和粗体。
发布于 2015-04-02 21:19:41
如前所述,注释中已经提到了,答案样式只有normal and bold可以使用。使用TYearBoldManager,您可以实现这一点。
只订于三月三十日、三十一日及四月一日、二日、三日及四日
测试: win XP/3上的Delphi5
minDate = 2015/03/30和maxDate = 2015/04/04
您可以用
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
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;https://stackoverflow.com/questions/29415232
复制相似问题