Ayer, haciendo yo una cosilla con un combo, desde Access XP, voy todo chulo y para agregar elementos voy y planto: Micombo.AddItem y funciona claro. No me daba cuenta (Emilio Martín y Juan me lo dijeron mas tarde) que el método AddItem del cuadro combinado no existe en la Version 2000 de Access. Bien.... Pregunta: ¿Se puede añadir un metodo a un control de Access de una forma elegante? En su defecto, si lo anterior no es posible: Al igual que en Visual existen las sentencias #if #else....¿Se podría escribir código alternativo dependiendo de la versión Access que tenga el usuario. #If AccessXP combo.Additem #else 'meter elementos al Combo mediante RowSource concadenado Es que por ejemplo, para 'redefinir' una función de VBA, basta con declararla en un modulo. Si yo quiero un Msgbox personalizado, creo la funcion Msgbox Function Msgbox(bla bla bla) End Function y de esta forma queda machacada la Msgbox original de VBA.(Que siempre se podrá llamar con VBA.Msgbox....) Pues algo parecido pretendería hacer yo con los metodos, en este caso, crear el AddItem en Access 2000..... ¿Se puede? RESPUESTAS DE ESTE INTERSANTE HILO ================================== Juan. M.Afan de Ribera ---------------------- Hola Paco, con esto sabrías la versión de access (en este caso XP): If SysCmd(acSysCmdAccessVer) = "10.0" Then ... EDUARDO OLAZ ------------ En principio veo algo complicado añadir un método a un control; así a prior, no se me ocurre cómo hacerlo. Lo que se podría hacer es crear una clase a la que se le asigne un cuadro de lista o un combo y crear los métodos correspondientes en la clase que añadan, quiten o modifiquen los elementos del control asignado. También se podrían crear esos métodos en el propio módulo de clase del formulario. Lo voy a mirar. De todas formas a un formulario se le pueden añadir métodos, porque tenemos acceso a sumódulo de clase asociado, pero eso no pasa con los controles. En otros lenguajes, como Delphi, sí que podríamos hacerlo; con Net no lo se. CHEA ---- Una alternativa a usar a propiedad RowSource sería asignar una función a la propiedad "Tipo de origen de la fila". Yo lo tengo hecho en http://usuarios.lycos.es/jbchea/Combos.zip, en "Otra forma de llenar combos" y me parece que tú también lo tienes en algún sitio. La función tomaría los datos de una colección y, para añadir o quitar valores, se podrían utilizar directamente los métodos Add y Remove de la Collection, con un simple requery del combo se acualizaría a los nuevos datos. http://usuarios.lycos.es/jbchea/Combos.zip Y sigue CHEA: ------------- El movimiento se demuestra andado. Con un cuadro combinado en el pusiéramos en la propiedad "Tipo de origen de la fila" = OrigenCombo, podríamos utilizar el siguiente código: Option Compare Database Option Explicit Dim colItems As New Collection, stItem As String Private Function OrigenCombo(campo As Control, id As Long, fila As Long, Col As Long, código As Integer) Dim ValRetorno ValRetorno = Null Select Case código Case LB_INITIALIZE 'Inicializar. ValRetorno = colItems.Count Case LB_OPEN 'Abrir. ValRetorno = Timer 'ID único para control. Case LB_GETROWCOUNT 'Número de filas. ValRetorno = colItems.Count Case LB_GETCOLUMNCOUNT 'Número de columnas. ValRetorno = 1 Case LB_GETCOLUMNWIDTH 'Anchura de columna. ValRetorno = -1 'Usar la anchura predeterminada. Case LB_GETVALUE 'Obtener los datos. ValRetorno = colItems(fila + 1) 'fila empieza en 0 y la colección en 1 Case LB_END 'Terminar End Select OrigenCombo = ValRetorno End Function Public Sub Prueba() Dim stItem As String, i As Integer For i = 1 To 1000 stItem = Str(i) colItems.Add stItem Next i [Cuadro combinado0].Requery End Sub -- ATRACTOR ======== Hola Paco, si me permites la confianza, precisamente en tu Web tienes una base datos access 97 que se llama respant.zip, que fue una adaptación que hice, en su día, para access 97 de un ejemplo que había en la web del Guille sobre cambiar la resolución de pantalla. Precisamente una de las cosas que hubo que modificar fue el poder llenar un cuadro de lista, careciendo del método AddItem. Pues lo dicho, por si te sirve, lo tienes en tu propia web. Un Saludo. Efectivamente en dicho fichero se recoge un buen metodo para rellenar este tipo de controles sin el metodo AddItem http://www20.brinkster.com/accessbhuo/id.asp?topico=55 ahí puedes bajarte el ejemplo de Atractor y ver su tecnica para rellenar este tipo de controles (EN este caso un cuadro de lista) EDUARDO OLAZ DE NUEVO CON UN CODIGO MUY BUENO ============================================= He creado un formulario con un ComboBox cmbCombo1 y dos Botones cmdQuitarDato y cmdAñadirDato Aparte tengo un módulo con las funciones ActualizarColeccion ActualizarCombo AñadirElemento EliminarElemento DescargarColeccion En el módulo de clase del formulario pongo: ________________________________ Option Compare Database Option Explicit Dim ColCombo1 As New Collection Private Sub cmdQuitarDato_Click() cmbCombo1_RemoveItem cmbCombo1 ActualizarCombo cmbCombo1, ColCombo1 End Sub Private Sub cmdAñadirDato_Click() Static lngAñadido As Long Dim strDato As String lngAñadido = lngAñadido + 1 strDato = "Dato Añadido " & lngAñadido cmbCombo1_AddItem strDato cmbCombo1 = strDato End Sub Private Sub Form_Load() cmbCombo1.RowSourceType = "Value List" 'Establezco unos valores para el combo box cmbCombo1.RowSource = "Dato 01;Dato 02;Dato 03;Dato 04;Dato 05" ' Actualizo la colección asociada al combo ActualizarColeccion cmbCombo1, ColCombo1 End Sub Public Sub cmbCombo1_AddItem(Elemento As String, Optional Posicion As Long = 0) AñadirElemento Elemento, ColCombo1, ColCombo1.Count + 1 ActualizarCombo cmbCombo1, ColCombo1 End Sub Public Sub cmbCombo1_RemoveItem(Elemento As String) EliminarElemento Elemento, ColCombo1 ActualizarCombo cmbCombo1, ColCombo1 If ColCombo1.Count > 0 Then cmbCombo1 = ColCombo1.Item(1) Else cmbCombo1 = "" End If End Sub Private Sub Form_Unload(Cancel As Integer) 'Descargamos la colección DescargarColeccion ColCombo1 End Sub ________________________________ El código del módulo es: ________________________________ Option Compare Database Option Explicit Public Sub ActualizarColeccion(Combo As ComboBox, Coleccion As Collection) 'Cargamos en la colección los datos del combo Dim i As Long For i = 0 To Combo.ListCount - 1 Coleccion.Add Combo.ItemData(i) Next If Combo.ListCount Then Combo = Coleccion(1) End If End Sub Public Sub ActualizarCombo(Combo As ComboBox, Coleccion As Collection) Dim i As Long Dim strRowSource As String For i = 1 To Coleccion.Count strRowSource = strRowSource & Coleccion.Item(i) If i < Coleccion.Count Then strRowSource = strRowSource & ";" End If Next i Combo.RowSource = strRowSource End Sub Public Sub AñadirElemento(Elemento As String, Coleccion As Collection, Posicion As Long) Dim lngElementos As Long lngElementos = Coleccion.Count Select Case Posicion Case Is < 1 Coleccion.Add Elemento, , 1 Case Is > lngElementos Coleccion.Add Elemento Case Else Coleccion.Add Elemento, , Posicion End Select End Sub Public Sub EliminarElemento(Elemento As String, Coleccion As Collection) Dim i As Long For i = 1 To Coleccion.Count If Coleccion.Item(i) = Elemento Then Coleccion.Remove (i) Exit Sub End If Next End Sub Public Sub DescargarColeccion(Coleccion As Collection) Dim i As Long For i = Coleccion.Count To 1 Step -1 Coleccion.Remove (i) Next End Sub