Visual Basic Foro

Programación => Visual Basic 6 => Mensaje iniciado por: E N T E R en Octubre 07, 2014, 02:45:24 pm

Título: [AYUDA] Mejorar esta funcion
Publicado 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

Código: (VB) [Seleccionar]
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:

Código: (VB) [Seleccionar]
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...
Título: Re:[AYUDA] Mejorar esta funcion
Publicado por: Waldo en Octubre 07, 2014, 03:39:02 pm
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.

Título: Re:[AYUDA] Mejorar esta funcion
Publicado por: E N T E R en Octubre 07, 2014, 03:47:35 pm
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.
Título: Re:[AYUDA] Mejorar esta funcion
Publicado por: raul338 en Octubre 07, 2014, 03:57:04 pm
Podrías probar así:

Código: (vb) [Seleccionar]
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
Título: Re:[AYUDA] Mejorar esta funcion
Publicado por: E N T E R en Octubre 07, 2014, 04:00:10 pm
jajaja, que maquina ahora seee muchas gracias amigo Raul
Título: Re:[AYUDA] Mejorar esta funcion
Publicado por: Waldo en Octubre 07, 2014, 04:01:06 pm
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
Título: Re:[AYUDA] Mejorar esta funcion
Publicado por: AxioUK en Octubre 08, 2014, 03:15:56 am
Buuu por no Leer apropiadamente.....

ya estaba solucionado...!

jeje, Saludos Cordiales a todos...
Título: Re:[AYUDA] Mejorar esta funcion
Publicado por: Albertomi en Octubre 08, 2014, 02:10:39 pm
Estimado ENTER
 
He realizado algunas modificaciones al código publicado por raul338, las mismas que procedo a detallar: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ú
Título: Re:[AYUDA] Mejorar esta funcion
Publicado por: raul338 en Octubre 08, 2014, 08:03:02 pm
Pregunta offtopic Albertomi:
Por qué no usas las etiquetas de código? Se hace difícil leerlas en el tema oscuro.
Título: Re:[AYUDA] Mejorar esta funcion
Publicado por: E N T E R en Octubre 08, 2014, 08:48:30 pm
Una maquina quedo che todo esto muchas gracias amigo.
Título: Re:[AYUDA] Mejorar esta funcion
Publicado por: AxioUK en Octubre 08, 2014, 10:48:10 pm
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....
Código: (VB) [Seleccionar]
' 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
Código: (VB) [Seleccionar]
         ' 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
Código: (VB) [Seleccionar]
' Habilitar el repintado
  Call LockWindowUpdate(0&)


Saludos Cordiales
Título: Re:[AYUDA] Mejorar esta funcion
Publicado por: E N T E R en Octubre 09, 2014, 08:48:55 am
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