powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Поле со списком (как узнать программно, что список открылся)
19 сообщений из 19, страница 1 из 1
Поле со списком (как узнать программно, что список открылся)
    #32080347
vinni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как можно узнать в поле со списком выпал список или нет.
...
Рейтинг: 0 / 0
Поле со списком (как узнать программно, что список открылся)
    #32080370
Фотография AlexJuice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто как, а я уже выпал. В осадок...

А поконкретнее нельзя описАть ситуевину?
...
Рейтинг: 0 / 0
Поле со списком (как узнать программно, что список открылся)
    #32080376
vinni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть ленточная форма, все прекрастно, но есть одна проблема, нажимая любую кнопку управления(вверхб вниз ...) происходит одно и тоже событие переход по табуляции. Ну я написал процедуры при нажатии вверх переходить вверх позаписям, ну и соответствино в низ. Но вот появилась такая проблема, если в поле со списком поставить эти процедуры, то когда выпадает список, при нажатии этих злополучных кнопок происходит переход на следующую запись, а не переход по списку. Так вот надо узнать когда выпал список не выполнять мои процедуры перехода по записям.
Вроде все!
...
Рейтинг: 0 / 0
Поле со списком (как узнать программно, что список открылся)
    #32080454
vinni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно другой вопрос, есть ли событие которое вызываеться при надатии кнопки на списке
...
Рейтинг: 0 / 0
Поле со списком (как узнать программно, что список открылся)
    #32080488
Julius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет такого события, сам как-то искал
...
Рейтинг: 0 / 0
Поле со списком (как узнать программно, что список открылся)
    #32080576
Yran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посмотри ответ на сайте "Кирпичики кода" там есть описание чего-то подобного.
...
Рейтинг: 0 / 0
Поле со списком (как узнать программно, что список открылся)
    #32080606
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопрос оченььь интересный
самое главное правильный

а ответа нет (я давно ищу)
в кирпичах не встречал....
это для самых мудрых .... я так думаю
буду оченьь признателен, если кто подскажет ответ
заранее кучу спасибо
...
Рейтинг: 0 / 0
Поле со списком (как узнать программно, что список открылся)
    #32080705
-=Alexey=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я не понял, что хочет сделать vini, но одной мыслю поделюсь:
в процедуре обрабатывающей нажатии клавиш в форме проверять какой элемент имеет фокус и в зависимости от этого делать действия.
...
Рейтинг: 0 / 0
Поле со списком (как узнать программно, что список открылся)
    #32081091
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я не понял, что хочет сделать vini, но одной мыслю поделюсь:
в процедуре обрабатывающей нажатии клавиш в форме проверять какой элемент имеет фокус и в зависимости от этого делать действия
.

поле со списком может быть раскрыто, а может быть и нет при получении на нем фокуса.
если поле раскрыто по F4-нет проблем, а если мышкой по внутреннему подполю в правой части поля, или командой DropDown откуда-нибудь заранее. А....?
...
Рейтинг: 0 / 0
Поле со списком (как узнать программно, что список открылся)
    #32081114
Фотография Latuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтото я не встречал ПолеСоСписком чтоб без фокуса и с раскрытым списком.Проблемма именно в том что когда фокус в поле нажатие клавиш должно обрабатыватся по разному в зависимости от состояния списка. Может тут зайти со стороны положения на экране frm.CurrentSectionTop или совсем написать свой ActiveX контрол повторяющий combobox но имеющий свойство раскрыт ли список.
...
Рейтинг: 0 / 0
Поле со списком (как узнать программно, что список открылся)
    #32081268
Фотография Savik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ты спрячь кнопочку списка под свою такую же и её события и отрабатывай.
...
Рейтинг: 0 / 0
Поле со списком (как узнать программно, что список открылся)
    #32081489
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтото я не встречал ПолеСоСписком чтоб без фокуса и с раскрытым списком

бывают всякие извращения......

А ты спрячь кнопочку списка под свою такую же и её события и отрабатывай.

конечно можно ... ну это как-то очень не красиво
хочется просто и красиво

написать свой ActiveX контрол повторяющий combobox но имеющий свойство раскрыт ли список.

это более красиво.. но придется таскать всегда его с собой, т.е. помнить чтобы он был на других машинах - лишняя морока. я так думаю
...
Рейтинг: 0 / 0
Поле со списком (как узнать программно, что список открылся)
    #32304252
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Итак, господа, какая такая РЕЗЮМА из этой вот бяки?

Хочу знать выпал список или нет, по возможности не дергая события и прочая. Но хочу это (пока) хотя бы в режиме работы с клавиатурой.

Пока вижу следущее - по входу в поле со списком обнулять некую статику. По нажатию Альт+(клава вниз) - в эту статику прописать Альт. Но процедуру хочу одну. (Общую). Чтобы не передавать данных о расположении поля (форма, контрол) - статика должна быть вот именно что доступна и из обработчиков входа в поля и из обработчиков нажатия клавиш. Вернее из процедур, в которые передаю обработку.

Но получатся навскидку криво:
Код: 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.
Sub UpDownPress(Optional KeyCode, Optional nShift)
'должны быть VARIANT чтобы IsMissing правильно возвращало'
'не_передачу параметра'
'Вызов из полей без передачи Shift , из полей со списком - с передачей'
'первый вызов из поля со списком - по входу'
Dim intAltDown As Long
'Dim intShiftDown As Long, intCtrlDown As Long'
Static NotOpened As Boolean
On Error Resume Next
    If IsMissing(KeyCode) Then
        'инициализация из On_ENTER в поле со списком'
        NotOpened = True
        Exit Sub
    End If
    ' Определяет нажатую клавишу с помощью поразрядной маски.'
    intAltDown = (nShift And acAltMask) >  0       'acAltMask =4'
    If Not IsMissing(nShift) Then
        If intAltDown Then
            If KeyCode =  40  Then NotOpened = Not NotOpened
            'нажат Alt +вниз - в выпадающих списках список выпадает'
            'нажат Alt +вниз - или закрывается'
            'при первом нажатии - фальш'
        Else
        End If
        If NotOpened Then 'что нить еще?'
        Else
            'открыт, - свою обработку отключаем'
            Exit Sub
        End If
    End If
    'своя обработка'
    If KeyCode =  38  Then DoCmd.GoToRecord , , A_PREVIOUS
    If KeyCode =  40  Then DoCmd.GoToRecord , , A_NEXT
    
End Sub

Соответственно вызовы выглядят как:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Private Sub ORNAM_KeyDown(KeyCode As Integer, Shift As Integer)
    UpDownPress KeyCode
End Sub

Private Sub ORPRI_Enter()
    'ORPRI.Dropdown'
    UpDownPress
End Sub

Private Sub ORPRI_KeyDown(KeyCode As Integer, Shift As Integer)
    UpDownPress KeyCode, Shift
End Sub

Вроде работает, но "душа не лежит". (что там еще можут юзер понажимать...)
Очень просто реализовать работу с клавой, если задействовать для перехода по записям в раскрытом списке еше и Shift (или Ctrl) (т.е. для обхода собственной обработки), но тогда появятся отличие от "стандартного поведения клавиш в аксессе", чего тоже не хочется.
...
Рейтинг: 0 / 0
Поле со списком (как узнать программно, что список открылся)
    #32304285
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Легче всего переключить форму в таблчиный вид:
и вверх-вниз будет бегать САМО
и список работать правильно будет

кому не нравится вид таблицы, могут кинуть в MS
ее FlexGridами, кроме которых у ВБшников ваще ничего нет

//Проще нада быть (с) Ктото
...
Рейтинг: 0 / 0
Поле со списком (как узнать программно, что список открылся)
    #32304368
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как проще - оно известно. Всячески приветствую. Но есть формы, каковые в таблице будут не обозрительны. Придется делать 5-10 табличных форм, кидать все на вкладки и синхронизовать их. А в ленточку можно запхать в несколько рядков (сверху вниз) (или даже один под другим и регулировать видимость групп полей кнопицами). (Вкладки, опять же, но для квазитаблы они некрасивы). Вот там надо разродиться одним решением по скролингу вверх/вниз, и юзать его до посинения.

А вот та засада, что св-во поля со списком "список_выпал" не паблик - это заподло! А то, што оно у них есть - это самоочевидно. Сами же обрабатывают! Однозначно - маздай!

Можно конечно подумать использовать другую пару событий: 1. по клавишам - коды попросту получать, а 2. по выходу (если таковое попытается состояться - обрабатывать полученные ранее коды). Но тут подлянка в том, что выход может быть спровоцирован чем не попадя. Т.е. как через ж не выкручивайся - все одно через ж. получатся.

Однако, раз все равно торчу в форуме, вот так покорректнее и к другим событиям клавы будет:
Код: 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.
Sub UpDownPress(Optional KeyCode, Optional nShift)
'должны быть VARIANT чтобы IsMissing правильно возвращало
'не_передачу параметра
'Вызов из полей без передачи Shift , из полей со списком - с передачей
Dim intShiftDown As Long, intAltDown As Long
Dim intCtrlDown As Long
Static NotOpened As Boolean
On Error Resume Next
    If IsMissing(KeyCode) Then
        'инициализация из On_ENTER в поле со списком
        NotOpened = True
        Exit Sub
    End If  
    intAltDown = (nShift And acAltMask) >  0       'acAltMask =4
    If Not IsMissing(nShift) Then
        If intAltDown Then
            If KeyCode = 40 Then NotOpened = Not NotOpened
            'нажат Alt +вниз - в выпадающих списках список выпадает
            'нажат Alt +вниз - или закрывается
            'при первом нажатии - фальш
        Else
            'F4
            If (KeyCode = 115 And nShift = 0) Then NotOpened = Not NotOpened
        End If
        If NotOpened Then 'что нить еще?
        Else
            'открыт, свою обработку отключаем
            If (KeyCode = 27 And nShift = 0) Then
                'эскейп без альт, список раскрыт
                NotOpened = Not NotOpened
            End If
            Exit Sub
        End If
    End If
    'своя обработка
    If KeyCode =  38  Then DoCmd.GoToRecord , , A_PREVIOUS
    If KeyCode =  40  Then DoCmd.GoToRecord , , A_NEXT
    
End Sub
...
Рейтинг: 0 / 0
Поле со списком (как узнать программно, что список открылся)
    #32304908
Shkurenko Alexander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потерпите маленько. Сегодня я пьяный, а завтра честное пионерское обесчаю выложить ответ на этот животрепесчущий вопрос.
...
Рейтинг: 0 / 0
Поле со списком (как узнать программно, что список открылся)
    #32305033
Shkurenko Alexander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот значит, разобрался что к чему.

Работает из предположения, что может быть открыт только один Combo_ListBox

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Public Declare Function FindWindow Lib  "user32"  Alias  "FindWindowA"  _
    (ByVal lpClassname As String, ByVal lpWindowName As String) As Long
Public Declare Function GetWindowLong Lib  "user32"  Alias  "GetWindowLongA"  _
    (ByVal hwnd As Long, ByVal nIndex As Long) As Long

Public Const GWL_STYLE = - 16 
Public Const WS_VISIBLE = &H10000000
Public Const CB_LISTBOX_CLASS =  "ODCombo" 

Public Function IsComboBoxOpen() As Boolean
    Static hwnd&
   
    hwnd = FindWindow(CB_LISTBOX_CLASS, vbNullString)
    If hwnd =  0  Then Exit Function
    IsComboBoxOpen = GetWindowLong(hwnd, GWL_STYLE) And WS_VISIBLE
End Function


Можно было бы и WindowFromPoint использовать, но там заморока с переводами из твипов в пикселы. Но зато можно работать с конкретным ComboBox'ом.
...
Рейтинг: 0 / 0
Поле со списком (как узнать программно, что список открылся)
    #32305040
IgorM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.mvps.org/access/api/api0052.htm
...
Рейтинг: 0 / 0
Поле со списком (как узнать программно, что список открылся)
    #32312268
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сенькаю. (Особая благодарность 2 Dev Ashish)

вот токо я и с акс2.0 еще иногда вожусь :0)
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Поле со списком (как узнать программно, что список открылся)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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