Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: E N T E R en Octubre 07, 2014, 02:45:24 pm
-
Hola tengo esta función que uso con algunos ComboBox y el mismo modo uso en varios formularios, pero a veces solo necesito cargar solo un combo o a veces mas de 2
Public Sub CARGAR_COMBOS(ByVal strSQL As String, ByVal xCombo1 As ComboBox, ByVal xCombo2 As ComboBox)
xCombo1.Clear
xCombo2.Clear
strSQL = strSQL
rsADO.Open strSQL, cnADO, adOpenStatic, adLockOptimistic, adCmdText
Do Until rsADO.EOF
With rsADO
xCombo1.AddItem .Fields(xId) & "|" & .Fields(xNombre)
xCombo2.AddItem .Fields(xId) & "|" & .Fields(xNombre)
rsADO.MoveNext
End With
Loop
End Sub
Para usarlos hago asi:
Private Sub Command1_Click()
Call CARGAR_COMBOS("SELECT * FROM lista_banco, txtCombo1,txtCombo2")
End Sub
El problema que tengo es que a veces necesito cargar solo un combo y con la funcion que cree tengo que ocultar un combo que nunca voy a usar, tambien solucione creando varios funciones por ejemplo CARGAR_SOLO_UN_COMBO, CARGAR_DOS_COMBOS, etc.
Ojala me entiendan...
-
ja ja que funcion rebuscada :D
Yo tengo algo parecido, pero solo carga un combo.
Se me ocurre, si haces una que solo cargue un combo, y otra que copie contenido de un combo en otro?
De esa manera usas siempre CARGAR_COMBO y si en el proyecto hay otro combo usas COPIAR_COMBO(combo1,combo2)
Algo asi se me ocurre.
-
Siiii jejeje muy rebuscada pero funciona bien solo quiero modernizar por decirlo jeje.
La idea que tengo es por ejemplo:
CALL CARGAR_COMBO("SELECT * FROM lista_banco" aca al poner una coma que me cargue el primer combo, si pongo otro que vaya generado los xCombo segun necesite)
pero si solo pongo un combo que no me pida o no tire error.
-
Podrías probar así:
Public Sub CARGAR_COMBOS(ByVal strSQL As String, ParamArray combos() As Variant)
Dim i as Integer, j As Integer
j = UBound(combos)
for i = 0 to j
Call combos(i).Clear
Next
strSQL = strSQL
rsADO.Open strSQL, cnADO, adOpenStatic, adLockOptimistic, adCmdText
Do Until rsADO.EOF
With rsADO
For i = 0 To j
Call combos(i).AddItem(.Fields(xId) & "|" & .Fields(xNombre))
Next
rsADO.MoveNext
End With
Loop
End Sub
Y así lo podrás cargar con infinitos combos (...bueno, hay un limite, ni idea cual es)
PD: Explota si le mandas algo que no sea un combobox
-
jajaja, que maquina ahora seee muchas gracias amigo Raul
-
Me ganó Raul, yo habia pensado algo asi, de esta forma no da error, pero tiene un limite
Private Sub CargarCombos(oCombo1 As ComboBox, Optional oCombo2 As ComboBox, Optional oCombo3 As ComboBox)
oCombo1.AddItem "UNO"
oCombo1.AddItem "DOS"
If Not oCombo2 Is Nothing Then
oCombo2.AddItem "UNO"
oCombo2.AddItem "DOS"
End If
If Not oCombo3 Is Nothing Then
oCombo3.AddItem "UNO"
oCombo3.AddItem "DOS"
End If
End Sub
-
Buuu por no Leer apropiadamente.....
ya estaba solucionado...!
jeje, Saludos Cordiales a todos...
-
Estimado ENTER
He realizado algunas modificaciones al código publicado por raul338, las mismas que procedo a detallar:- He cambiado de Procedimiento a Función, con la finalidad de saber si tuvo éxito la carga de los ComboBox.
- Para evitar que la función Explote estoy evaluando con la función TypeName que el objeto (control) que se está pasando en el Array sea del tipo ComboBox. La evaluación es de tipol todo o nada.
- Como primer parámetro de la función se pasa un objeto del tipo Ado.Recordset, de esta manera la función se especializa en cargar los ComboBox y no tiene dependencia de variables globales como cnADO, adOpenStatic, adLockOptimistic, adCmdText o de recuperar el recordset. La única dependencia es de ADO por lo que hay que incluir una referencia a Microsoft ActiveX Data Object 2.8 Library
- Para optimizar la invocación de los objetos ADO al momento de realizar la iteración he movido de lugar el With Recordset
Public Function CargarCombos(ByVal Recordset As ADODB.Recordset, ParamArray Combos() As Variant) As Boolean
Dim lngArrayLower As Long
Dim lngArrayUpper As Long
Dim lngCounter As Long
CargarCombos = False
lngArrayLower = LBound(Combos)
lngArrayUpper = UBound(Combos)
' Para evitar que la función Explote estoy evaluando con la función TypeName que el control que
' se está pasando en el Array sea del tipo ComboBox. La evaluación es de tipol todo o nada.
For lngCounter = lngArrayLower To lngArrayUpper
If TypeName(Combos(lngCounter)) <> "ComboBox" Then Exit Function
Next
' Se blanquena cada uno de los ComboBox
For lngCounter = lngArrayLower To lngArrayUpper
objComboBox.Clear
Next
' Se cargan los ComboBox con los valores del Recordset
With Recordset
Do Until .EOF
For lngCounter = lngArrayLower To lngArrayUpper
Call Combos(lngCounter).AddItem(.Fields(xId) & "|" & .Fields(xNombre))
Next
.MoveNext
Loop
End With
CargarCombos = True
End Function
Adicionalmente he implementado otra función que hace uso de For Each y utiliza menos variables. Esta función debería de ser más rápida que la anterior.
Public Function CargarCombos2(ByVal Recordset As ADODB.Recordset, ParamArray Combos() As Variant) As Boolean
Dim objComboBox As Variant
CargarCombos = False
' Para evitar que la función Explote estoy evaluando con la función TypeName que el control que
' se está pasando en el Array sea del tipo ComboBox. La evaluación es de tipol todo o nada.
For Each objComboBox In Combos
If TypeName(objComboBox) <> "ComboBox" Then Exit Function
Next
' Se blanquena cada uno de los ComboBox
For Each objComboBox In Combos
objComboBox.Clear
Next
' Se cargan los ComboBox con los valores del Recordset
With Recordset
Do Until .EOF
For Each objComboBox In Combos
Call Combos(lngCounter).AddItem(.Fields(xId) & "|" & .Fields(xNombre))
Next
.MoveNext
Loop
End With
CargarCombos = True
End Function
Para ambas funciones la pueden invocar de la siguiente manera
blnCargaCombos = CargarCombos(rstCiudades, Combo1, Combo2)
blnCargaCombos2 = CargarCombos2(rstCiudades, Combo1, Combo2)
Saludos, desde algún lugar de Lima-Perú
-
Pregunta offtopic Albertomi:
Por qué no usas las etiquetas de código? Se hace difícil leerlas en el tema oscuro.
-
Una maquina quedo che todo esto muchas gracias amigo.
-
One Little tip: si deshabilitas el Repintado del Form, la carga se acelera un poco más... sobre todo si la cantidad de registros a cargar aumenta
En las Declaraciones....
' Función que deshabilita el repintado de una ventana en windows
Private Declare Function LockWindowUpdate& Lib "User32" (ByVal hwndLock As Long)
Antes de comenzar la Carga de Registros en el Combobox
' Deshabilita el repintado del control para que cargue los datos mas rapidamente
Call LockWindowUpdate(Combos.hWnd)
' Carga los Datos en el ComboBox ...
Call Combos.AddItem(.Fields(xId) & "|" & .Fields(xNombre))
Al terminar la Función
' Habilitar el repintado
Call LockWindowUpdate(0&)
Saludos Cordiales
-
Gracias amigo AxioUK creo que eso me va a servir mas con el control ListView donde suelo cargar mas datos en los combos solo cargo esos datos mas cortitos máximo como 10 a 15 items
Como ves aca en la imagen apenas tiene 5 items.
screen
(http://snag.gy/8DUgW.jpg)
http://snag.gy/8DUgW.jpg