Как уже упоминалось в комментариях и ответе только стили normal and bold
можно использовать. С TYearBoldManager
вы можете реализовать это.
только набор марта 30,31 и апреле 1,2,3,4
Испытано: Delphi5 на победу XP/3
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
Update:
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
Преимущество:
- Нет мин- MaxDate нужен
- может иметь
days without logfile
.
- полный контроль над календарем.
- смелые дни просты в использовании
- может видеть, где вы щелкнули (посмотрите на красивую пунктирную границу на
25
, но не влияет на календарь).
- не исчезает, если вы нажмете на неправильную дату. (Можете щелкнуть столько, сколько хотите, календарь исчезнет только при двойном щелчке по жирным дням. Здесь: дни 20 и 22).
- можно щелкнуть внутри
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;
MinDate и MaxDate установлены (указано в вопросе), и что работает. Когда пользователь выбирает 03/04, элемент управления не генерирует событие OnChange или CloseUp. Пометив недействительные даты, пользователь, по крайней мере, поймет, почему ничего не произошло. – AlainD
Используйте TMonthCalendar, и если вы используете xpmanifest, диапазон между min-max - это только видимые дни. –
@SertacAkyuz: Интересная идея использовать TMonthCalendar, никогда не использовала один из них раньше. Мой выбор даты небольшой и в верхней части формы, как выпадающий список. Кажется, что TMonthCalendar имеет (довольно большой) минимальный размер, что делает его непригодным для моего пользовательского интерфейса. Не удалось увидеть какие-либо свойства, чтобы изменить свой стиль, это можно сделать? – AlainD