Visual Basic - Clase dentro de clase VB6

Life is soft - evento anual de software empresarial
 
Vista:

Clase dentro de clase VB6

Publicado por Lago GZ (1 intervención) el 28/06/2012 14:29:04
Buenas tardes.

Estoy intemtando crear una clase que tenga como propiedad otra clase. Pongo el código y me explico.

--------------------Clase A--------------------------
Private thisNombre As String
Private thisApellidos As String
Private thisNIF As String

Public Property Get Nombre() As String
Nombre= thisNombre
End Property

Public Property Let Nombre(pNombre As String)
thisNombre = pNombre
End Property

Public Property Get Apellidos() As String
Apellidos= thisApellidos
End Property

Public Property Let Apellidos(pApellidos As String)
thisApellidos = pApellidos
End Property

Public Property Get NIF() As String
NIF= thisNIF
End Property

Public Property Let NIF(pNIF As String)
thisNIF = pNIF
End Property

-------------------------Clase B----------------------------
Private thisIdCliente As Integer
Private thisClientes() As A

Private Sub Class_Initialize()
ReDim thisClientes(1)
End Sub

Public Property Get IdCliente() As Integer
IdCliente= thisIdCliente
End Property

Public Property Let IdCliente(pIdCliente As Integer)
thisIdCliente = pIdCliente
End Property

Public Property Get Clientes() As A()
Set Clientes= thisClientes
End Property

Public Sub SetCliente(pNome As String, pApelidos As String, pNIF As String)

If UBound(thisClientes) < 0 Then
ReDim thisClientes(1) '
Else
ReDim Preserve thisClientes(UBound(thisClientes) + 1)
End If

Set thisClientes(UBound(thisClientes)) = New A

With thisClientes(UBound(thisClientes))
.Nome= pNome
.Apelidos= pApelidos
.NIF = pNIF
End With
End Sub

Este es el código de ambas clases. La propiedad Clientes de la clase B no tiene la parte Let ni Set, pero creo el procedimiento SetCliente q lo q hace es rellenar la matriz de clases de A. Entonces en teoría al llamar desde por ejemplo un formulario a esta propiedad, gracias la parte Get de la propiedad me tendría q rellenar esta propiedad vien,no?

En otro formulario pongo un botón para probar la funcionalidad de la clase con el siguiente código:

Private Sub Command1_Click()
Dim Prueba As New B

Call Prueba.SetCliente( "nome1","apelido1", "nif1") 'LÍNEA DE EROR
Call Prueba.SetCliente("nome2","apelido2", "nif2)

Call MsgBox(Prueba.Beneficiarios(1).Nome)
Call MsgBox(Prueba.Beneficiarios(2).Nome)

Set Prueba = Nothing
End Sub

Y me da el siguiente error en la línea q tengo marcada como LÍNEA DE ERROR:

Error de compilación: número de argumentos erróneo o asignación de propiedad no válida.

Imagino q el problema será al recuperar la propiedad, pero la verdad llevo toda la mañana probando mil cosas y nada.

Un saludo y gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

[RESUELTO] Clase dentro de clase VB6

Publicado por Lago GZ (12 intervenciones) el 29/06/2012 09:24:14
Buenos días.

Pues seguí bucando y probando cosas y ya lo tengo. No esperaba q se comportase así este lenguaje, pero bueno. Me obliga a pasarle a las propiedades declaradas valores del mismo tipo (lo cuál es lógico), con lo q me obliga a crear clases fuera de la clase principal. Puede hacerse de 2 maneras, con el objeto Collection o con colecciones personalizadas (arrays de objetos).Me explico:

1- Con el objeto Collection:

---------------------Clase clsB---------------------

Private thisCampoB As String

Public Property propB Get() As String
propB = thisCampoB
End Property

Public Property propB(pCampoB As String)
thisCampoB = pCampoB
End Property

----------------------------Clase clsA------------------------
private thisColeccion As Collection

Private Sub Class_Initialize()
Set thisColeccion = New Collection
End Sub

Private Sub Class_Terminate()
Set thisColeccion = Nothing
End Sub

Public Property Get propA() As Collection
Set propA= thisCollecion
End Property

Public Property Set propA(pColeccion As Collection)
Set thisColeccion = pCollecion
End Property

---------------------Uso, por ejemplo en el click de un botón---------------------
Dim obxB As New clsB
Dim obxA As New clsA
dim cColeccion as New Collection

obxB.Campo = "jkhkjH"
Call cColeccion.Add(obxB)

Set obxA.propA = cColeccion

Call MsgBox(obxA.propA.Campo) 'Esto mostrará "jkhkjH".

Set obxB=Nothing
Set obxA=Nothing
Set cColeccion=Nothing

2- Con array de clases:

La clase clsB sería la misma.

------------------------Clase clsA-------------------------
Private thisB() As clsB

Private Sub Class_Initialize()
ReDim thisB(1)
End Sub

Public Property Get propA(i As Integer) As clsB
If i >= 0 And i <= UBound(thisB) Then
Set propA=thisB(i) ‘ O sin Set
End Property

Public Property Let propA(i As Integer, pB As clsB)
If i >= 0 And i <= UBound(thisB) Then
Set thisB(i) = pB ‘ O sin Set
End If
End Property

Private Sub Class_Terminate()
Set thisB = Nothing
End Sub

---------------------Uso, por ejemplo en el click de un botón---------------------
Dim a As New clsA
Dim b As New clsB

b.Campo = "jkhjkH"

a.propA(1) = b

Call MsgBox(a.propA(1).Campo)

Set a = Nothing
Set b = Nothing

Q pasa, q dentro del click del botón debo declarar objetos para pasárselos a la clase. Yo lo q quería era rellenar los datos de la clase clsB dentro de la clase clsA mediante un procedimiento o función dentro de esta última, a la q se le pasarían los valores de las propeidades de clsB. Lo q fuí capaz es de recuperar despues la propiedad, ya q no estaría declarada la parte Let y la variable sería privada.

E utilizado colecciones pq me parece más efectivo a la hora de eliminar objetos de la misma, ya q no hay q clonar la matriz.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

[RESUELTO] Clase dentro de clase VB6

Publicado por Lago GZ (12 intervenciones) el 29/06/2012 09:26:01
Esta frase "Lo q fuí capaz es de recuperar despues la propiedad, ya q no estaría declarada la parte Let y la variable sería privada." cambiarla por "Lo q NO fuí capaz es de recuperar despues la propiedad, ya q no estaría declarada la parte Let y la variable sería privada."
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

[RESUELTO] Clase dentro de clase VB6

Publicado por Lago GZ (12 intervenciones) el 29/06/2012 09:36:32
En la segunda forma de hacerlo eliminar

Private Sub Class_Terminate()
Set thisB = Nothing
End Sub

Os dará error de q no sepuede asignar matriz.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

[RESUELTO] Clase dentro de clase VB6

Publicado por Lago GZ (12 intervenciones) el 29/06/2012 09:42:03
Y también se me olvidó poner

ReDim Preserve thisCliente(i)

para la segunda forma dentro de PublicProperty Let propA.

Ponerla como 1ª línea de esta propeidad.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

[RESUELTO MUCHO MEJOR]

Publicado por Lago GZ (12 intervenciones) el 29/06/2012 09:50:38
Dios mío, soy un melón.

Tuve la solución más fácil delante de mi todo el tiempo y no la ví. Es verdad eso q dicen q cuando estás atascado te pongas a otra cosa y ya vendrá la solución.

------------------Clase clsCliente-----------------------
Private thisNome As String

Public Property Get Nome() As String
Nome = thisNome
End Property

Public Property Let Nome(pNome As String)
thisNome = pNome
End Property

----------------------Clase clsVentas----------------------
Private thisCliente() As clsCliente

Private Sub Class_Initialize()
ReDim thisCliente(1)
End Sub

Public Property Get Cliente(i As Integer) As clsCliente
If i >= 0 And i <= UBound(thisCliente) Then
Set Cliente = thisCliente(i)
End If
End Property

Public Sub SetCliente(i As Integer, scNome As String)
Dim a As New clsCliente

a.Nome = scNome

ReDim Preserve thisCliente(i)

Set thisCliente(i) = a

Set a = Nothing
End Sub

-------------------------Uso por ejemplo dentro del evento click de un botón----------------------------
Dim b As New clsVentas

Call b.SetCliente(1, "nome1")
Call b.SetCliente(2, "nome2")

Call MsgBox(b.Cliente(1).Nome)
Call MsgBox(b.Cliente(2).Nome)

Set a = Nothing
Set b = Nothing

Y listo.

Q cabeza!!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

[RESUELTO MUCHO MEJOR 2]

Publicado por Lago GZ (12 intervenciones) el 29/06/2012 15:04:25
Y por supuesto lo anterior se puede hacer con colecciones, a gusto del consumidor.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

[RESUELTO MUCHO MEJOR]

Publicado por NICO (1 intervención) el 23/07/2012 22:00:39
HOLA AMIGOS, TENGO ESTE PROBLEMA, ME SALE ESTE MSJE CUANDO EJECUTO PARA IMPRIMIR EN DATA REPORT :

"numero de argumentos erroneo o asignacion de propiedad no valida" en vb6.

Alguna sugerencia para que muestre el dato que quiero en el reporte.....porsiacaso es un ComboBox donde selecciono lo que quiero que muestre en el datareport pero me sale ese error antes mencionado al ejecutarlo.

Adjunto mi codigo:

Private Sub Command1_Click()
On Error GoTo Error_reporte

' Cargar el DataEnvironment

Load DataEnvironment3

With DataEnvironment3

' Si el comando está abierto

If .rsCommand3.State <> 0 Then

.rsCommand3.Close

End If

' Pasar al comando la letra como parámetro

.Command3 Combo2.Text
'.Command2 Combo2.Text
'.Command2 Text3.Text
'.Command2 Text9.Text

Set rs = conexion.Execute(MONITOREO)

End With

With DataReport5

' Refrescar y hacer visible el reporte

.Refresh

If .Visible = False Then

.Show

End If

End With

' Excepciones

' ------------------------

Exit Sub

Error_reporte:

MsgBox Err.Description, vbCritical, "Número de error: " & Err.Number

End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

[RESUELTO MUCHO MEJOR]

Publicado por Lago GZ (12 intervenciones) el 24/07/2012 08:08:56
Buenos días NICO.

1- Q tiene q ver eso con lo q yo pregunté....???

2- A tu pregunta, los pará,etros creo q no se pasan así. Sería:

comando.Parameters(1).Value = "param de entrada 1"
comando.Parameters(2).Value = "param de entrada 2"

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar