Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.044 c
15-1234953174
RDen
2009-02-18 13:32
2009.04.19
InnoSetup


15-1234722445
Гость
2009-02-15 21:27
2009.04.19
Вирус?


2-1235949145
WeX
2009-03-02 02:12
2009.04.19
Помогите с TTreeView


2-1236170803
VlGrig1961
2009-03-04 15:46
2009.04.19
Access violation at address... ??????


2-1235991728
ZiZiTop
2009-03-02 14:02
2009.04.19
Немного о звуке





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский