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

Вниз

Глюк TDateTimePicker.OnChange   Найти похожие ветки 

 
StriderMan   (2009-03-03 15:50) [0]

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

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


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

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


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

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


 
StriderMan   (2009-03-03 23:05) [2]


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

а по делу?


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

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

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


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

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


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


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

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


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

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

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

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


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

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

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

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


 
clickmaker ©   (2009-03-04 11:56) [7]

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

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


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

> StriderMan   (03.03.09 15:50)  

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

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

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

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


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

> StriderMan   (04.03.09 11:36) [5]

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

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

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


 
{RASkov} ©   (2009-03-04 12:23) [10]

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


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


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

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



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

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


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

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


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

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


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

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

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


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


> Юрий Зотов ©   (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;


 
clickmaker ©   (2009-03-04 13:05) [14]

> [11] StriderMan   (04.03.09 12:51)

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


 
Ega23 ©   (2009-03-04 13:05) [15]


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


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


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


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

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


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

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

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



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

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

Наверх




Память: 0.51 MB
Время: 0.019 c
15-1234722445
Гость
2009-02-15 21:27
2009.04.19
Вирус?


2-1235844626
walk
2009-02-28 21:10
2009.04.19
string потоком


15-1234906202
Юрий
2009-02-18 00:30
2009.04.19
С днем рождения ! 18 февраля 2009 среда


3-1217925347
Николай2008
2008-08-05 12:35
2009.04.19
SQL Server + копирование = connection string


2-1235393881
aha
2009-02-23 15:58
2009.04.19
как изобразить петлю гистерезиса , то есть такая задача