|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
MrShin, помаргивание в VBA это не из-за таймера, а из-за уставновленного фильтра(hook) сообщений функцией SetWindowsHookEx. Это происходит только тогда, когда открыта хотя бы одна форма, подписанная на события класса FormScrollBars. Т.е. установлен hook (Hook <> 0): Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
Когда формы, за прокруткой которых нужно следить, закрыты, то hook снимается. вообще, если делать по хорошему, то значение Hook лучше хранить в TempVars. Тогда оно никогда не потеряется при сбросе переменных. Преимущество SetWindowsHookEx перед субклассингом в том, что Access пропускает через себя не все подряд сист.сообщения, а только их часть, здесь - только те из них, которые определяются константой WH_MOUSE_LL ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2017, 15:14 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
MrShinПо субклассингу, я смотрю, на Стэке тоже на смогли помочь. да, причем, любопытно, чем закончилось обсуждение на Social.msdn: https://social.msdn.microsoft.com/Forums/office/en-US/4cf1d113-d905-4cdf-9f82-eb2c8d3666ed/setwindowlong-on-a-ms-access-form-what-happens-if-ide-window-is-open?forum=accessdev Оказалось, что закрыть окно среды VBE невозможно. По клику на "крестик" окна VBE, Access просто скрывает это окно, но не закрывает. А при закрытии этого окна силой через API, кроме окна VBE закрывается также основное окно Access. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2017, 16:56 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
Вакшуль СергейGVOV, заметил три шероховатости: 1. Если сделать двойной клик по стрелке гор.полосы прокрутки, то вместо ожидаемых смещений на ширину двух столбцов, происходит смещение только на один столбец. 2. Станьте в поле(значение 6129). Нажмите TAB. Что произошло со значением в поле, куда перешел фокус? Нажмите TAB снова. Опять фокусы. 3. Станьте в итоговое поле(значение 97). Кликните по стрелке гор.полосы прокрутки вправо. Посмотрите, что произошло с итогом по столбцу "Сумма". Сделайте еще пару кликов по стрелке. Итог по "Сумма" отображается некорректно. Я правильно понял, что ваша цель - создание горизонтальных и вертикальных(несмещаемых) итогов? Да, в примере я допустил несколько неточностей в поведении табличных полей. Результирующие поля должны быть заблокированы (спасибо за замечание). Двойное нажатие на полосе прокрутки я так понял не обрабатывается, но это не критично, потому что скрытых полей будет не много и их отображать будет легче дёргая полосу прокрутки или просто табом (стрелкой вправо-лево) стоя в таблице. Исправил поведение полей. Как будто сейчас всё работает отлично, но вот с полосой прокрутки (придание вида) так и не разобрался. Двигать полосу прокрутки скрытой подформы научился, а вот обратно, двигать синхронно форму нет (Если бы научиться отлавливать уход полей с фокусом из видимой области то было бы самое то) Да, основная задача создание горизонтальных и вертикальных итогов которые будут корректно смещатся (особенно по горизонтали). ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2017, 18:19 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
MrShinМой вопрос именно в том, как сгенерировать событие ..., в идеале еще от изменения размеров/положения колонок табличной формы. кстати, а этот вопрос можно решить и без SetWindowsHookEx. Собственно событие это - Form_MouseUp. На нем все и ловится. Проблемный момент в том, что ловится то оно ловится, но только в том случае, если клавиша мыши отпускается вверх в момент, когда курсор мыши находится в зоне заголовков столбцов. Если же переместить мышь в другую зону(выше или ниже заголовков) и отпустить, то событие не произойдет. Идею, как с этим справится мне подсказал Андрей Митин ... в 2002-ом :) Функции пересчета координат тоже его. Идея в том, что зона перемещения курсора ограничивается с помощью функции API ClipCursor. Т.е. пока нажата и не отпущена левая клавиша траектория перемещения курсора замыкается в том пространстве, где гарантированно произойдет нужное нам событие Form_MouseUp, т.е. в зоне заголовков столбцов. Я на очень скорую руку надергал фрагменты из старого примера для демонстрации. См.вложение. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 01:18 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
GVOV, вы выложили пример в mdb. У вас и рабочая база тоже в mdb? Под какую версию Access разрабатываете? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 02:10 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
Вакшуль СергейGVOV, вы выложили пример в mdb. У вас и рабочая база тоже в mdb? Под какую версию Access разрабатываете? Нет, рабочая программа в mde, упакованная в sfx архив. Это только пример в mdb для удобства. Разрабатываю под 2003 Access ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2017, 02:45 |
|
Ээмуляция табличной формы
|
|||
---|---|---|---|
#18+
В моём примере при вводе данных подсчёт суммы в колонку справа осуществляется нормально а вот сумми рование внизу срабатывает только при переходе на следующую запись. Можно ли реализовать суммирование не выходя из записи? Пытался сохранять запись после редактирования каждого поля но тогда курсор переходит постоянно на первое поле. Эта проблема решаема или обновление возможно только после выхода из записи? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2017, 20:56 |
|
|
start [/forum/topic.php?fid=45&startmsg=39541832&tid=1611897]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
40ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
2ms |
others: | 264ms |
total: | 391ms |
0 / 0 |