Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.04.2016, 17:09
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
По умолчанию Выделить определенные дни в календаре (MONTHCAL_CLASS)

Добрый день.
Не могу понять как реализовать.
В справке MSDN написано:
Код HTML:
#define BOLDDAY(ds, iDay) \ if (iDay > 0 && iDay < 32)(ds) |= (0x00000001 << (iDay - 1)) case WM_NOTIFY: if (((LPNMHDR)lParam)->code == MCN_GETDAYSTATE) { MONTHDAYSTATE rgMonths[12] = { 0 }; int cMonths = ((NMDAYSTATE*)lParam)->cDayState; for ( int i = 0; i < cMonths; i++) { BOLDDAY(rgMonths[i], 1); BOLDDAY(rgMonths[i], 15); } ((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;

Как правильно надо сделать?

Последний раз редактировалось Stalker2-42, 03.04.2016 в 19:33.
Ответить с цитированием
  #2  
Старый 03.04.2016, 17:44
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

используй событие OnGetMonthInfo у TMonthCalendar. пиши там:
Код:
procedure TForm1.MonthCalendar1GetMonthInfo(Sender: TObject;
  Month: Cardinal; var MonthBoldInfo: Cardinal);
begin
  MonthCalendar1.BoldDays([15], MonthBoldInfo);    
end;
если нужно на API см. как у TMonthCalendar реализовано.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 03.04.2016, 19:54
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
По умолчанию

Код:
TOnGetMonthInfoEvent = procedure(Sender: TObject; Month: LongWord;
    var MonthBoldInfo: LongWord) of object;

FOnGetMonthInfo: TOnGetMonthInfoEvent;

property OnGetMonthInfo: TOnGetMonthInfoEvent read FOnGetMonthInfo write FOnGetMonthInfo;


procedure TMonthCalendar.CNNotify(var Message: TWMNotify);
var
  ST: PSystemTime;
  I, MonthNo: Integer;
  CurState: PMonthDayState;
begin
  with Message, NMHdr^ do
  begin
    case code of
      MCN_GETDAYSTATE:
        with PNmDayState(NMHdr)^ do
        begin
          FillChar(prgDayState^, cDayState * SizeOf(TMonthDayState), 0);
          if Assigned(FOnGetMonthInfo) then
          begin
            CurState := prgDayState;
            for I := 0 to cDayState - 1 do
            begin
              MonthNo := stStart.wMonth + I;
              if MonthNo > 12 then MonthNo := MonthNo - 12;
              FOnGetMonthInfo(Self, MonthNo, CurState^);
              Inc(CurState);
            end;
          end;
        end;
    end;
  end;
  inherited;
end;

CurState возвращает год.
FOnGetMonthInfo =
procedure TForm1.MonthCalendar1GetMonthInfo(Sender: TObject; Month:
Код:
Cardinal; var MonthBoldInfo: Cardinal);
begin
  MonthCalendar1.BoldDays([15], MonthBoldInfo);    
end;

Я запутался.
Ответить с цитированием
  #4  
Старый 06.04.2016, 21:11
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
По умолчанию

Желающих подсказать нет?
Ответить с цитированием
  #5  
Старый 07.04.2016, 09:40
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

так второе сообщение прекрасно выделяет 15 число в каждом месяце!
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Stalker2-42 (08.04.2016)
  #6  
Старый 08.04.2016, 21:17
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
По умолчанию

NumLock.

Спасибо.

Вроде как работает.

Код:
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;

Караул. В delphi 2010 нет большей части сообщений (mcm_) описанных в MSDN.

Последний раз редактировалось Stalker2-42, 08.04.2016 в 23:14.
Ответить с цитированием
  #7  
Старый 10.04.2016, 08:05
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

ну не большей части, а немного не все. у Month Calendar Messages в MSDN примерно 32 сообщения, а в Delphi 7 примерно 23. в Delphi 2010 меньше быть не может.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:56.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter