Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 10.04.2007
Сообщений: 96

Enter не заносит выделенное значение списка в Text ComboBox-а

31.01.2008, 15:09. Показов 1844. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Если в открытом списке ComboBox-а выбирается строка мышью
!без клика!, то нажатие Enter не заносит выделенное значение
списка в Text ComboBox-а.
Решение данной проблемы:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Private Declare Function SendMessage Lib 'user32' Alias _
'SendMessageA' (ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, lParam As Any) As Long
Private Const CB_SHOWDROPDOWN = &H14F
Private Sub Combo1_KeyDown(KeyCode As Integer, Shift As Integer)
  If KeyCode = 13 Then
    Dim A As Integer
    A = Combo1.ListIndex
    'Закрываем List у Combo1
    SendMessage Combo1.hwnd, CB_SHOWDROPDOWN, 0, 0
    Combo1.ListIndex = A
  End If
End Sub
Private Sub Form_Load()
  Dim i As Integer
  For i = 0 To 50
    Combo1.AddItem i, i ' Заполняем комбобокс значениями
  Next i
End Sub
Вопрос к ALL
Может есть способ лучше?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.01.2008, 15:09
Ответы с готовыми решениями:

Сравнить выделенное значение в combobox и любое другое значение
Есть ComboBox и при выделении элемента "1.11.X" должно выполнятся какое-то действие. В WIndows Form такое работало... private...

ComboBox выбор строки из списка по Enter
При нажатии на ComboBox появляется список, который он содержит. Нужно, чтобы при выборе какой-то позиции (стрелками вверх,вниз) и...

Как добавить текст из списка в ComboBox.Text
требуется что бы при выборе элемента из списка ComboBox, он не вставал в поле ComboBox.Text а добавлялся к нему, и получалось что то типа...

2
prince
08.02.2008, 20:09
Делай с этим, что хочешь, но это почти Аксесовский комбобокс.
По крайней мере потребности некоторых дам он выполнил.

Option Explicit

Private m_bNoise As Boolean

'*** Const for ComboBox
Private Const CB_SETEXTENDEDUI& = &H155
Private Const CB_FINDSTRING& = &H14C
Private Const CB_FINDSTRINGEXACT& = &H158
Private Const CB_LIMITTEXT& = &H141
Private Const CB_GETDROPPEDSTATE& = &H157
Private Const CB_SHOWDROPDOWN& = &H14F
Private Const CB_SELECTSTRING& = &H14D

'*** Function for ComboBox
Private Declare Function SendMessage Lib 'user32' Alias 'SendMessageA' (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

'*** Event for UserControl
Event NotInList()

Private Sub Combo_Click()

If m_bNoise Then
m_bNoise = False
Else
SendKeys ('{TAB}')
End If

End Sub

Private Sub Combo_KeyDown(KeyCode As Integer, Shift As Integer)

m_bNoise = True

If KeyCode = vbKeyDown Or KeyCode = vbKeyUp Or _
KeyCode = vbKeyPageDown Or KeyCode = vbKeyPageUp Then
Exit Sub
End If

If KeyCode = 8 Or KeyCode = 46 Then 'Backspace or Delete
Combo.Text = ''
Exit Sub
End If

Dim bLen As Boolean
Dim sVal As String
Dim lIndex As Long

With Combo
sVal = FirstChar$(.Text)
bLen = (Len(sVal) > 0)

If KeyCode = vbKeyReturn And bLen Then
lIndex = SendMessage(.hWnd, CB_FINDSTRINGEXACT&, -1, ByVal sVal)

If lIndex& >= 0 Then

'If DroppedState = 1 Then SendMessage .hWnd, CB_SHOWDROPDOWN&, 0&, 0&

.ListIndex = lIndex

Else

RaiseEvent NotInList

.Refresh

If Len(.Text) = 0 Then Exit Sub

.ListIndex = SendMessage(.hWnd, CB_SELECTSTRING, -1, ByVal sVal)

End If

SendKeys ('{TAB}')

End If

End With

End Sub

Private Sub Combo_Change()

Dim lIndex As Long
Dim sText As String
Dim iPos As Integer

With Combo
sText$ = .Text
lIndex& = SendMessage(.hWnd, CB_FINDSTRING&, -1&, ByVal sText$)

If lIndex& = -1 Then
iPos = 0
Else
iPos = .SelStart
.ListIndex = lIndex&
.SelStart = iPos
.SelLength = Len(.Text) - iPos
End If

End With

m_bNoise = True

End Sub

Private Sub Combo_DropDown()
m_bNoise = False
End Sub

Private Sub UserControl_Initialize()
SendMessage Combo.hWnd, CB_SETEXTENDEDUI&, 1&, 0&
SendMessage Combo.hWnd, CB_LIMITTEXT&, 30&, 0&
m_bNoise = True
End Sub

Private Sub UserControl_Resize()
With Combo
.Move 0, 0
.Width = UserControl.Width
UserControl.Height = .Height
End With
End Sub

Private Function FirstChar(sVal As String) As String

Dim strTemp As String

strTemp$ = Trim$(sVal)
FirstChar$ = UCase$(Left$(sVal, 1)) + Mid$(sVal, 2)

End Function

'Private Function DroppedState() As Long
' DroppedState = SendMessage(Combo.hWnd, CB_GETDROPPEDSTATE&, 0&, 0&)
'End Function

Public Property Get CboBox() As ComboBox
S
0 / 0 / 0
Регистрация: 10.04.2007
Сообщений: 96
09.02.2008, 23:05  [ТС]
Привет prince.
Благодарю за оказанное внимание.
Хотя примеры не пересекаются с улучшением моей
проблемы (вопросом), они когда ни будь,
пригодятся.
Для кучи кину ещё примерчик:

Иногда требуется юзера заставить обязательно
ввести значение в ComboBox и при этом ещё и
правильное значение (ключевое поле).
Вроде как можно написать процедурку на событие
Form_QueryUnload, но проблема в том что
событие Data1_Validate (если ComboBox подключен
к Data) происходит ранше чем Form_QueryUnload
(при попытке юзера закрыть форму).

Данный примем решает эту проблему.
Пример сравнивает введённое значение
в ComboBox-е с значениями List-а ComboBox-а
и если оно не сходится то не даёт закрыть
форму нажатием на X или по ALT + F4 до события
Data1_Validate, и при этом выводит сообщение.
(Хотя можно преобразовать пример под алтернативу
события Form_QueryUnload и использовать в других
целях).

ВНИМАНИЕ: форма закроется только при правильном
значенни взятом из списка ComboBox-а !!!

Кидаем на форму ComboBox.

Заносим в форму:

Private Sub Form_Load()
Dim i As Integer
For i = 0 To 50
'Это и есть значения ComboBox-а
Combo1.AddItem i, i
Next i
OldWindowProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
SetWindowLong Me.hwnd, GWL_WNDPROC, AddressOf _
SubClass1_WndMessage
End Sub
-----------------------------------------------------
Заносим в модуль:

Private Declare Function CallWindowProc Lib 'user32' Alias _
'CallWindowProcA' (ByVal lpPrevWndFunc As Long, ByVal hwnd _
As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal _
lParam As Long) As Long
Public Declare Function GetWindowLong Lib 'user32' Alias _
'GetWindowLongA' (ByVal hwnd As Long, ByVal nIndex As Long) _
As Long
Public Declare Function SetWindowLong Lib 'user32' Alias _
'SetWindowLongA' (ByVal hwnd As Long, ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Private Declare Function GetTopWindow Lib 'user32' (ByVal _
hwnd As Long) As Long
Private Declare Function SendMessage Lib 'user32' Alias _
'SendMessageA' (ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, lParam As Any) As Long
Public Const GWL_WNDPROC = (-4)
Private Const EM_UNDO = &HC7
Public OldWindowProc As Long
Public Function SubClass1_WndMessage(ByVal hwnd As _
OLE_HANDLE, ByVal Msg As OLE_HANDLE, ByVal wp As _
OLE_HANDLE, ByVal lp As Long) As Long
If wp = 61536 Then
Dim A As Boolean
Dim IndexStr As Integer
With Form1.Combo1
For IndexStr = 0 To .ListCount - 1
If .List(IndexStr) = .Text Then A = True: Exit For
Next IndexStr
If Not A Then
Dim B As String
Dim C As Long
If Form1.Combo1 Like '*[ ]' Or Form1.Combo1 = '' Then
B = 'Введите № группы'
C = vbInformation
Else
B = 'Нет такой группы: ' & Form1.Combo1
C = vbExclamation
End If
MsgBox B, vbOKOnly + C, Form1.Caption
SendMessage GetTopWindow(Form1.hwnd), EM_UNDO, 0, 0
.SetFocus
wp = 0
End If
End With
End If
SubClass1_WndMessage = CallWindowProc(OldWindowProc, _
hwnd, Msg, wp, lp)
End Function
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.02.2008, 23:05
Помогаю со студенческими работами здесь

При выборе из выпадающего списка Items во время выполнения, мне необходимо изменить Combobox.Text
У меня возникло затруднение с Сombobox: при выборе из выпадающего списка Items во время выполнения, мне необходимо изменить текст. ...

Как после выбора пункта в ComboBox изменить значение в свойстве Text?
Привет всем. Есть ComboBox с вписаными в него, для конечного пользователя, понятные элементы выбора(на скрине). Все файлы По...

Почему дважды заносит в ComboBox?
Hi gays and ladys! Имею, странную и не объяснимую с точки зрения логики ошибку. Буду краток. Вод код: Private Sub ComboBox1_Change()...

как из выпадающего списка поместить выбранное значение в input type=text
Подскажите пожалуйста как из выпадающего списка поместить выбранное значение в <input type="text" name="test">...

ComboBox.Text и ComboBox.Items.Text
Всем доброго времени суток. Помогите пожалуйста с такой проблемой...Как объединить combobox.text и combobox.items.text. Есть fpath который...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru