Скроллинг колесом ленточной формы - уезжает первая строка

udav2alex
Дата: 04.12.2006 15:37:34
Может плохо искал - не нашел, ткните, пожалуйста, носом...

Access 2003

Проблема: если в ленточной форме (подчиненной, но это вроде не важно) количество записей таково, что все они видны в открытом окне, при скроллинге записей колесом мыши первая запись "проматывается" вверх и колесом обратно уже не возвращается - надо тягать полосу прокрутки справа. Если строк больше, чем влазит на экран - все нормально, все скроллится на ура...

Такая фича наблюдается на трех разных машинах.

Подскажите, пожалуйста, как с этим бороться? И насколько вообще такая ситуация уникальна?
bILL HEAD
Дата: 04.12.2006 15:53:20
у меня такаяжэ ситуевина
Андрей Стадников
Дата: 04.12.2006 16:26:22
тот же глюк
и не только на 2003, на хр было то же саме

когда-то пытался ставил принудительно фокус на первую запись на событие прокрутки, возникающее на второй записи... теперь не ставлю - пользователи привыкли лезть в прокрутку
udav2alex
Дата: 04.12.2006 21:06:10
Мммда... Грустно... Спасибо, попробую с поиграть с фокусом...
Artcloud
Дата: 05.12.2006 10:20:51
Я так понимаю access и колесо прокрутки - впринципе не совместимые вещи.
Dutch Shultz
Дата: 13.01.2009 20:44:26
Может у кого появилсись идеи-вот и я до этого глюка дошел)
Gluck_13
Дата: 14.01.2009 10:22:54
Поскольку с Аксом многие стандартные вещи тяжело совместимы, в моем проекте все окна форм (а также главное окно и окно MDI-клиента) субклассированы через DLL, реализованную на C++, что позволяет избежать падений, случающихся при написании оконной процедуры на VBA.

При таком подходе можно существенно расширить возможности UI, предоставляемые Акс-ом, например есть реализации для Custom-Draw полей ленточной формы (иконки + текст), организация параллельных оконных стеков - внутри каждого стека доступна только верхняя форма, а переключение между ними производится при помощи тулбара типа панели задач Windows, "резиновые" заголовки столбцов ленточной формы и т.п.

На обсуждаемый баг с прокруткой колесом ранее как-то не обращал внимания (с Акс-ом работаю всего около 3 месяцев), однако решил и его подправить. Вот кусок субклассированной оконной процедуры класса C++, реализующего субклассинг окна формы Access.

LRESULT CFormSubclasser::SubclassedWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL* bNoDefault)
{
	CWndStack* ws;
	if (m_IsSubForm) return 0;  // Для вложенных форм ничего не делаем.

	switch (uMsg) {
	case WM_MOUSEWHEEL:         // прокрутка мышкой
 		// Если не нажимали всяких шифтов и крутили вверх
		if ((LOWORD(wParam) == 0) && (((short)HIWORD(wParam)) > 0))
		{
			int scp;
			HWND hScrollBar = GetVerticalScrollBar();       // ищем скроллбар формы
			if (hScrollBar) {
				// текущая позиция скроллбара
				scp = GetScrollPos(hScrollBar, SB_CTL);
				// вызовем стандартную оконную процедуру, пусть Акс выполнит прокрутку
				LRESULT lRetVal = CallDefaultProc(hWnd, uMsg, wParam, lParam);
				*bNoDefault = TRUE;    // Стандартную процедуру второй раз не вызываем
				// Если Акс никуда ничего не прокрутил
				if (GetScrollPos(hScrollBar, SB_CTL) == scp) {
					// Имитируем нажатие на стрелочку вверх в скролл-баре
					PostMessage(m_hWnd, WM_VSCROLL, SB_LINEUP, 0);
				}
				return lRetVal;
			}
		}
		break;
	case ... (здесь обработка других сообщений, к обсуждаемой проблеме не относящихся)

Наверное, что-то подобное можно сотворить и на VBA, например в Form_MouseWheel посылать окну WM_VSCROLL при определенных условиях, однако этот способ я не исследовал, тем более что обработчик придется копи-пастить во всех формах.
Бенедикт
Дата: 14.01.2009 17:36:16
Да, глюк, аднака... Можно просто отрубать событие колеса мыши в таком случае.
I am sorry
Дата: 12.12.2016 10:16:04
Бенедикт,
Прошу прощения за поднятый старючий пост, но тоже столкнулся с такой же проблемой.
Отключил колесо банальным отключением вертикальной полосы прокрутки в макете свойств формы.
Joss
Дата: 13.12.2016 09:07:50
Отключили полосу прокрутки? А как же тогда перемещаться по записям? При помощи кнопок навигации? А если записей много?