ByRef a Objecto ListBox

Iniciado por Shell Root, 3 Junio 2015, 15:33 PM

0 Miembros y 1 Visitante están viendo este tema.

Shell Root

Tengo este simple código sólo que ahora me la paso más en C# y no recuerdo bien como es en VB.

Tengo una función donde realizo una petición a la base de datos en SQL Server, esta ahi excelente. Pero necesito que desde esa misma función lo cargue a un ListBox, tengo lo siguiente:

Código (vb, 4) [Seleccionar]
Public Sub LoadHours(txtFecha As String, txtTarjeta As String, ByRef Lsb As ListBox)
' [SNIP]
       Do While Not Rs.EOF And Not Rs.BOF
           Lsb.AddItem Rs.Fields(0).Value
            ' Sí lo muestro en un MsgBox se ve correctamente los datos de la DB
           Rs.MoveNext
       Loop
' [SNIP]
End Sub


Se supone que al pasarlo como ByRef me tomaría el objecto del formulario e ingresaría los valores de la función dentro del ListBox.

Código (vb) [Seleccionar]
Call LoadHours(Me.txtFecha.Text, Me.txtTarjeta.Text, Me.lsbHoras)

El caso es que me dice: No coinciden los tipos.
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

tincopasan

probablemente deberías pasar como cadena los valores que quieres agregar al listbox lsb.additem str(etc)

Shell Root

No creo ya que realizo la prueba basica y no me funciona, por ejemplo:

Código (vb,3) [Seleccionar]
       Do While Not Rs.EOF And Not Rs.BOF
           'Lsb.AddItem Rs.Fields(0).Value
           Lsb.AddItem "1"
           Rs.MoveNext
       Loop


A lo que me refiero es que funciona todo correctamente, menos cuando paso or ByRef el objecto ListBox.
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

tincopasan

y si en vez de byref los pasas como byval, aclaro que puedo estar re equivocado hace años que no uso vb

pkj

#4
Es muy raro.
Seguro que es un ListBox?
Yo acabo de probar esto:
En el Form1 tengo este command
Código (vb) [Seleccionar]

Private Sub Command1_Click()
  Form2.PRUEBA Me.List1
End Sub


y en el Form2 tengo esto
Código (vb) [Seleccionar]

Public Sub PRUEBA(ByRef LSB As ListBox)
 LSB.AddItem 22332
 LSB.AddItem "Prueba"
End Sub


Y el listbox recibe las dos líneas sin problemas.

Prueba a convertirlo en cadena:
Código (vb) [Seleccionar]

Lsb.AddItem cStr(Rs.Fields(0).Value)


Suerte

Cita de: tincopasan en  3 Junio 2015, 17:31 PM
y si en vez de byref los pasas como byval, aclaro que puedo estar re equivocado hace años que no uso vb

Si lo pasas ByVal los cambios no afectan al ListBox original.

Saludos

Shell Root

Re-Seguro que si es un Listbox el objecto del formulario y tambien la variable del ByRef!
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

pkj

Prueba con cStr()

Prueba quitando el ByRef, ya que si no pones nada es ByRef (yo por eso siempre pongo byval a casi todo)

Prueba cambiando la declaracion en lugar de declararlo como ListBox hazlo como Variant o como Object (como Variant no se si lo pillara)

Si se me ocurre algo mas ya te aviso :D

Suerte

Shell Root

#7
Realmente es una M13RDA, ya funciona perfectamente. Así,

Código (vb) [Seleccionar]
Public Sub LoadHours(txtFecha As String, txtTarjeta As String, ByRef Lsb As Object)

Gracias!
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

pkj

Hay que echarle imaginacion y no darse por vencido  ;)

BlackZeroX

Cita de: Shell Root en  3 Junio 2015, 15:33 PM
Tengo este simple código sólo que ahora me la paso más en C# y no recuerdo bien como es en VB.

Tengo una función donde realizo una petición a la base de datos en SQL Server, esta ahi excelente. Pero necesito que desde esa misma función lo cargue a un ListBox, tengo lo siguiente:

Código (vb, 4) [Seleccionar]
Public Sub LoadHours(txtFecha As String, txtTarjeta As String, ByRef Lsb As ListBox)
' [SNIP]
        Do While Not Rs.EOF And Not Rs.BOF
            Lsb.AddItem Rs.Fields(0).Value
            ' Sí lo muestro en un MsgBox se ve correctamente los datos de la DB
            Rs.MoveNext
        Loop
' [SNIP]
End Sub


Se supone que al pasarlo como ByRef me tomaría el objecto del formulario e ingresaría los valores de la función dentro del ListBox.

Código (vb) [Seleccionar]
Call LoadHours(Me.txtFecha.Text, Me.txtTarjeta.Text, Me.lsbHoras)

El caso es que me dice: No coinciden los tipos.

Debes usar las interfaces en lugar de las clases asi puedes usar ByVal sin problemas... por ejemplo en JAVA (Que es el que me da de comer actualmente) yo uso List para cualquier clase que herede de esta y no tengo problemas...

Si no mal recuerdo en .Net es List...

Ducles Lunas!¡.
The Dark Shadow is my passion.