Клятый ComboBox

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Клятый ComboBox

Сообщение Space » 27.03.2009 (Пт) 21:35

При открытом списке ComboBox выдаёт интересные фишки - наберите в Text "10", затем кликните вне комбика - получим "100" в результате. Аналогично действует нажатие Enter. Начал исследование - набрал "100", нажал KeyBack, при этом установив индекс =-1 - опять при нажатии Enter получил "100" (а Text="10"). Потом в Combo1_KeyDown попытался скрыть список при Enter - не помогло. Как избавиться от такого поведения (может, можно вообще отключить автоподбор Item при вводе текста?)?
Код: Выделить всё
'некорректный выбор значения
Option Explicit

Private Declare Function SendMessageLong Lib _
    "user32" Alias "SendMessageA" (ByVal hwnd As Long, _
    ByVal wMsg As Long, ByVal wParam As Long, _
    ByVal lParam As Long) As Long
Private Const CB_SHOWDROPDOWN = &H14F
Private Const CB_SETCURSEL = &H14E
Dim fHideList As Boolean

Private Sub Combo1_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = 13 Then
     fHideList = True
     ComboListVisible Combo1, False
    End If
End Sub

Private Sub Combo1_KeyUp(KeyCode As Integer, Shift As Integer)
Dim lRet As Long
    If fHideList Then fHideList = False: Exit Sub
    ComboListVisible Combo1, True
    If KeyCode = 13 Then
Debug.Print Combo1.ListIndex
    End If
    If KeyCode = vbKeyDelete Or KeyCode = vbKeyBack Then
     Combo1.ListIndex = -1
     'lRet = SendMessageLong(Combo1.hwnd, CB_SETCURSEL, -1, 0) 'снять выделение
    End If
End Sub

Private Sub ComboListVisible(Combo As ComboBox, ByVal Flag As Boolean)
Dim Mess As Long
    Mess = SendMessageLong(Combo.hwnd, CB_SHOWDROPDOWN, Flag, 0)
    Combo.MousePointer = 0 'иначе мышь пропадает при вводе некого значения и нажатия Enter
End Sub

Private Sub Form_Load()
Dim i As Long
For i = 1 To 9
Combo1.AddItem i
Next i
Combo1.AddItem "100"

End Sub


alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Клятый ComboBox

Сообщение alibek » 27.03.2009 (Пт) 22:15

Читать мануалы надо, тогда не будет неожиданностей.
В открытом состоянии в ComboBox используется поиск и автоподстановка.
Так что ведет себя он, как положено.
Lasciate ogni speranza, voi ch'entrate.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Клятый ComboBox

Сообщение Space » 27.03.2009 (Пт) 22:51

ну и что, разве это нормально? Пользователь открывает список, не видит там нужного значения, вводит своё. Уходит с комба, комб меняет введённое юзером значение на подходящее :evil:

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Клятый ComboBox

Сообщение alibek » 28.03.2009 (Сб) 10:18

Когда пользователи не желают думать, да, это ненормально.
Lasciate ogni speranza, voi ch'entrate.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Клятый ComboBox

Сообщение Space » 28.03.2009 (Сб) 17:51

а почему комбик позволяет себе заменять "10" на "100", он должен лишь предложить пользователю сделать выбор, а точнее дать ему быструю возможность выбрать "100". Пользователь же даже не нажимал Enter (нажатие которого не должно вообще ничего выбирать, т.к. запись "100" не подсвечена, она лишь появляется в видимой области списка), он просто ушёл с комбика, и в том должно остаться значение, введённое пользователем. Так что это молдаванские программеры Микрософта не желали думать :)

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Клятый ComboBox

Сообщение Space » 28.03.2009 (Сб) 23:37

alibek, больше не хочешь возразить?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Клятый ComboBox

Сообщение iGrok » 29.03.2009 (Вс) 0:47

Space писал(а):alibek, больше не хочешь возразить?

Если юзер открывает список - он выбирает значение из списка.
Ввод текста в данном случае работает для ускорения поиска значения.
Если он хочет ввести значение, которого нет в списке, он вводит значение, а не открывает список.

Ну а все побочные неприятные эффекты происходят из-за того, что ты сам меняешь дефолтное поведение контрола (раскрытие списка по нажатию Enter)

Либо юзай для этого связку ListBox + TextBox, и полностью прописывай логику, как решил эту проблему для себя я.. Либо не трожь стандартное поведение.
label:
cli
jmp label


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 42

    TopList  
cron