Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Глюк TDateTimePicker.OnChange


StriderMan ©   (2009-03-03 15:50:00) 

Если в обработчике TDateTimePicker.OnChange показать какую-нибудь формочку, даже ShowMessage

 procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin
 ShowMessage('туц туц');
end;


При открытии календаря и нажатии на стрелочку, переключающую месяц - начнется циклическое изменение месяцов и постоянный вызов события. бесконечный цикл.

Никто не сталкивался? Решение я придумал, но хотелось бы услышать мнение мастеров


StriderMan   (2009-03-04 13:16:00) [1]


> И, кстати, он мог его ещё из буфера обмена вставить. С неправильной
> по формату датой, например

неправильную дату разрулит сам DateTimePicker, а правильную см [13]


> clickmaker ©   (04.03.09 13:05) [14]
> если на форме несколько контролов, то валидацию можно вынести в отдельный код (любое событие, которое ведет к сохранению  данных).

да обычно так и делаю, просто остальные проверять не надо в данному случае.

Вообще это фильтр выборки на форме. Таблица небольшая поэтому работает он динамически без всяких кнопок "применить"


clickmaker   (2009-03-04 13:05:00) [2]

> [11] StriderMan   (04.03.09 12:51)

если на форме несколько контролов, то валидацию можно вынести в отдельный код (любое событие, которое ведет к сохранению данных).
Показывать можно либо в метках под самими контролами (красного цвета) - так юзер сразу увидит все места, где он лажанулся
либо в отдельном, типа validation summary, где-нибудь внизу формы.


Ega23   (2009-03-04 13:05:00) [3]


> А если юзер изменил дату вручную, с клавитуры? Ведь тогда
> CloseUp не произойдет, а проверять дату все равно нужно.


И, кстати, он мог его ещё из буфера обмена вставить. С неправильной по формату датой, например.


StriderMan   (2009-03-04 13:04:00) [4]


> Юрий Зотов ©   (04.03.09 13:01) [12]
> А если юзер изменил дату вручную, с клавитуры? Ведь тогда
> CloseUp не произойдет, а проверять дату все равно нужно.


На изменение обработчик остался, только в нем анализируется DroppedDown. Этот же обработчик висит и на CloseUp

procedure TfrmReserveInfo.DatesChange(Sender: TObject);
begin
 if (Sender as TDateTimePicker).DroppedDown then Exit;
 if (dtpEnd.Date - dtpBeg.Date < 30) or
    (IntShowMessageBox('Выбранный диапазон дат превышает 30 суток. Продолжить?', MB_ICONWARNING or MB_YESNO, 0) = IDYES) then
   ViewChange(Sender)
 else
   SetDefaultDates;
end;


Юрий Зотов   (2009-03-04 13:01:00) [5]

> StriderMan   (04.03.09 12:51) [11]
> собсвтенно вариант с CloseUp теперь так и действует.

А если юзер изменил дату вручную, с клавитуры? Ведь тогда CloseUp не произойдет, а проверять дату все равно нужно.


StriderMan   (2009-03-04 12:51:00) [6]


Медвежонок Пятачок ©   (04.03.09 11:51) [6]
> ты прикалываешься?
> сам повесил на ончейндж showmessage, и потом удивляешься,
>  что во время ончейнджа тебе showmessage вываливается?

Ты читать умеешь?
> При открытии календаря и нажатии на стрелочку, переключающую
> месяц - начнется циклическое изменение месяцов и постоянный
> вызов события. бесконечный цикл.



> Если да, то можно предположить примерно следующее. Через
> некоторую паузу после нажатия стрелочки начинает работать
> какой-то внутренний таймер контрола, по тикам которого переключается
> месяц (и, естественно, возникает OnChange). Таймер этот,
>  очевидно, будет тикать до тех пор, пока  не поступит сообщение
> о том, что стрелочку отпустили. А поскольку показано модальное
> окно, то такое сообщение не поступает (точнее, поступает,
>  но не обрабатывается). Соответственно, таймер продолжает
> тикать, переключая месяцы и этим вызывая OnChange.

Да, все так и происходит. Насчет глюк/неглюк можно конечно спорить, однако будь я тестировщиком, я бы завернул такую реализацию как ненадежную. Собственное мне тестеры этот баг и откопали :)


> Можно в OnChange при неверном значении ставить шрифт красным
> например, в контроле, где меняем значения...

Когда прям в контроле меняют - все хорошо :)


> Его не надо выдавать в OnChange, иначе Вы замучаете беднягу
> юзера. Его надо выдавать тогда, когда юзер УЖЕ установил
> дату ОКОНЧАТЕЛЬНО и перешел к ДРУГИМ действиям (например,
>  нажал кнопку OK, или переключил фокус ввода еще куда-то)

собсвтенно вариант с CloseUp теперь так и действует.


{RASkov}   (2009-03-04 12:23:00) [7]

Можно в OnChange при неверном значении ставить шрифт красным например, в контроле, где меняем значения...


Юрий Зотов   (2009-03-04 12:11:00) [8]

> StriderMan   (04.03.09 11:36) [5]

> Мне надо выдать предупреждение при определенных значениях даты

Его не надо выдавать в OnChange, иначе Вы замучаете беднягу юзера. Его надо выдавать тогда, когда юзер УЖЕустановил дату ОКОНЧАТЕЛЬНОи перешел к ДРУГИМдействиям (например, нажал кнопку OK, или переключил фокус ввода еще куда-то).

Обычно подобные проверки и выдача предупреждений делаются в обработчике нажатия кнопки ОК (если такая есть), либо в OnExit (если кнопки ОК нет).


Юрий Зотов   (2009-03-04 12:05:00) [9]

> StriderMan   (03.03.09 15:50)  

> При ... нажатии на стрелочку, переключающую месяц - начнется
> циклическое изменение месяцов

А если на эту стрелочку нажать и держать, не отпуская (и не обрабатывая никаких событий) - то тоже происходит циклическое изменение месяцев?

Если да, то можно предположить примерно следующее. Через некоторую паузу после нажатия стрелочки начинает работать какой-то внутренний таймер контрола, по тикам которого переключается месяц (и, естественно, возникает OnChange). Таймер этот, очевидно, будет тикать до тех пор, пока  не поступит сообщение о том, что стрелочку отпустили. А поскольку показано модальноеокно, то такое сообщение не поступает (точнее, поступает, но не обрабатывается). Соответственно, таймер продолжает тикать, переключая месяцы и этим вызывая OnChange.

Но если такое предположение верно (пусть даже не в деталях, а только в принципе), то это не глюк, а запланированное поведение контрола.


clickmaker   (2009-03-04 11:56:00) [10]

> Мне надо выдать предупреждение при определенных значениях
> даты

его можно выдавать не обязательно в ShowMessage


Медвежонок Пятачок   (2009-03-04 11:51:00) [11]

Удивляет такое странное поведение контрола.

ты прикалываешься?

сам повесил на ончейндж showmessage, и потом удивляешься, что во время ончейнджа тебе showmessage вываливается?


StriderMan   (2009-03-04 11:36:00) [12]


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

Мне надо выдать предупреждение при определенных значениях даты


> кроме ончейнджа есть еще онентер, онекзит, онклоуздаун и
> онкейдаун с кеем который иногда бывает VK_RETURN

Собственно я выкрутился таким образом что анализирую в обработчике свойство DroppedDown, Если оно тру, то ничего не делаю. Все действия потом совершаю в OnCloseUp.

Удивляет такое странное поведение контрола. Безобидный вобщем-то код вызывает Совершенно неадекватное поведение.

ЗЫ: зачем перенесли в "Начинающим"? Тут налицо суровый глюк стандартного компонента.


Медвежонок Пятачок   (2009-03-03 23:50:00) [13]

и еще.
кроме ончейнджа есть еще онентер, онекзит, онклоуздаун и онкейдаун с кеем который иногда бывает VK_RETURN


Медвежонок Пятачок   (2009-03-03 23:43:00) [14]

Это и было по делу.

а для тех кто в танке, встречный вопрос, зачем пихать в обработчик то, чего тебе мешает


StriderMan   (2009-03-03 23:05:00) [15]


> Медвежонок Пятачок ©   (03.03.09 23:01) [1]

а по делу?


Медвежонок Пятачок   (2009-03-03 23:01:00) [16]

ShowMessage это еще цветочки.
Ты прикинь, что будет, если туда вставить формат це


Наверх

Титульная страница Поиск, карта сайта Написать письмо