Клубове Дир.бг
powered by diri.bg
търси в Клубове diri.bg Разширено търсене

Вход
Име
Парола

Клубове
Dir.bg
Взаимопомощ
Горещи теми
Компютри и Интернет
Контакти
Култура и изкуство
Мнения
Наука
Политика, Свят
Спорт
Техника
Градове
Религия и мистика
Фен клубове
Хоби, Развлечения
Общества
Я, архивите са живи
Клубове Дирене Регистрация Кой е тук Въпроси Списък Купувам / Продавам 17:14 17.05.24 
Компютри и Интернет
   >> Delphi
Всички теми Следваща тема *Кратък преглед

Тема 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). Е това ми трябва на всяка цена...




Тема Re: 2 проблема с TMonthCalendarнови [re: naki]  
Автор andrew_nikoloff (минаващ)
Публикувано25.01.04 12:49



Ти така и не си разгледа май сорса... За какво го дават от Борланд, ако не за да го гледаме :)


TCommonCalendar = class(TWinControl)
...
public
...
procedure BoldDays(Days: array of LongWord; var MonthBoldInfo: LongWord);
end;


Толкожа по втория ти проблем. А по първия не можах да те разбера съвсем ясно. Искаш да не може да се сменя месеца, когато се кликне на дата от предишния/следващия месец ли? Ако е това - при показване на календара можеш да си установиш MinDate на 1-во число на месеца и MaxDate на последното и няма да се сменя.



Тема Re: 2 проблема с TMonthCalendarнови [re: andrew_nikoloff]  
Автор naki (DOS/Win32 guru)
Публикувано25.01.04 15:31



Да, ама не, както е казал Бочаров...
В 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 стават болд, НО - пак само в хандлера...

За първия проблем ще напиша след малко...




Тема Re: 2 проблема с TMonthCalendarнови [re: naki]  
Автор andrew_nikoloff (минаващ)
Публикувано25.01.04 16:19



Какво 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 и контролчето си се преначертава...




Всички темиСледваща тема*Кратък преглед
Клуб :  


Clubs.dir.bg е форум за дискусии. Dir.bg не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Dir.bg
За Забележки, коментари и предложения ползвайте формата за Обратна връзка | Мобилна версия | Потребителско споразумение
© 2006-2024 Dir.bg Всички права запазени.