powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Манипуляции ListBox'ом через API (AccessXP + SP2)
12 сообщений из 12, страница 1 из 1
Манипуляции ListBox'ом через API (AccessXP + SP2)
    #32302150
Kelme
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый вечер народ!
Бъюсь уже второй день, весь инет перерыл и местный форум тоже, нифига не нашел :(
Проблема в следующем:
надо програмно устанавливать первый видимый итем(item) в листбоксе, вроде ничего сложного, но нифига не работает, проверял в Spy++ при вызове SendMessage в lResult возвращается 0!, хоть ты тресни. Аналогичная ситуация даже с SendMessage(GetFocus, LB_GETSELCOUNT, 0&, 0&), возвращается зироу.
Я уж подумал, что листбокс ваще никаким действиям не поддаётся, однако WM_VSСROLL он хавает и скролится хоть вверх, хоть вниз:)

Внизу этот злосчастный код, люди поможите чем можите :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Global Const LB_SETTOPINDEX = &H197
Global Const LB_GETSELCOUNT = &H190

Private Declare Function SendMessage Lib  "user32"  Alias  "SendMessageA"  (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Any) As Long

Private Declare Function GetFocus Lib  "user32"  () As Long


Private Sub Test
      me!Streets_list.SetFocus
      SendMessage GetFocus, LB_SETTOPINDEX,  10 ,  0 
end sub


MultiSilect = Simple
RowSource = Query/Table
вот собственно краткие сведения о проблеме.
...
Рейтинг: 0 / 0
Манипуляции ListBox'ом через API (AccessXP + SP2)
    #32302160
incold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А обязательно через API?
...
Рейтинг: 0 / 0
Манипуляции ListBox'ом через API (AccessXP + SP2)
    #32302168
Kelme
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По другому это не сделать.
...
Рейтинг: 0 / 0
Манипуляции ListBox'ом через API (AccessXP + SP2)
    #32302178
Shkurenko Alexander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nummer null
есть поиск по форуму

nummer eins
ListBox.SetFocus
ListBox.LIstIndex = 1

nummer zwei
ListBox.Value = ...

P.S. А использовать API в твоем случае - это с пушки по ... ИМХО
...
Рейтинг: 0 / 0
Манипуляции ListBox'ом через API (AccessXP + SP2)
    #32302180
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ха-ха и так еще много раз, LB_SETTOPINDEX у него понимаешь ListBox не понимает...

Я вот тут лепил WM_VSСROLL к ListBox формы у Excel'a, попросили добрые люди, так в результате экспериментов и Spy++ выяснил, что ListBox Excel'ский вообще на 95% всех стандартных сообщений ListBox плюет. Он не то что событие колесика WM_MSWHEEL (так что ли оно назыв., уж точно не помню) не вопринимает, так он еще WM_VSСROLL не получает когда ему на скролл нажимаешь, все форма перехватывает и только перерисовывает его WM_PAINT (это несмотря на то что ListBox там все-таки имеет свой hWnd в отличии от кнопок и т.д.). Я вывернулся токо так, через SubClassing формы ловил событие поворот колесика и посылал ListBox нажатие клавиши стрелки или PgDn/PgUp (в функции можно настроить что тебе нравится)

Так что в том что ListBox не обрабатывает некоторые событие нет НИЧЕГО удивительного, он же рисованый, его Access создает таким обрезанным, он не является стандартным элементом под названием - ListBox из "какой-то там" стандартной системной библиотеки.

Так что ищи обходные пути, придется играться другими сообщениями, которые он поддерживает.
...
Рейтинг: 0 / 0
Манипуляции ListBox'ом через API (AccessXP + SP2)
    #32302185
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Дополнение к Shkurenko Alexander:

Z.Value = Z.ItemData(0)
...
Рейтинг: 0 / 0
Манипуляции ListBox'ом через API (AccessXP + SP2)
    #32302195
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не раз говорилось - стандартные элементы Акеса - вовсе элементы Виндосу (во всяком случае до Акеса 2003 - так было).Не реагирует на огромное число сообщений. Ведут себя по дурному ипрочее. Источник - Гетц
Выход - использование стандарных контролов Виндоуса (mscomctl.ocx 1,2,3 библиотеки).
...
Рейтинг: 0 / 0
Манипуляции ListBox'ом через API (AccessXP + SP2)
    #32302196
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Но в данном случае достаточно написать одну команду Аксесса.
...
Рейтинг: 0 / 0
Манипуляции ListBox'ом через API (AccessXP + SP2)
    #32302197
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поправка: вовсе не элементы Виндоуса
...
Рейтинг: 0 / 0
Манипуляции ListBox'ом через API (AccessXP + SP2)
    #32302570
Kelme
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
nummer null 
есть поиск по форуму 

nummer eins 
ListBox.SetFocus 
ListBox.LIstIndex =  1  

nummer zwei 
ListBox.Value = ... 

Да насчёт этого я в курсе, ListIndex тут не поможет, необязательно, что первый элемент будет первым видимым, эта тема на форуме уже обсуждалась.

И по поводу из по пушки по птицам: я хотел как лучше, обидно что, как я понял, нифига мне не светит :)

все сенкс за помощь
...
Рейтинг: 0 / 0
Манипуляции ListBox'ом через API (AccessXP + SP2)
    #32303454
Shkurenko Alexander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приношу свои извенения Kelme за невнимательное прочтение вопроса.

Вариант 1. (Простой до безобразия)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Const WM_LBUTTONDOWN = &H201
Declare Function SendMessage Lib  "User32"  Alias  "SendMessageA"  _
    (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

' имитация нажатия левой кнопки мыши на первом видимом Item'e
Sub SetLBTopIndex(ByVal hWnd as Long)
    Call SendMessage(hWnd, WM_LBUTTONDOWN,  0 , ByVal  65535  *  2  +  2 )
End Sub


Вариант 2. (более сложный, но имеющий дальнейшее развитие в плане расширения возможностей ListBox'a)

Код: 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.
Public Type SCROLLINFO
    cbSize As Long
    fMask As Long
    nMin As Long
    nMax As Long
    nPage As Long
    nPos As Long
    nTrackPos As Long
End Type

Public Declare Function GetScrollInfo Lib  "User32"  _
    (ByVal hWnd As Long, ByVal n As Long, lpScrollInfo As SCROLLINFO) As Long

Public Const SB_VERT = &H1
Public Const SIF_POS = &H4

' возвращает номер первого видимого Item'a
Function GetLBTopIndex(ByVal hWnd As Long) As Long
    Static si As SCROLLINFO
    si.nPos =  0 
    si.fMask = SIF_POS
    si.cbSize =  28 
    Call GetScrollInfo(hWnd, SB_VERT, si)
    GetLBTopIndex = si.nPos
End Function

ну а далее, получив этот самый номер воспользуйся советом Владимира Саныча

P.S. Получить hWnd ListBox'a сможешь? Та еще задачка.
...
Рейтинг: 0 / 0
Манипуляции ListBox'ом через API (AccessXP + SP2)
    #32303488
Kelme
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Получить hWnd ListBox просто, есть API функция GetFocus()
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Манипуляции ListBox'ом через API (AccessXP + SP2)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]