Está en la página 1de 6

Dos Ejemplos para autocompletar un combobox a medida que escribimos

El primer ejemplo utiliza la funcin del APi SendMessage para autocompletar y mostrar las coincidencias de los elementos del control a medida que se escribe. El segundo ejemplo, es similar, pero permite cambiar el color de fondo cuando no se encontr coincidencias Contenido
Ejemplo 1 Ejemplo 2 Enlaces relacionados

Ejemplo 1 con SendMessage


Formulario

Colocar un ComboBox llamado combo1. Cdigo fuente en un formulario:


Texto planoCopiar cdigo fuenteImprimir 1. Option Explicit 2. 3. 'Funcin SendMessage 4. Private Declare Function "SendMessageA" ( _ 5. ByVal hwnd As Long, _ 6. ByVal wMsg As Long, _ 7. ByVal wParam As Long, _ 8. lParam As Any) As Long 9. 10. Private Sub Form_load() 11. Dim I As Long 12. 13. ' Agregamos algunos items 14. For I = 1 To 7 15. Combo1.AddItem WeekdayName(I) 16. Next

SendMessage

Lib

"user32"

Alias

17. End Sub 18. 19. Private Sub Combo1_KeyUp(KeyCode As Integer, Shift As Integer) 20. 21. Dim LenText As Long, ret As Long 22. 23. 'Si los caracteres presionados estn entre el 0 y la Z 24. If KeyCode >= vbKey0 And KeyCode <= vbKeyZ Then 25. 26. ret = SendMessage(Combo1.hwnd, &H14C&, -1, ByVal Combo1.Text) 27. 28. If ret >= 0 Then 29. LenText = Len(Combo1.Text) 30. Combo1.ListIndex = ret 31. Combo1.Text = Combo1.List(ret) 32. Combo1.SelStart = LenText 33. Combo1.SelLength = Len(Combo1.Text) - LenText 34. 35. End If 36. End If 37. End Sub
Option Explicit 'Funcin SendMessage Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _ ByVal hw nd As Long, _ ByVal w Msg As Long, _ ByVal w Param As Long, _ lParam As Any) As Long Private Sub Form_load()

Ejemplo 2
Autocompletar y cambiar el color de fondo del combo
Este otro cdigo fuente , lo que hace es, cuando se escribe en el combo y no hay coincidencias, se muestra el color de fondo de otro color, como indicando que hay un error y no se encontr el elemento:

En cambio, cuando si hay coincidencia, se autocompleta la palabra con la propiedad SelStart y SelLength del combo

Colocar en el proyecto un control Combo llamado Combo1 Nota: los colores para el backcolor a usar, se definen en los valores de constantes COLOR_NO_ENCONTRADO y COLOR_NORMAL Cdigo fuente en el formulario
Texto planoCopiar cdigo fuenteImprimir 1. Option Explicit 2. 3. ' Constantes para indicar el color de fondo del combobox 4. ''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 5. Const COLOR_NO_ENCONTRADO = 255 ' color cuando no se encontr 6. Const COLOR_NORMAL = vbWhite ' color cuando hay coincidencia 7. 8. Private Sub Combo1_KeyUp(KeyCode As Integer, Shift As Integer) 9. 10. Static cadena As String 11. Dim i As Long 12. 13. 14. 15. With Combo1 16. 17. ' si pesionamos las teclas de las flechas sale de la rutina 18. If KeyCode = vbKeyUp Then Exit Sub 19. If KeyCode = vbKeyDown Then Exit Sub 20. If KeyCode = vbKeyLeft Then Exit Sub 21. If KeyCode = vbKeyRight Then Exit Sub 22. 23. ' verifica qu no se presion la tecla backspace 24. If KeyCode <> vbKeyBack Then 25. cadena = Mid(.Text, 1, Len(.Text) - .SelLength) 26. Else 27. '...tecla backspace 28. If cadena <> "" Then 29. cadena = Mid(cadena, 1, Len(cadena) - 1) 30. End If 31. End If 32. 33. For i = 0 To .ListCount - 1 34. If UCase(cadena) = UCase(Mid(.List(i), 1, Len(cadena))) Then 35. .ListIndex = i 36. Exit For 37. End If

38. Next 39. 40. ' Seelecciona 41. .SelStart = Len(cadena) 42. .SelLength = Len(.Text) 43. 44. If .ListIndex = -1 Then 45. ' color de fondo del combo en caso de que no hay coincidencias 46. .BackColor = COLOR_NO_ENCONTRADO 47. Else 48. ' Backcolor normal cuando hay coincidencia 49. .BackColor = COLOR_NORMAL 50. End If 51. 52. End With 53. 54. End Sub 55. 56. Private Sub Form_Load() 57. 58. ' Agrega algunos datos al control combo 59. With Combo1 60. .AddItem "Juan" 61. .AddItem "Jose" 62. .AddItem "Pedro Rodrigues" 63. .AddItem "Raul" 64. .AddItem "Maria Rosales" 65. .AddItem "Eugenia" 66. .AddItem "Federico" 67. .AddItem "Augusto" 68. End With 69. 70. Me.Caption = "Autocompletar combo" 71. 72. End Sub

tomed

Fecha de Ingreso: noviembre-2003 Mensajes: 38

Mira, tienes que usar un objeto ADO. Especificamente un ADODB.Command. Como ejemplo, aqui te mando un cdigo que encontr en MSDN Fjate que este ejemplo haces una conexin, creas parmetros para el sotre procedure y finalmente lo ejecutas con .execute. Mira esto primero, si tienes ms dudas, me mandas un correo electrnico. Con gusto te ayudo.

Dim objConn As ADODB.Connection Dim objCmd As ADODB.Command '-------------------------------------------------------------------'--- Open the connection to the pubs database '-------------------------------------------------------------------Set objConn = New ADODB.Connection objConn.Provider = "SQLOLEDB" objConn.ConnectionString = "Provider=SQLOLEDB.1;Initial Catalog=pubs;Data Source=papanotebook;User ID=sa;Password=" objConn.Open '-------------------------------------------------------------------'--- Set the command object up to run the stored procedure '-------------------------------------------------------------------Set objCmd = New ADODB.Command objCmd.CommandType = adCmdStoredProc objCmd.CommandText = "prUpdateAuthor" Set objCmd.ActiveConnection = objConn '-------------------------------------------------------------------'--- Create and add the parameters '-------------------------------------------------------------------objCmd.Parameters.Append objCmd.CreateParameter("@chvFirstName", adVarChar, adParamInput, 20, "John") objCmd.Parameters.Append objCmd.CreateParameter("@chvLastName", adVarChar, adParamInput, 40, "White") objCmd.Parameters.Append objCmd.CreateParameter("@chrPhone", adChar, adParamInput, 12, "408 496-7223") objCmd.Parameters.Append objCmd.CreateParameter("@chvAddress", adVarChar, adParamInput, 40, "10932 Bigge Rd.") objCmd.Parameters.Append objCmd.CreateParameter("@chvCity", adVarChar, adParamInput, 20, "Menlo Park")

objCmd.Parameters.Append objCmd.CreateParameter("@chrState", adChar, adParamInput, 2, "CA") objCmd.Parameters.Append objCmd.CreateParameter("@chrZip", adChar, adParamInput, 5, "94025") objCmd.Parameters.Append objCmd.CreateParameter("@bitContract", adBoolean, adParamInput, , 1) objCmd.Parameters.Append objCmd.CreateParameter("@chrID", adChar, adParamInput, 1, "172-32-1176") '-------------------------------------------------------------------'--- Execute the stored procedure '-------------------------------------------------------------------objCmd.Execute objConn.Close Set objCmd = Nothing Set objConn = Nothing