Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2006.12.17;
Скачать: [xml.tar.bz2];

Вниз

В компоненте MHMonthCalendar не работает событие OnChange   Найти похожие ветки 

 
ElDev   (2006-02-12 19:34) [0]

Народ помогите в MHMonthCalendar не работает OnChange, а в аналогичном MHDateTimePicker всё нормально.

пр.

Calendar.OnChange := TOnEvent(MakeMethod(Calendar, @OnChange));


 
A_Vs   (2006-02-13 12:03) [1]

function WndProcMHMonthCalendar(Sender : PControl; var Msg:TMsg; var Rslt:Integer):Boolean;
var
 NMDC:PNMDateTimeChange;
 MHMonthCalendarNow:PMHMonthCalendar;
 Data: PMonthCalendarData;
begin
 Result := False;
 if Msg.message=WM_NOTIFY then
 begin
   NMDC:=PNMDateTimeChange(Msg.lParam);
   MHMonthCalendarNow:=PMHMonthCalendar(Sender);
   Data:=MHMonthCalendarNow.CustomData;
//   LogFileOutput("c:\LOG_F.txt",Int2str(NMDC.nmhdr.code));
   with Data^ do
   begin
     case NMDC.nmhdr.code of
       DTN_DATETIMECHANGE:
       begin
         if NMDC.dwFlags=GDT_VALID then
         begin
           SystemTime2DateTime(NMDC.st,FDateTime);
           if Assigned(MHMonthCalendarNow.OnChange) then
             MHMonthCalendarNow.OnChange(Sender);
           FChecked:=True;
           Result:=True;
         end;
         if NMDC.dwFlags=GDT_NONE then
           FChecked:=False;
       end;

       DTN_CLOSEUP:
       begin
         if Assigned(FOnCloseUp) then
           FOnCloseUp(Sender);
       end;

       DTN_DROPDOWN:
       begin
         if Assigned(FOnDropDown) then
           FOnDropDown(Sender);
       end;

       DTN_USERSTRING:
       begin
         if Assigned(FOnUserString) then
           FOnUserString(Sender);
       end;

       DTN_FORMAT:
       begin
         if Assigned(FOnFormat) then
           FOnFormat(Sender);
       end;

       DTN_FORMATQUERY:
       begin
         if Assigned(FOnFormatQuery) then
           FOnFormatQuery(Sender);
       end;
       -746:if Assigned(MHMonthCalendarNow.OnChange) then MHMonthCalendarNow.OnChange(Sender);
{Что такое -746 не выяснял, но так работает}
     end; //case
   end;
 end;

end;


 
ECM ©   (2006-02-13 13:27) [2]

Тут такая ситуация - MHMonthCalendar лежащий на kolnmck.ru похоже
недоделан... (видны торчащие и ненужные тут рудименты от взятого за снову - MHDateTimePicker)
Нотификации DTN_xxx в WndProcMHMonthCalendar ему не нужны вовсе (это всё для DateTimePicker)

-746  это MCN_SELECT  уведомление о выборе (именно для MonthCalendar).
Sent by a month calendar control when the user makes an explicit date selection within a month calendar control
Так что изменеие приведенное выше - действительно будет работать...

Я сел было доделывать MHMontCalendar - но в процессе решил сделать всё заново... доделаю - выложу на kolnmck.ru


 
ECM ©   (2006-02-17 12:24) [3]

http://www.kolnmck.ru/files/components/controls/kolmonthcalendar.zip
14 926 байт
Это первая версия ... но уже вполне рабочая... есть зеркало + пакэджи для D5,D6,D7 (но пока без демо) по тексту вставлены коментарии по формату xHelpGen...
Просьба обладателей D5 и D7 проверить у себя, если не затруднит


 
ECM ©   (2006-02-18 19:35) [4]

Фуф.. доделал. Теперь вроде всё...
http://www.kolnmck.ru/files/components/controls/kolmonthcalendar.zip
58 493 (+Зеркало +Демо)
скриншот для демо:
http://www.kolnmck.ru/files/components/controls/img/demomonthcalendar.png
:))


 
homm ©   (2006-02-18 19:56) [5]


> скриншот для демо:
Вах!


 
GMax   (2006-02-20 22:09) [6]

вот скриншот EXE-шника демы. просто распаковал и запустил.
http://www.terraspace.ru/gmax/mk1.gif
и скриншот попытки загрузки демы в дельфи7
http://www.terraspace.ru/gmax/mk2.gif

w2ksp4eng

даже не знаю что и смотреть...


 
ECM ©   (2006-02-20 22:48) [7]

Ok. Попробую завтра поставить - D7


 
GMax   (2006-02-21 09:54) [8]

дело скорее не в D7, а в w2ksp4
я ж написал, что просто запустил демку, не компилировал заново, а запустил из архива


 
avs ©   (2006-02-21 14:57) [9]

Уважаемый Евгений! Установил KolMonthCalendar D7 WinXP SP2.
Все работает, в смысле, события отрабатывыются, но при попытке
считать выбранное значение происходит следующее:

procedure TForm1.MonthCalendar1Change(Sender: PObj);
begin
dt2.Text:=Date2StrFmt("dd.MM.yyyy",MonthCalendar1.DateTime);
MonthCalendar1.Hide;
end;

(dt2 - KolEditbox)
имеем: MonthCalendar1.DateTime=-NAN

с увыжением AVS


 
ECM ©   (2006-02-21 15:15) [10]

Вообще-то надо так:

procedure TForm1.MonthCalendar1Change(Sender: PObj);
begin
 dt2.Text:=Date2StrFmt("dd.MM.yyyy",MonthCalendar1.Date);  
 MonthCalendar1.Hide;
end;

Я не поддержал уже имеющееся в TControl свойство DateTime (а возможно надо бы)


 
avs ©   (2006-02-21 15:18) [11]

Если  dt2.Text:=Date2StrFmt("dd.MM.yyyy",MonthCalendar1.Date); , то
MonthCalendar1.Date=0


 
ECM ©   (2006-02-21 15:29) [12]

Наверное у вас MultiSelect=TRUE
Почитайте коментарии:

   property Date:        TDateTime  index 0 read GetDateVal write SetDateVal;
   {* Sets the currently selected date for a month calendar control.
      If the specified date is not in view, the control updates the display
      to bring it into view. Apply to a month calendar control that NOT uses
      the MCS_MULTISELECT style}

Используйте в этом случае SelStart,SelEnd


 
avs ©   (2006-02-21 16:21) [13]

MultiSelect=False
SelStart,SelEnd тоже пользовал. Результат тот же.
Кроме того, если autosize=false, при запуске программы видна часть календарика в маленьком квадратике.
Видимо, с разбегу не получилось, но штука очень нужная.Хорошо бы еще сообразить рамку по границе окна.


 
ECM ©   (2006-02-21 16:39) [14]

Поправьте у себя в KOLMonthCalendar.pas

function TMonthCalendar.GetDateVal(const Index: Integer): TDateTime;
const
 Msg_Val: Array[0..1] of DWORD = (
   MCM_GETCURSEL,
   MCM_GETTODAY
 );
var
 ST: TSystemTime;
begin
 Perform(Msg_Val[Index],0,Integer(@ST));
 FillChar(ST.wHour,SizeOf(Word)*4,0);  
 SystemTime2DateTime(ST,Result);
end;

Я вечером выложу исправление...
По поводу размера - для AutoSize = false после бросания на форму
измените размеры мышкой - что бы в inc-файле появилась установка
размера (тоже поправлю)
Рамку можно сделать уже сейчас - просто поставьте нужный цвет рамки
в BackColor и поиграйте размерами - сами увидите...


 
GMax   (2006-02-21 19:39) [15]

таки что с W2k ?
попробовал на другой машине, там вроде error in user32.dll не проявился, но изображения всё равно нет


 
ECM ©   (2006-02-21 19:43) [16]


> таки что с W2k ?

Эффект имеет место быть ... разбираюсь. Проблема - негде поставить w2k.
:(


 
ECM ©   (2006-02-23 14:34) [17]

Исправил ситуацию с w2k и размерами после бросания на форму
версия 0.03 лежит там же:

http://www.kolnmck.ru/files/components/controls/kolmonthcalendar.zip


 
ECM ©   (2006-02-23 21:55) [18]


> Хорошо бы еще сообразить рамку по границе окна

Кстати тут есть тонкость - в разных версиях Windows календарь рисуется немного поразному (в W2K он шире чем в XP/W2K) поэтому рамку (при помощи BackColor) надо создавать примерно следующим образом :

procedure TForm1.KOLForm1FormCreate(Sender: PObj);
begin
...
 MonthCalendar1.AdjustSize;
 MonthCalendar1.SetSize(MonthCalendar1.Width+4,MonthCalendar1.Height+4);
end;

здесь будет создана рамка толщиной в 2 пикселя
т.е. есть неоднозначность - не факт что размер календаря установленный визуально в MCK будет совпадать с реальным, в разных версиях Windows
(но AdjustSize - работает везде)


 
GMax   (2006-02-23 22:08) [19]

спасибо, на этот раз вроде всё нормально.


 
ECM ©   (2006-02-24 14:41) [20]


> не факт что размер календаря установленный визуально в MCK
> будет совпадать с реальным, в разных версиях Windows

Вот есть такой недостаток... называется, кажется, - "косноязычие"
Думал про одно - а сказал про другое...:(
(Завидую Владимиру - у него кроме таланта к программированию еще и литературный талант есть ... физик и лирик в одном лице - прямо как братья АБС :)) )
Тут я имел ввиду что размер календаря подобранный визуально в МСК в определенной версии Windows, может не подойти для других - он в рамки заданые SetSize может просто не поместиться полностью...
:))


 
avs ©   (2006-02-27 11:43) [21]

Уважаемый Евгений! Утановил версию от 23.02.2006 (кстати, с прошедшим Вас праздником). Все бы хорошо, но не работает событие onMouseDblClk


 
avs ©   (2006-02-27 12:36) [22]

Уважаемый Евгений! Еще одно замечание. Хотелось бы, чтобы событие OnSelChange не отрабатывалось при изменении года и месяца.


 
ECM ©   (2006-02-27 16:41) [23]


> не работает событие onMouseDblClk

Поправил - см новую версию..
http://delphimaster.net/view/11-1140886672/


> чтобы событие OnSelChange не отрабатывалось при изменении
> года и месяца

Я думаю - это делать в самом компоненте - не нужно. Событие генерируется системой (кстати в VCL пользовательская обработка этого события отсутствует) - повлиять на то когда генерировать когда нет - это к дяде Билли... :)
Можно конечно поставить анализ на изменение даты... Но кто мешает Вам поставить такой анализ у себя в обработчике OnSelChange?
И смысл сего действа мне не совсем ясен...


 
avs ©   (2006-02-28 09:03) [24]

Cмысл сего действа смысл сего действа в следующем:
Пользователю захотелось полистать месяцы, годы и т.д. и отслеживать это до тех пор, пока ему что-то не понравидось, по-моему, смысла нет.
А вот, когда он выбрал конкретную дату, нужно ее считать. Так работает
DateTimePicker и так работает  
-746:if Assigned(MHMonthCalendarNow.OnChange) then MHMonthCalendarNow.OnChange
Может быть, есть смысл организовать OnChange по MCN_SELECT ?


 
ECM ©   (2006-02-28 16:29) [25]


> Пользователю захотелось полистать месяцы, годы и т.д. и
> отслеживать это до тех пор, пока ему что-то не понравидось,
>  по-моему, смысла нет.

Разумно... согласен...
Переделанная версия (0.05) лежит там же.. :)
Теперь OnSelChange - это реакция на MCN_SELCHANGE

Sent by a month calendar control when the currently selected date or range of dates changes.

OnChange - реакция на MCN_SELECT

Sent by a month calendar control when the user makes an explicit date selection within a month calendar control. This notification message is similar to MCN_SELCHANGE, but it is sent only in response to a user"s explicit date selections.


 
avs ©   (2006-02-28 16:58) [26]

Докладаю результаты испытания версии (0.05):

1. OnChange не видно в Object inspector

2. При компиляции имеем ругательство:

Result.MonthCalendar1.OnSelChange := Result.MonthCalendar1SelChange;

[Error] Unk1_1.inc(809): Incompatible types: "PControl" and "PObj"


 
ecm ©   (2006-02-28 17:45) [27]

Всё правильно - Вы не переустановили пакет.
1) Требуется переустановка пакета.
2) Откореектируйте объявление MonthCalendar1SelChange вручную (см. описание типа TOnSelChange) либо -  переименуйте и создайте обработчик заново...
:)


 
avs ©   (2006-03-01 08:52) [28]

Пардон, действительно не переустановил.
Но OnChange - реакция на MCN_SELECT нету.
Более того, я заглянул в исходники и следов OnChange не обнаружил....
Нашел реакцию на MCN_SELCHANGE или MCN_SELECT, отдельно MCN_SELECT не обрабатывается.


 
ecm ©   (2006-03-01 09:28) [29]

Вы неправы - всё есть, только вкралась очепятка, правда на логику работы это не повлияло (торопился - было мало времени, и не закоментировал лишню проверку - скопированной строки if). Вот код из 0.05:

function WndProcCalSelChange(Sender : PControl; var Msg:TMsg; var Rslt:Integer):Boolean;
var
 NMSC:PNMSelChange;
 SelRange: TDateRange;
 MCD: PMonthCalData;
 SS,SE: Cardinal;
begin
 Result := False;
 if Msg.message=WM_NOTIFY then
 begin
   NMSC := PNMSelChange(Msg.lParam);
   MCD := PMonthCalData(Sender.CustomData);
   with NMSC^,MCD^ do begin
     if {(nmhdr.code = MCN_SELECT) or }(nmhdr.code = MCN_SELCHANGE) then begin
       SystemTime2DateTime(stSelStart, SelRange.MinDate);
       SystemTime2DateTime(stSelEnd, SelRange.MaxDate);
       SS := Trunc(SelRange.MinDate); SE := Trunc(SelRange.MaxDate);
       if (SS <> fSelStart) or (SE <> fSelEnd) then begin
         fSelStart := SS; fSelEnd := SE;
         if Assigned(fOnSelChange) then fOnSelChange(Sender,SelRange.MinDate,SelRange.MaxDate);
       end;
       Result := TRUE;
     end else if (nmhdr.code = MCN_SELECT) or (nmhdr.code = MCN_SELCHANGE) then begin
       if Assigned(Sender.OnChange) then Sender.OnChange(Sender);
     end;
   end;
 end;
end;


В первом IF закоменнтирован MCN_SELECT, во втором надо было закоментировать MCN_SELCHANGE (я это поправлю) - но на логику это никак не повлияет - только уменьшит кол-во проверок и размер кода.


 
avs ©   (2006-03-01 10:54) [30]

Приношу свои извинения. Напутал с версиями. Предлагаю такой вариант:

function WndProcCalSelChange(Sender : PControl; var Msg:TMsg; var Rslt:Integer):Boolean;
var
 NMSC:PNMSelChange;
 SelRange: TDateRange;
 MCD: PMonthCalData;
 SS,SE: Cardinal;
begin
 result:=false;
 if Msg.message=WM_NOTIFY then
 begin
   Result:=true;
   NMSC := PNMSelChange(Msg.lParam);
   MCD := PMonthCalData(Sender.CustomData);
   with NMSC^,MCD^ do begin
     Case nmhdr.code of
     MCN_SELCHANGE: begin
                   SystemTime2DateTime(stSelStart, SelRange.MinDate);
                   SystemTime2DateTime(stSelEnd, SelRange.MaxDate);
                   SS := Trunc(SelRange.MinDate); SE := Trunc(SelRange.MaxDate);
                   if (SS <> fSelStart) or (SE <> fSelEnd) then begin
                   fSelStart := SS; fSelEnd := SE;
                   if Assigned(fOnSelChange) then fOnSelChange(Sender,SelRange.MinDate,SelRange.MaxDate);
                   end;
                   end;
    MCN_SELECT: if Assigned(Sender.OnChange) then Sender.OnChange(Sender);
    else result:=false;
    end;
   end;
 end;
end;


 
ecm ©   (2006-03-01 12:06) [31]

годится... :)



Страницы: 1 вся ветка

Форум: "KOL";
Текущий архив: 2006.12.17;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.046 c
2-1164620730
alex810
2006-11-27 12:45
2006.12.17
DBChart


15-1164397457
ZMan
2006-11-24 22:44
2006.12.17
Алгоритмы убирания шумов


15-1164379562
Колдун
2006-11-24 17:46
2006.12.17
Микросхема


15-1163240820
Sergey Masloff
2006-11-11 13:27
2006.12.17
Методики разработки в условиях нехватки ресурсов.


2-1164645290
Okey
2006-11-27 19:34
2006.12.17
String to PChar <>





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский