Resumen Rutinas para combos   (2 mensajes )

Mensaje enviado por "Eric Pap" <eric@ksistemas.com>

Bueno.. y para colaborar un poco con el tema de los combos, les mando otra alternativa a lo que propone Oswaldo.El codigo de una funcion que hice para llenar uno o mas combos, que realmente me ha andado de maravillas.

Public Sub LlenarCombo(Tabla As String, CampoTexto As String, _
CampoIndice As String, Orden As String, ParamArray Combos() As Variant)
Dim i As Integer
Dim Llenado As Recordset
sql = "SELECT * FROM " & Tabla & " ORDER BY " & Orden
Set Llenado = MiBaseDatos.OpenRecordset(sql, dbOpenDynaset)
Screen.MousePointer = vbArrowHourglass
DoEvents 'servira?
Do While Not Llenado.EOF
    For Each ComboBox In Combos
        ComboBox.AddItem UnNull(Llenado, CampoTexto)
        ComboBox.ItemData(ComboBox.NewIndex) = Llenado(CampoIndice)
    Next
    Llenado.MoveNext
Loop
Llenado.Close
Screen.MousePointer = vbDefault
End Sub

Donde:
Tabla: Nombre de la tabla origen de los datos.. puede contener una clausura where, join , etc...(Ej:"Clientes", "Clientes WHERE Tipo=1"...)

CampoTexto: El campo de la tabla que llena la parte de texto del control
CampoIndice: El campo de la tabla que llena los indices(prop. ItemData)
Orden: Campo por el que ordeno
Combos():Coleccion de combos a llenar(ej, Combo1, Combo2,....)

Espero que les sirve y se aceptan sugerencias. jeje

saludos

Eric
eric@ksistemas.com

Mensaje enviado por "Oswaldo D'Acevedo" <Oswaldo@heuristika.com>

La siguiente es una adaptacion a unas subrutinas que usamos aca y que les pudiera ser de utilidad: Ambas pueden ponerlas en un Modulo BAS

Option Explicit

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 Sub SetListIndex(lst As Control, _
    ByVal NewIndex As Long)
    Const CB_GETCURSEL = &H147
    Const CB_SETCURSEL = &H14E
    Const LB_SETCURSEL = &H186
    Const LB_GETCURSEL = &H188
    If TypeOf lst Is ListBox Then
        Call SendMessage(lst.hwnd, _
            LB_SETCURSEL, NewIndex, 0&)
    ElseIf TypeOf lst Is ComboBox Then
        Call SendMessage(lst.hwnd, _
            CB_SETCURSEL, NewIndex, 0&)
    End If
End Sub
Public Sub LoadCombos(MyCmbOri As Control, ParamArray pCombo() As Variant)
   Dim II As Integer, JJ As Integer
   On Error GoTo hError
   For II = 0 To UBound(pCombo)
       If (TypeOf pCombo(II) Is ComboBox Or TypeOf pCombo(II) Is ListBox) Then
            pCombo(II).Clear
            If Not (MyCmbOri.ListCount = 0) Then ''Cuando tiene informacion
               For JJ = 0 To MyCmbOri.ListCount - 1
                    MyCmbOri.Visible = False
                    SetListIndex MyCmbOri, JJ
                    'MyCmbOri.ListIndex = JJ
                 pCombo(II).AddItem MyCmbOri
               Next JJ
            Else
                Exit Sub
            End If
       Else
            MsgBox ("los controles a llenar deben ser o ComboBoxes o ListBoxes"), vbCritical
            Exit Sub
       End If
   Next II
   Exit Sub
hError:
MsgBox "Error: " & Str(Err) & " " & Error$, vbExclamation
End Sub

La primera "SetListIndex" es una funcion que la copiamos de VBJM (magazine especializado en VB) y que recibiendo un control ComboBox o ListBox y un entero (que debe ser el index de uno de sus Items) posiciona el puntero del Combo o List box en dicho Item. La gran ventaje de esto es que no "Dispara" el evento Click del Combo o List Box , evitando al programador tener que poner "banderas" para evitar eventos "clicks" indeseables (casi siempre ocurriendo el el momento de la carga de la data).

(la declaracion de SendMessage es necesaria para esta subrutina).

La sintaxis es la siguiente

SetListIndex cbmCombo1, NuevoIndex

La segunda Subrutina es una que prepare (en nuestro caso recibe un Recorset y el nombre de un campo del mismo) que recibe un ComboBox o ListBox (la fuente podriamos decir) y puebla un numero indefinido de ComboBoxes o ListBoxes.
En la subrutina deje la opcion de SetListIndex como la usada para posisionarse en la linea que se quiere copiar, pero esta "Remeada" la opcion clasica de La propidad ListIndex (la que dispara el evento click)por si no desean usar la subrutina SetListIndex.

La sintaxis de Llamada seria:

Asumamos que El Combo Origen se llama cmbOriginal y esta en un Form llamado frmOriginal y que esta cargado Asumamos que hay N (de 1 a N) combos (cmbDestinoN) distino y que ademas estan en N forms (de 1 a N, iguales o diferentes, llamdos frmDestinoN ).

LoadCombos frmOriginal.cmbOrigen, frmDestino1.cmbDestino1, rmDestino2.cmbDestino2, ..., frmDestinoN.cmbDestinoN

Un caso particular en el que todos los combos (origen y destino) estan en un form llamado Form1 donde combo1 es el origen y combo2 y combo3 son los destinos, la sintaxis seria

LoadCombos combo1, combo2, combo3

A Eric le podria ser util, aunque no es lo que espera. Esta noche tratare de ver si hay alguna manera (mediante una funcion API tal vez) de asignar en Bloque todos miembros de un combo a otro (como el lo plantea).

Saludos

Oswaldo D'Acevedo

PD. si a alguien le interesa un ejemplo (un pequeño proyecto en VB) que me lo deje saber, con gusto le enviare.



Resumen Resumen

Visual Basic Página de Visual Basic

Página principal Página principal

www.jrubi.com