-
Добрый день. Не могу понять как реализовать. В справке MSDN написано:
#define BOLDDAY(ds, iDay) \
if (iDay > 0 && iDay < 32)(ds) |= (0x00000001 << (iDay - 1))
case WM_NOTIFY:
if (((LPNMHDR)lParam)->code == MCN_GETDAYSTATE)
;
int cMonths = ((NMDAYSTATE*)lParam)->cDayState;
for ( int i = 0; i < cMonths; i++)
((NMDAYSTATE*)lParam)->prgDayState = rgMonths;
return TRUE;
}
break ;
Переделал под Delphi. Установил стиль MCS_DAYSTATE. Во всех видимых(?) месяцах, должен быть выделено 15 число .Но не работает.
var
DayM : array [0..11] of MONTHDAYSTATE;
.......
procedure BoldDays(MonthBoldInfo: LongWord; Days: LongWord);
begin
if (Days > 0) and (Days < 32) then
MonthBoldInfo := ($00000001 shl (Days - 1));
end;
case PNMHdr(LParam).code of
MCN_GETDAYSTATE:
begin
cMonths := pnmdaystate(LParam).cDayState;
for I := 0 to cMonths do
begin
BoldDays(DayM[i], 15);
end;
pnmdaystate(LParam).prgDayState := @daym;
end;
Как правильно надо сделать?
-
(ds) |= (0x00000001 << (iDay - 1)) и > MonthBoldInfo := ($00000001 shl (Days - 1));
это не одно и то же ведь.
-
-
> 123 (05.04.16 20:36) [2]
вот это |= не эквивалент :=
-
А как тогда правильно?
-
> 123 (06.04.16 01:03) [4]
По твоей ссылке же написано a |= b это a = a | b
на Delphi будет: a := a or b;
-
Исправил
procedure BoldDays(ds, iDay: LongWord); begin if (iDay > 0) and (iDay < 32) then ds := ds or ($00000001 shl (iDay - 1)); end;
Но, не хочет выделить жирным дату. Что не так?
-
Эта процедура не эквивалент сишного кода. Сишный дефайн будет вставлен по месту как есть, твоя же функция не возвращает результатов своей работы вообще никак. Первый ее параметр надо передавать по ссылке var ds.
-
> DVM © (07.04.16 08:30) [7] > Эта процедура не эквивалент сишного кода. Сишный дефайн > будет вставлен по месту как есть, твоя же функция не возвращает > результатов своей работы вообще никак. > Первый ее параметр надо передавать по ссылке var ds.
Спасибо Вам ОГРОМНОЕ. Работает.
var DayM : array [1..12] of MONTHDAYSTATE; ......
procedure BoldDays(var ds: MONTHDAYSTATE; iDay: array of LongWord); var I : Integer; begin for I := Low(iDay) to High(iDay) do if (iDay[I] > 0) and (iDay[I] < 32) then ds := ds or ($00000001 shl (iDay[I] - 1)); end;
var cMonths : LongWord;
WM_NOTIFY: begin if PNMHdr(LParam).hwndFrom = Calendar then
begin case PNMHdr(LParam).code of MCN_GETDAYSTATE: begin cMonths := pnmdaystate(LParam).cDayState; for I := 1 to cMonths - 1 do BoldDays(DayM[i], [12 , 15, 16, 17, 18,29, 30, 31]); pnmdaystate(LParam).prgDayState := @daym; end; end; end;
end;
Может кому пригодится или сделает нормальный вариант.
-
Ха. Попытался сделать выделенные числа для каждого месяца индивидуально(от 1 до 12, т.е. январь = 1, февраль = 2 и т.д.). Размеры календаря позволяют просмотреть все 12 месяцев. Если смотреть с января, то все нормально.
Но когда прокручиваешь месяца вперед, получается так === евраль 1, март = 2, Если крутить дальше то === Апрель = 1, май 2 и т.д.
Не могу понять, как узнать индекс первого месяца отображаемого в календаре. Чтоб понятнее было , сейчас Апрель(4 месяц), а отображается он первым.
-
Караул. В delphi 2010 нет большей части сообщений (mcm_) описанных в MSDN.
-
> Караул. В delphi 2010 нет большей части сообщений (mcm_) > описанных в MSDN.
Ну так достань из SDK и пропиши в своем файле, в чем проблема.
-
Удалено модератором
|