Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Манипуляции ListBox'ом через API (AccessXP + SP2) / 12 сообщений из 12, страница 1 из 1
22.10.2003, 18:58
    #32302150
Kelme
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Манипуляции ListBox'ом через API (AccessXP + SP2)
Добрый вечер народ!
Бъюсь уже второй день, весь инет перерыл и местный форум тоже, нифига не нашел :(
Проблема в следующем:
надо програмно устанавливать первый видимый итем(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
22.10.2003, 19:05
    #32302160
incold
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Манипуляции ListBox'ом через API (AccessXP + SP2)
А обязательно через API?
...
Рейтинг: 0 / 0
22.10.2003, 19:11
    #32302168
Kelme
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Манипуляции ListBox'ом через API (AccessXP + SP2)
По другому это не сделать.
...
Рейтинг: 0 / 0
22.10.2003, 19:19
    #32302178
Shkurenko Alexander
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Манипуляции ListBox'ом через API (AccessXP + SP2)
nummer null
есть поиск по форуму

nummer eins
ListBox.SetFocus
ListBox.LIstIndex = 1

nummer zwei
ListBox.Value = ...

P.S. А использовать API в твоем случае - это с пушки по ... ИМХО
...
Рейтинг: 0 / 0
22.10.2003, 19:20
    #32302180
SergeySV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Манипуляции ListBox'ом через API (AccessXP + SP2)
Ха-ха и так еще много раз, 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
22.10.2003, 19:23
    #32302185
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Манипуляции ListBox'ом через API (AccessXP + SP2)
Дополнение к Shkurenko Alexander:

Z.Value = Z.ItemData(0)
...
Рейтинг: 0 / 0
22.10.2003, 19:39
    #32302195
Senin Viktor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Манипуляции ListBox'ом через API (AccessXP + SP2)
Не раз говорилось - стандартные элементы Акеса - вовсе элементы Виндосу (во всяком случае до Акеса 2003 - так было).Не реагирует на огромное число сообщений. Ведут себя по дурному ипрочее. Источник - Гетц
Выход - использование стандарных контролов Виндоуса (mscomctl.ocx 1,2,3 библиотеки).
...
Рейтинг: 0 / 0
22.10.2003, 19:41
    #32302196
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Манипуляции ListBox'ом через API (AccessXP + SP2)
Но в данном случае достаточно написать одну команду Аксесса.
...
Рейтинг: 0 / 0
22.10.2003, 19:41
    #32302197
Senin Viktor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Манипуляции ListBox'ом через API (AccessXP + SP2)
поправка: вовсе не элементы Виндоуса
...
Рейтинг: 0 / 0
23.10.2003, 10:34
    #32302570
Kelme
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Манипуляции ListBox'ом через API (AccessXP + SP2)
Код: 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
23.10.2003, 17:09
    #32303454
Shkurenko Alexander
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Манипуляции ListBox'ом через API (AccessXP + SP2)
Приношу свои извенения 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
23.10.2003, 17:29
    #32303488
Kelme
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Манипуляции ListBox'ом через API (AccessXP + SP2)
Получить hWnd ListBox просто, есть API функция GetFocus()
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Манипуляции ListBox'ом через API (AccessXP + SP2) / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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