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

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

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

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

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

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

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

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

это более красиво.. но придется таскать всегда его с собой, т.е. помнить чтобы он был на других машинах - лишняя морока. я так думаю
...
Рейтинг: 0 / 0
24.10.2003, 13:11
    #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
24.10.2003, 13:28
    #32304285
Alexus12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поле со списком (как узнать программно, что список открылся)
Легче всего переключить форму в таблчиный вид:
и вверх-вниз будет бегать САМО
и список работать правильно будет

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

//Проще нада быть (с) Ктото
...
Рейтинг: 0 / 0
24.10.2003, 14:15
    #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
24.10.2003, 21:05
    #32304908
Shkurenko Alexander
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поле со списком (как узнать программно, что список открылся)
Потерпите маленько. Сегодня я пьяный, а завтра честное пионерское обесчаю выложить ответ на этот животрепесчущий вопрос.
...
Рейтинг: 0 / 0
25.10.2003, 10:49
    #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
25.10.2003, 11:04
    #32305040
IgorM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поле со списком (как узнать программно, что список открылся)
http://www.mvps.org/access/api/api0052.htm
...
Рейтинг: 0 / 0
31.10.2003, 17:58
    #32312268
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поле со списком (как узнать программно, что список открылся)
сенькаю. (Особая благодарность 2 Dev Ashish)

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


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