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.