![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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 ... Почаще заглядывай в "недра" кода и внимательней читай доки. Последний раз редактировалось 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 как минимум. Последний раз редактировалось 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 и все.. |