|
Тема
|
2 проблема с TMonthCalendar
|
|
Автор |
naki (DOS/Win32 guru) |
Публикувано | 24.01.04 22:32 |
|
Здравейте, имам 2 големи проблема със този контрол.
1) Как да разбера кога потребителя натиска < >(стрелките) за преден и следващ месец?
Проблема идва оттам, че при смяна на месеца се генерира Click събитие, което искам да избегна.
(Идеята е някои дати да са bold, и при Click върху дата, която е болд да стане с обикновен шрифт, а ако е с обикновен шрифт да стане болд).
Кофтито е, че може да се натисне дата от предния месец (защото контрола показва цели седмици) или следващия месец и тогава също се сменя месеца, но Click-a се зачита (защото е кликната дата).
Ако няма начин, мога да променя да се болдва избраната дата примерно със Popup menu.
2) Как да опресня контрола, когато искам да bold/unbold някоя дата? (Във Visual Basic това е елементарно mc1.DateBold(data)=True/False. Тука обаче е със GetMonthInfo). Е това ми трябва на всяка цена...
| |
|
Ти така и не си разгледа май сорса... За какво го дават от Борланд, ако не за да го гледаме :)
TCommonCalendar = class(TWinControl)
...
public
...
procedure BoldDays(Days: array of LongWord; var MonthBoldInfo: LongWord);
end;
Толкожа по втория ти проблем. А по първия не можах да те разбера съвсем ясно. Искаш да не може да се сменя месеца, когато се кликне на дата от предишния/следващия месец ли? Ако е това - при показване на календара можеш да си установиш MinDate на 1-во число на месеца и MaxDate на последното и няма да се сменя.
| |
|
Да, ама не, както е казал Бочаров...
В Help-a пише (не гледам сорса ама гледам Help-а :)), че
Use BoldDays to encode the days of the current month that should appear in bold. The value returned by BoldDays can be assigned to the MonthBoldInfo parameter of an OnGetMonthInfo event handler. (Тоест бачка само във handlera).
Това е много глупаво от тяхна страна, защото и както казват те, ПАК НЕ СТАВА!
The value returned
Какво value returned бе джанъм, функцията е void!
Предлагат следния код да се сложи във хандлера:
unsigned bolddays[2] = {1,2};
MonthCalendar1->BoldDays(bolddays,1,MonthBoldInfo);
(даже го дават без MonthCalendar1 отпред както пък СЪВСЕМ не може да тръгне програмата)
Добре ама Билдера дава
[C++ Warning] Unit1.cpp(29): W8030 Temporary used for parameter 'MonthBoldInfo' in call to '_fastcall TCommonCalendar::BoldDays(const unsigned int *,const int,unsigned int &)'
Брех защо да е временно?
Имаме
MonthCalendar1GetMonthInfo(TObject *Sender,DWORD Month, DWORD &MonthBoldInfo)
Защо не става не става ясно...
При това хандлера не бачка хич, нито една дата не е болд!
Като направя просто присвояване, без никакви масиви и функции:
MonthBoldInfo=1+2+8;
бачка - дати 1,2,4 стават болд, НО - пак само в хандлера...
За първия проблем ще напиша след малко...
| |
|
Какво value returned бе джанъм, функцията е void!
Забележи малката трибуквена думичка в декларацията на процедурата. Нямам C++ Builder тука да ти изкарам декларацията на C, но могада ти кажа, че вторият параметър ще е указател. А сега си помисли пак можеш ли да върнеш резултат от void функция или не можеш...
procedure BoldDays(Days: array of LongWord; var MonthBoldInfo: LongWord);
Всъщност в твоя постинг го има:
_fastcall TCommonCalendar::BoldDays(const unsigned int *,const int,unsigned int &)
А иначе BoldDays всъщност само прекодира масива в необходимия формат за MonthBoldInfo. Което можеш вече директно да си присвоиш в хендлъра.
А иначе за да го накараш да се пречертате (Оби Уан беше казал "Use the source, Luke! Use the source!" Или май не беше съвсем така?!) поглеждаме в сорса и виждаме от къде се вика нашия хендлър...
procedure CNNotify(var Message: TWMNotify); message CN_NOTIFY;
...
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;
...
Значи правиш си каквото правиш, след което си пращаш подходящия message (CN_NOTIFY) с подходящо попълнена структура TWMNotify и контролчето си се преначертава...
| |
|
|
|
|