Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.17;
Скачать: CL | DM;

Вниз

В компоненте 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 вся ветка

Текущий архив: 2006.12.17;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.034 c
2-1164570646
UriyV
2006-11-26 22:50
2006.12.17
Требуется озвучивание *.xls или *.txt


15-1164786926
DelphiN!
2006-11-29 10:55
2006.12.17
Интересный момент при использовании ф-ии SetComputerName


2-1164873274
Храмой
2006-11-30 10:54
2006.12.17
Иконки в Delphi


2-1164654679
sat
2006-11-27 22:11
2006.12.17
передача информации между модулями


4-1154629515
ancara
2006-08-03 22:25
2006.12.17
определить момент подключения USB-накопителя