![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
![]() Всем добрый день
Весь и-нет нарыл ни где не нашел нормальной информации почему не получается сделать прокрутку для DBLookupcombobox Код:
procedure TCVForm.HandleMousewheel(var Msg: TMsg; var Handled: Boolean); begin case Msg.message of WM_MOUSEWHEEL: begin if (Screen.ActiveForm.ActiveControl <> nil) and (Screen.ActiveForm.ActiveControl.ClassName = 'TDBLookupComboBox') then begin Msg.message := WM_KEYDOWN; Msg.lParam := 0; if Msg.wParam > 0 then Msg.wParam := VK_UP else Msg.wParam := VK_DOWN; Handled := False; end; end; end; end; Код хороший - но есть один минус почему то Msg.wParam не получает значение ниже ноля и прокрутка работает только вверх Проверил что же творится в Msg.wParam оказалось когда прокручиваешь колесо мышки вверх значение Msg.wParam равно 7864320 и не меняется а когда крутишь колесо вниз 4287102976 Что это такое?? почему так?? - При поиске даже обнаружил такие ответы как Delphi давно имеет эту проблему с прокруткой DBLookupcombobox и до сих пор не решили Скажите плиз как вы справляетесь с такой проблемой?? чем заменить DBLookupcombobox???? есть ли альтернатива которая имеет возможность использовать прокрутку? Нет ничего не возможного. Вопрос только во времени... |
#2
|
||||
|
||||
![]() Слышал про дополнительный код? Про то, как хранятся в компьютере отрицательные числа? Переведи свои полученные 4 с гаком миллиарда в hex и увидишь, что это FF880000. Старший бит равен 1, значит число отрицательное и его "человеческое" значение - это 0x100000000 - 0xFF880000 = -7864320 (-0x00780000).
Что это за число? Читаем msdn (вернее, его перевод) Цитата:
Таким образом, берем старшую часть wParam и смотрим старший бит: Код:
if ((wParam shr 16) and 0x8000) = 0 then ; // > 0 // или эквивалент if (wParam and 0x80000000) = 0 then ; // > 0 Код:
if integer(wParam) < 0 then ... Почаще заглядывай в "недра" кода и внимательней читай доки. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 10.08.2014 в 00:48. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Electronic_Arts (10.08.2014)
|
#3
|
||||
|
||||
![]() Спасибо за наводку - сделал вот так и сработало...
Код:
procedure TCVForm.HandleMousewheel(var Msg: TMsg; var Handled: Boolean); var i : integer; s : string; begin case Msg.message of WM_MOUSEWHEEL: begin if (Screen.ActiveForm.ActiveControl <> nil) and (Screen.ActiveForm.ActiveControl.ClassName = 'TDBLookupComboBox') then begin Msg.message := WM_KEYDOWN; Msg.lParam := 0; s := '$' + inttohex(MSG.wParam, 1); i := StrToInt(s); if i > 0 then Msg.wParam := VK_UP else Msg.wParam := VK_DOWN; Handled := false; end; end; end; end; Нет ничего не возможного. Вопрос только во времени... |
#4
|
||||
|
||||
![]() Жесть.
Код:
s := '$' + inttohex(MSG.wParam, 1); i := StrToInt(s); StrToInt то же самое, только в обратную сторону (еще ~100 команд минимум). В то время как (wParam and $80000000) = 0 компилируется в одну команду. И integer(wParam) > 0 тоже. Лучше поподробней разберись с этими вариантами, чтобы не мучить комп бесполезными вычислениями. И вообще, в любом языке надо минимально пользоваться строками. Поскольку бинарные данные априори быстрее строк раз в 100 как минимум. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 10.08.2014 в 13:26. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Electronic_Arts (10.08.2014)
|
#5
|
||||
|
||||
![]() ![]() ![]() Нет ничего не возможного. Вопрос только во времени... |
#6
|
||||
|
||||
![]() Поменял эту часть кода
Код:
s := '$' + inttohex(MSG.wParam, 1); i := StrToInt(s); Код:
integer(wParam) > 0 и все.. Нет ничего не возможного. Вопрос только во времени... |