|
И снова о скроллинге колесом мыши. MSFlexGrid
|
|||
---|---|---|---|
#18+
> Автор: Shocker.Pro > Ну это с точки зрения вызова. А с точки зрения функционирования в данном конкретном случае (то есть в пределах > моего приложения) есть какая-то разница? я думаю вызов функции, все-же "дешевле", чем отдаватся на милость виндовой службы сообщений, которая может быть и занята. В твоем случае сообщения как бумеранг, запустил, он полетал и вернулся, сколько он летает неизвестно. А вызов функции - это вызов функции. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2009, 14:44 |
|
И снова о скроллинге колесом мыши. MSFlexGrid
|
|||
---|---|---|---|
#18+
Shocker.ProИгорь Горбоноспринципиальная разница в том, что сообщения можно слать кому угодно, не только своим контролам и при этом задействуется внешний механизм передачи сообщений Windows, а вызывать функцию, можно только получив доступ в адресное пространство Ну это с точки зрения вызова. А с точки зрения функционирования в данном конкретном случае (то есть в пределах моего приложения) есть какая-то разница?Игорь видимо покурил сегодня что-то забористое SendMessage это отправка сообщения окну, а CallWindowProc это вызов обработчика оконных сообщений. FrmProc = CallWindowProc(lPrevWndProc, hwnd, uMsg, wParam, lParam) это вызов оригинального обрабатчика, который мы заменили своим FrmProc. Так как мы обрабатываем не все сообщения, то для нормального функционирования окна обязаны вызывать старый обработчик. А вообще на все вопросы типа "что такое %functionname%?" есть ответы в MSDN. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2009, 15:12 |
|
И снова о скроллинге колесом мыши. MSFlexGrid
|
|||
---|---|---|---|
#18+
> Автор: Antonariy > Игорь видимо покурил сегодня что-то забористое Если-бы, похоже сказалось "чемоданное настроение", таких сказок нарасказывал, аж сам поверил. Прошу прощения за заблуждения Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2009, 15:17 |
|
И снова о скроллинге колесом мыши. MSFlexGrid
|
|||
---|---|---|---|
#18+
AntonariyА вообще на все вопросы типа "что такое %functionname%?" есть ответы в MSDN. Ну больше-то вопросов возникает не о том, как работает функция, а о каких-то особенностях. AntonariySendMessage до него не доходит из-за проверки наличия PROP_PREVPROC. Наверное можно ее убрать в вашем случае. Ну тогда получается такая вот фиговина: Работают две оконных функции FormProc, для MDI-формы и для комбика. Работает как хотелось бы, за исключением одного сочетания: если фокус стоит на комбике, а мышь находится над формой (просто над любой формой), при попытке прокрутить колесо - вылетает "выполнило недопустимую операцию. То есть виновата команда SendMessage в обработчике для MDI - по идее сообщение должно быть отправлено форме, форма не содержит никаких прокруток, ничего не должно отрабатываться по идее, однако вот. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2009, 15:45 |
|
И снова о скроллинге колесом мыши. MSFlexGrid
|
|||
---|---|---|---|
#18+
В общем нужен пример, который повторяет этот глюк. Вы уже настолько творчески переработали и размазали первоначальный код по всему проекту, что без результата перед глазами я могу только гадать, что там происходит. Jah loves you. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2009, 17:54 |
|
И снова о скроллинге колесом мыши. MSFlexGrid
|
|||
---|---|---|---|
#18+
AntonariyВ общем нужен пример, который повторяет этот глюк. Вы уже настолько творчески переработали и размазали первоначальный код по всему проекту, что без результата перед глазами я могу только гадать, что там происходит. Да, вы правы, давно надо было вытащить все в отдельный проект. Занялся, заодно во многом разобрался, сейчас могу сформулировать свои желания предельно ясно. Но сначала немного философии. AntonariyА вообще на все вопросы типа "что такое %functionname%?" есть ответы в MSDN. Только не сочтите за упрек лично вам, это я просто сетую на свой неспециализм в API. Я давно заметил, что этим грешат практически все самоучители по языку (любому). Автор поясняет свои мысли примерами, но он часто не поясняет, что в примерах является встроенными в язык функциями/константами/операторами, а что он сам определил как захотела его левая нога, а не потому что есть какие-то требования. Ему-то очевидно, он легко читает код и не обращает внимания, а новичку, который еще на набил руку, зачастую это просто неясно и приходится тратить много времени/усилий, чтобы разобраться в этом, вместо того, чтобы изучать суть алгоритма. В данном конкретном случае до меня далеко не сразу дошло, что константы Public Const PROP_PREVPROC = "prevptr" Public Const PROP_GRIDPTR = "gridptr" Public Const PROP_DELTA = "delta" это не константы из API, которые требовалось определить именно так, чтобы правильно вызывать функции API, а произвольный код программиста..... Для меня это просто неочевидно, из-за неопытности, соответственно, я не смог сразу правильно врубиться в код, к тому же я впервые столкнулся с реальной работой с оконными сообщениями. Теперь по делу. Заставить скроллиться ГРИД - проблема понятная и решенная - ему только сообщение подай, так что про него пока не говорим. Есть более глобальная задача, которую хотелось бы решить в идеале именно в такой постановке. Задача: Заставить скроллиться во всех случаях то, над чем находится мышиный курсор, а не то, на чем стоит фокус (то есть так, как поступает genius-драйвер). Допущение: Приложение в варианте MDI. Решение: (вариант А) а) Перехватить оконные сообщения для всех элементов, которые имеют тенденцию к скроллу (это достаточно легко, так как контролы оформлены в виде юзерконтролов, а также есть централизованная система управления формами, которая может установить перехватчик при загрузке формы) , запретить им обрабатывать скролл стандартно и отправлять его на hwnd под курсором. б) Перехватить наиболее вышестоящее сообщение для тех, кто скролл не обрабатывает и отправить его опять же в hwnd под курсором. В данном случае на MDI-форме. Нехватка знаний возникает в п.б), а именно: если юзер пытается проскроллить элемент, который скролл не обрабатывает (например Child-форму), сообщение передается по цепочке наверх вплоть до обработчика MDI, та его перехватывает, определяет место под курсором, отправляет туда сообщение, получает его обратно по цепочке и так до переполнения стека. То есть ваше предложение убрать проверку "PROP_PREVPROC" не подходит. Пример проекта с этим глюком приложен к сообщению. Если курсор находится над списком (при этом неважно, где находится фокус) - скроллится список. Если курсор над формой - при попытке скролла падает. Проект надо компилировать и запускать экзешник , запуск под IDE при наличии перехвата оконных сообщений - бессмысленен. Каким-то образом нужно порвать порочную цепочку. Можно, конечно, попробовать поиграть с SetProp, GetProp, но я не знаю, насколько быстро будет это работать (в любом случае, не приветствуется вариант, который пожрет много ресурсов). Можно попробовать еще поставить перехват на все формы, но я не уверен, что не будет такого места, где переход по цепочке наверх пройдет мимо формы, ну как минимум, есть внутреннее подчиненное окно в самой MDI-форме. Может вы подскажете сходу более удобоваримый вариант. Возможно также, что существует "Вариант Б", который позволит управлять оконными сообщениями как-то извне. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2009, 21:18 |
|
И снова о скроллинге колесом мыши. MSFlexGrid
|
|||
---|---|---|---|
#18+
Shocker.ProМожно, конечно, попробовать поиграть с SetProp, GetProp, но я не знаю, насколько быстро будет это работать (в любом случае, не приветствуется вариант, который пожрет много ресурсов).Именно это и нужно делать применительно к пункту б. Перед отправкой сообщения проверяем наличие у окна под мышкой свойства, назовем его PROP_MSGSENT. Если его нет, устанавливаем и отправляем сообщение, если есть — снимаем и все. Таким образом сообщение сделает максимум две ходки — вопрос о скорости и ресурсоемкости отпадает автоматически. Jah loves you. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2009, 11:19 |
|
И снова о скроллинге колесом мыши. MSFlexGrid
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2009, 11:40 |
|
И снова о скроллинге колесом мыши. MSFlexGrid
|
|||
---|---|---|---|
#18+
AntonariyПеред отправкой сообщения проверяем наличие у окна под мышкой свойства, назовем его PROP_MSGSENT. Если его нет, устанавливаем и отправляем сообщение, если есть — снимаем и все. А не сможет случиться так, что между двумя возникновениями этого сообщения мышиный курсор сдвинется и вернет разное hwnd? AntonariyТаким образом сообщение сделает максимум две ходки — вопрос о скорости и ресурсоемкости отпадает автоматически. Ну тут вопрос только в скорости работы самой установки/проверки свойств окна - не тормознутая ли это функция. Я в свое время релизовывал одну функцию с обработкой On Error при обработке полей рекордсета, так как по условиям было неизвестно, есть поле с определенным названием в рекордсете или нет. Получилось очень тормозно. Усложнил функцию, добавив первичное составление карты полей, и анализ уже по карте, а не по самой коллекции Fields - получилось раз в сто быстрее. Потому есть фобии AntonariyКстати совсем не обязательно для каждой формы создавать отдельную процедуру. Это я понимаю . Просто делал разные функции для контролов и для MDI-формы для экспериментов. AntonariyК сообщению приложен файл (scroll2.zip - 5Kb) cкачать Не нашел отличий, это вы случайно приложили мой файл или не тот архив приложили? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2009, 12:16 |
|
И снова о скроллинге колесом мыши. MSFlexGrid
|
|||
---|---|---|---|
#18+
Не нашел отличий, это вы случайно приложили мой файл или не тот архив приложили?Упс, да. Jah loves you. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2009, 12:37 |
|
И снова о скроллинге колесом мыши. MSFlexGrid
|
|||
---|---|---|---|
#18+
А не сможет случиться так, что между двумя возникновениями этого сообщения мышиный курсор сдвинется и вернет разное hwnd?А вы попробуйте одновременно скроллить и елозить мышкой ;)) В любом случае сообщения отработаются раньше, чем курсор сдвинется хоть на пиксель. Я в свое время релизовывал одну функцию с обработкой On Error при обработке полей рекордсета, так как по условиям было неизвестно, есть поле с определенным названием в рекордсете или нет. Получилось очень тормозно.Обработка исключений это всегда очень тормозно, в цикле вообще недопустимо. Проверку чего-либо с помощью исключений нужно делать когда по-другому сделать невозможно. Jah loves you. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2009, 12:43 |
|
И снова о скроллинге колесом мыши. MSFlexGrid
|
|||
---|---|---|---|
#18+
AntonariyА вы попробуйте одновременно скроллить и елозить мышкой ;)) Jah loves you. Попробовал, жутко неудобно Хотя зачастую так и происходит но неосознанно ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2009, 12:54 |
|
И снова о скроллинге колесом мыши. MSFlexGrid
|
|||
---|---|---|---|
#18+
Игорь Горбонос Попробовал, жутко неудобно Хотя зачастую так и происходит но неосознанно Ну на крайняк, на каком-нить из hwnd зависнет признак PROP_MSGSENT и впоследствии будет пропущено одно событие WHELL. Это не страшно... ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2009, 13:04 |
|
И снова о скроллинге колесом мыши. MSFlexGrid
|
|||
---|---|---|---|
#18+
AntonariyКстати совсем не обязательно для каждой формы создавать отдельную процедуру Кстати, можно вообще объединить FrmProc и GridProc и сделать одну процедуру на все случаи жизни. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59.
Вопрос, а зачем уничтожать свойства при выгрузке окна RemoveProp hw, PROP_PREVPROC RemoveProp hw, PROP_GRIDPTR RemoveProp hw, PROP_DELTA RemoveProp hw, PROP_MSGSENT если окно все равно сейчас будет уничтожено? Мало того, ведь в VB есть возможность отменить выгрузку окна, а свойства уже будут стерты. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2009, 16:24 |
|
И снова о скроллинге колесом мыши. MSFlexGrid
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2009, 17:21 |
|
И снова о скроллинге колесом мыши. MSFlexGrid
|
|||
---|---|---|---|
#18+
Заодно универсальная процедура инициализации: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
ValIN - вспомогательная библиотечная функция Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
AntonariyMSND рекомендует. А как быть с отменой выгрузки? Переинициализировать в случае отмены выгрузки - громоздко. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2009, 17:25 |
|
И снова о скроллинге колесом мыши. MSFlexGrid
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2009, 18:23 |
|
И снова о скроллинге колесом мыши. MSFlexGrid
|
|||
---|---|---|---|
#18+
ValIn нужно переписать расово правильно: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2009, 18:27 |
|
И снова о скроллинге колесом мыши. MSFlexGrid
|
|||
---|---|---|---|
#18+
AntonariyValIn нужно переписать расово правильно Расово правильно - это на PERL-е. А так - просто грамотно. Я пришел со своей библиотекой на VB6 с Access 2.0 (под Win 3.1), кажется, там не было ParamArray... AntonariyВ смысле с отменой? WM_CLOSE происходит когда уже никакая отмена невозможна. Понял. Интегрирую код в рабочий проект. VB-шные контролы - сволочи поголовно. Даже CommandButton - сама не обрабатывает WHEEL и другим не дает. Получается, перехватывать оконные сообщения придется на всех контролах формы, на которых только может оказаться фокус. "Доктор, неаккуратненько как-то". Неужели нет возможности перехватить сообщение на уровне приложения? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2009, 18:40 |
|
И снова о скроллинге колесом мыши. MSFlexGrid
|
|||
---|---|---|---|
#18+
Shocker.Proсама не обрабатывает WHEEL и другим не дает. Я поторопился, сорри. На тестовом проекте работает, значит где-то у меня закралась ошибка ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2009, 18:53 |
|
И снова о скроллинге колесом мыши. MSFlexGrid
|
|||
---|---|---|---|
#18+
Shocker.ProAntonariyValIn нужно переписать расово правильно Расово правильно - это на PERL-е. А так - просто грамотно. Расово в смысле не по-индусски ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2009, 19:24 |
|
И снова о скроллинге колесом мыши. MSFlexGrid
|
|||
---|---|---|---|
#18+
Antonariy, В общем, все работает как я хотел, даже с драйвером Genius-a не дерется. Куда пиво слать? P.S. Можно продолжить тута: http://www.sql.ru/forum/actualthread.aspx?tid=708313 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2009, 20:01 |
|
И снова о скроллинге колесом мыши. MSFlexGrid
|
|||
---|---|---|---|
#18+
авторЯ пришел со своей библиотекой на VB6 с Access 2.0 (под Win 3.1) O_O Это же сколько лет оно работает? Jah loves you. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2009, 23:19 |
|
И снова о скроллинге колесом мыши. MSFlexGrid
|
|||
---|---|---|---|
#18+
AntonariyO_O Это же сколько лет оно работает? Начало проекта - 1996 год Access 2.0 В 2000-м портировано на VB6/JET В 2004-м на VB6/SQL Теперь думаю, как бы в .NET затолкать, да больно кода много ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2009, 00:50 |
|
И снова о скроллинге колесом мыши. MSFlexGrid
|
|||
---|---|---|---|
#18+
Antonariy, подскажите пожалуйста.. Использую Ваш код из второго сообщения (/topic/703320&pg=1&hl=addscroll2grids#7782886) Добавляю AddScroll2Grids Me в Form_Load. Скроллинг работает, но при закрытии приложения из IDE программа вылетает (ОС Windows 7, пробовал на соседнем компьютере из под WinXP - не вылетает): - Картинка - Текст ошибки:Visual BasicProblem signature: Problem Event Name:\tAPPCRASH Application Name:\tvb6.exe Application Version:\t6.0.81.76 Application Timestamp:\t3592011f Fault Module Name:\tVBA6.dll Fault Module Version:\t6.0.0.8169 Fault Module Timestamp:\t358b0c74 Exception Code:\tc0000027 Exception Offset:\t0017cb61 OS Version:\t6.1.7600.2.0.0.256.1 Locale ID:\t1049 Additional Information 1:\t84ee Additional Information 2:\t84eeb8916e43c4d31bca2602858ebb12 Additional Information 3:\t758a Additional Information 4:\t758a5b02d22b26008ceb531d98cca97f Read our privacy statement online: http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0409 If the online privacy statement is not available, please read our privacy statement offline: C:\\Windows\\system32\\en-US\\erofflps.txt ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2010, 10:47 |
|
|
start [/forum/topic.php?fid=60&msg=36758931&tid=2158974]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
42ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
others: | 334ms |
total: | 486ms |
0 / 0 |