Вверх ↑
Этот топик читают: Гость
Ответов: 2193
Рейтинг: 673
#16: 2018-05-25 14:19:54 ЛС | профиль | цитата
Еще лучше . Задал ты мне головоломку. 1-1 добавился, его выделение видно в последнем месяце (после 31 декабря 1 января выделено). Вот только в январе непонятные данные. Как они туда попадают мне пока не понятно.

А измени у себя код компонента:
1. Выдели компонент.
2. Нажми Ctr+F.
3. Найди 215 строку: начинается: WM_NOTIFY.
4. Добавь строку: FillChar(DayT, SizeOf(DayT), 0);//очистка массива
Должно получиться следующее:

{78}   WM_NOTIFY : begin
NMS := PNMSelChange(Msg.lParam);
case NMS.nmhdr.code of
MCN_GETDAYSTATE:
with PMDAYSTATE(Msg.LParam)^ do
begin
{вот это строка} FillChar(DayT, SizeOf(DayT), 0);//очистка массива
sm := stStart.wMonth;//предыдущий месяц с которого начат календарь
i := 0;

5. Сохрани: Ctr+S.

Проверь на последнем списке дат.
карма: 10

0
Ответов: 490
Рейтинг: 162
#17: 2018-05-25 14:33:30 ЛС | профиль | цитата
sla8a писал(а):
Проверь на последнем списке дат.

Сделал всё как по приведенной инструкции выше, но...
Скриншот не прикреплял, т.к. результат тотже (без измененийй)

--- Добавлено в 2018-05-25 14:40:47

Попробовал нажать 1 раз на стрелку смещения по месяцам (верхний левый угол)
календарь_002.png

Редактировалось 1 раз(а), последний 2018-05-25 14:40:47
карма: 4

0
Ответов: 2193
Рейтинг: 673
#18: 2018-05-25 14:43:53 ЛС | профиль | цитата
Удали добавленную строку, верни все как было.

--- Добавлено в 2018-05-25 15:05:51

Пока бред получается.

Есть у кого ещё win7 64b? Проверьте ошибку. На пустой проект бросьте компонент календарь, увеличьте его размер чтоб отображал 12 месяцев и запустите проект, будут ли в первом месяце выделенные дни?

--- Добавлено в 2018-05-25 15:19:04

tig-rrr, а поставьте эту строку: DayT[1] := $00000000;
Там же в WM_NOTIFY.
Должно получится вот так:
{78}   WM_NOTIFY : begin
NMS := PNMSelChange(Msg.lParam);
case NMS.nmhdr.code of
MCN_GETDAYSTATE:
with PMDAYSTATE(Msg.LParam)^ do
begin
sm := stStart.wMonth;//предыдущий месяц с которого начат календарь
i := 0;
while i < cDayState do//cDayState - количество отображаемых месяцев (+2 включая предыдущий и следующий)
begin
DayT[i] := fControl.DayM[sm];
inc(i);
inc(sm);
if sm = 13 then sm := 1;
end;
{вот эту строку} DayT[1] := $00000000;
prgDayState := Cardinal(@DayT);
end;
Это должно полностью обнулить выделенные даты в первом месяце календаря.

Редактировалось 4 раз(а), последний 2018-05-25 15:20:54
карма: 10

0
Ответов: 490
Рейтинг: 162
#19: 2018-05-25 15:45:44 ЛС | профиль | цитата
sla8a писал(а):
Это должно полностью обнулить выделенные даты в первом месяце календаря

Без изменений...
карма: 4

0
Ответов: 2193
Рейтинг: 673
#20: 2018-05-25 16:54:13 ЛС | профиль | цитата
Странно, очень странно. Может кто поможет разобраться, у меня не получается понять откуда ноги растут.
Получается следующее:
- Система запрашивает данные о выделенных днях в календаре:WM_NOTIFY: - MCN_GETDAYSTATE:.
- Нужно заполнить массив DayT (array [0..13] of LongWord) и показать его prgDayState.
- Массив DayT заполняется из заранее подготовленного массива DayМ (см. procedure THICalendar.SetDayState;).
- Массив DayT состоит из 14 чисел, для каждого отображенного месяца на календаре. К примеру если отображается с января по декабрь 2018 года, то 0 индекс это числа декабря 2017 кода, 1 - 12 индекс месяцы 2018 года, а 13 индекс январь 2019 года.
- По скриншоту от tig-rrr видно что, данные в массиве DayT в индексах 0 и 1 не те что выставляются.
Скриншот
- Очищаем 1 индекс (январь 2018 в нашем случае) DayT[1] := $00000000 перед prgDayState := Cardinal(@DayT) и получаем туже картину.
- Напрашивается вывод что вносятся изменения в массив (где? кем? когда?) после отработки кода.

sla8a писал(а):

Есть у кого ещё win7 64b? Проверьте ошибку. На пустой проект бросьте компонент календарь, увеличьте его размер чтоб отображал 12 месяцев и запустите проект, будут ли в первом месяце выделенные дни?


--- Добавлено в 2018-05-25 17:25:58

Проверил на win7 32b, так там неправильно отображаются месяца в индексами с 1 по 4. А у tig-rrr на win7 64b с 0 по 1.

--- Добавлено в 2018-05-25 17:50:59

tig-rrr, а попробуйте другим компилятором.
У меня на win7 32b в зависимости от компилятора: на fpc одни месяцы не правильно отображает, на "другом" другие. А на ХРюшке все нормально, на обоих компиляторах.

Редактировалось 7 раз(а), последний 2018-05-25 17:51:42
карма: 10

0
Ответов: 490
Рейтинг: 162
#21: 2018-05-25 21:49:02 ЛС | профиль | цитата
tig-rrr писал(а):
как исправить?

Для себя нашел решение данного вопроса.
Просто выбрав ЖИРНЫЙ шрифт.
календарь_ОК.png
карма: 4

0
Ответов: 2193
Рейтинг: 673
#22: 2018-05-25 22:23:57 ЛС | профиль | цитата
tig-rrr, а замените этот файл (pas) и попробуйте.
Архив с hiCalendar.pas
tig-rrr писал(а):
Просто выбрав ЖИРНЫЙ шрифт.
Это не решение проблемы.

Редактировалось 4 раз(а), последний 2018-05-25 22:27:02
карма: 10

0
файлы: 1hiCalendar.rar [3.8KB] [580]
Ответов: 490
Рейтинг: 162
#23: 2018-05-25 22:35:59 ЛС | профиль | цитата
sla8a писал(а):
а замените этот файл (pas) и попробуйте.

OK.png
УРА !!! ЗАРАБОТАЛО...
Обнаружился "БАГ" или "ФИЧА" кому как.
Календарь_002.png
Как пример алгоритм такой, после запуска выбираем январь 1 число, наводим на год января и выбираем на 1 меньше - получаем результат как на скриншоте.

Редактировалось 1 раз(а), последний 2018-05-25 23:22:31
карма: 4

0
Ответов: 2193
Рейтинг: 673
#24: 2018-05-26 01:17:38 ЛС | профиль | цитата
tig-rrr писал(а):
Обнаружился "БАГ" или "ФИЧА"
Да есть такое и на ХРюше. Нужно это исправить (если получится).
карма: 10

0
Ответов: 1
Рейтинг: 0
#25: 2018-05-29 13:37:22 ЛС | профиль | цитата
Решение с использованием стандартной компоненты
Ошибка возникает при переходе через год.
Если хотите чтобы этой проблемы не было нужно:
1. Создать объект наследник от TMonthCalendar
2. У наследника написать метод procedure CNNotify(var Message: TWMNotify); message CN_NOTIFY;
procedure <наследник>.CNNotify(var Message: TWMNotify);
var
I, MonthNo,YearNo: Integer;
CurState: PMonthDayState;
begin
inherited;//обязательно вначале если вы хотите выделять жирным необходимые дни
// иначе переменная CurState заполняется не для того года в предке!!
with Message, NMHdr^ do
begin
case code of
MCN_GETDAYSTATE:
with PNmDayState(NMHdr)^ do
begin
FillChar(prgDayState^, cDayState * SizeOf(TMonthDayState), 0);
CurState := prgDayState;
for I := 0 to cDayState - 1 do
begin
YearNo:=stStart.wYear ;
MonthNo := stStart.wMonth + I;
if MonthNo > 12 then
begin
MonthNo := MonthNo - 12;
YearNo:=stStart.wYear +1;
end;
<Вызов вашей процедуры с правильным годом>(YearNo, MonthNo, CurState^);
// передаваемые параметры
Inc(CurState);
end;

end;
end;
end;

3 Используйте этот объект для верной передачи года
4 Удобнее дописать событие вместо <Вызов вашей процедуры с правильным годом> и зарегистрировать этот объект как новый компонент в IDE

Редактировалось 2 раз(а), последний 2018-05-29 13:42:46
карма: 0

0
Ответов: 2193
Рейтинг: 673
#26: 2018-05-29 23:51:24 ЛС | профиль | цитата
ivans писал(а):
Вызов вашей процедуры с правильным годом
Вот о чем здесь речь? Что значит правильный год?
карма: 10

0
26
Сообщение
...
Прикрепленные файлы
(файлы не залиты)