Форум: "Начинающим";
Текущий архив: 2009.04.19;
Скачать: [xml.tar.bz2];
ВнизГлюк 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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.042 c