[Duda] No me sale utilizar procedimientos con vectores

Iniciado por Dreamaker, 23 Junio 2010, 20:36 PM

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

Dreamaker

Hola chicos, bueno voy a tratar de explicarles lo más breve y directo posible porque recién estoy aprendiendo como usar los procedimientos con vectores y el problema es el siguiente:

Tengo un formulario con una matriz de controles de 3 texbox's y 3 label's donde el usuario ingresa los nombres de 3 personas, y otra matriz de contrles de 3 textbox's y 3 label's también donde el usuario ingresa las edades de esas 3 personas

Lo que yo quiero hacer es, cuando el usuario apreta el botón asignar llame al procedimiento CargarDatos que ingresará por un lado la primer matriz de controles en un Vector que será llamado por parametros que lo cargará con los nombres, y en otro vector por separado las edades que también las recibirá por parametro, luego simpremente escribir en el cmdAsignar_Click la llamada el procedimiento CargarDatos y que cargue todo a los 2 vectores y los muestre por pantalla

Una imagen del form:



Espero que me puedan ayudar, se que es algo sencillo pero no termino de entender como hacerlo y usar los vectores por parametros para la carga, sin procedimiento lo hago de esta manera:

Código (vb) [Seleccionar]
Private Sub cmdCargar_Click()

Dim vectorNombre(3) As String, vectorEdad(3) As Byte

Static x As Byte

'Carga de datos a los vectores

For x = 0 To 2

    vectorNombre(x) = txtNombre(x).Text
    vectorEdad(x) = txtEdad(x).Text
   
Next x

End Sub


Pero yo lo quiero hacer con procedimientos como dije ya que eso me tomarán en el colegio

Muchas gracias y espero alguien se digne a ayudarme :xD

PD: Según dijo el prof los vectores por parametros se pasan ByRef y todos los que no sean vectores Byval, por si acaso

Dreamaker

#1
Ya está chicos  ya me salió, me quedó una duda si me la pueden responder y dejo la solución por si algún novato en ese tema no le sale o no lo sabe

Botón cargar:
Código (vb) [Seleccionar]
Private Sub CargarVector(ByRef vectorN() As String, ByRef vectorE() As Byte)

Static x As Byte

For x = 0 To 2

    vectorN(x) = txtNombre(x).Text
    vectorE(x) = txtEdad(x).Text
   
Next x
   

End Sub


Procedimiento Cargar:
Código (vb) [Seleccionar]
Private Sub CargarVector(ByRef vectorN() As String, ByRef vectorE() As Byte)

Static x As Byte

For x = 0 To 2

    vectorN(x) = txtNombre(x).Text
    vectorE(x) = txtEdad(x).Text
   
Next x
   

End Sub


Procedimiento MostrarVector:
Código (vb) [Seleccionar]
Private Sub MostrarVector(ByRef vectorN() As String, ByRef vectorE() As Byte)

Static x As Byte

For x = 0 To 2
    Print vectorN(x)
    Print vectorE(x)
Next x

End Sub


Yupi!! Me quedó una duda:

En el procedimiento Private Sub cmdCargar_Click() cuando le paso los parametros a los procedimientos, los vectores van con parentesis vacios "()" o con los parentesis y la cantidad de espacios o lugares que contiene este? "(3)" en este caso

Muchas gracias

BlackZeroX


bien mira el proceso de arriba esta mal 0 y 2 jamas deberian ser estaticos y en el proceso si se meten vectores sin inicializar es decir Dim Vector() as tipo  causara un error al igual que si las dimenciones son erroneas!¡.

Código (Vb) [Seleccionar]


Private Function CargarVector(ByRef vectorN() As String, ByRef vectorE() As Byte) As Boolean
Dim x       As Integer
Dim Ini     As Long                                                 '   //  Lbound() devuelve tipo Long.
Dim Fin     As Long                                                 '   //  Ubound() devuelve tipo Long.
   
    If Not ((Not vectorN) = -1) And Not ((Not vectorE) = -1) Then   '   //  Que esten inicialisados (Evitamos On Error Resume Next, On Resume Goto ...).
        Ini = LBound(vectorN)                                       '   //  Un peque respaldo para no usar los procesos muchas veces!¡.
        Fin = UBound(vectorN)                                       '   //  Un peque respaldo para no usar los procesos muchas veces!¡.
        CargarVector = Fin = UBound(vectorE) And _
                       Ini = LBound(vectorE)                        '   //  Si son de la misma longitud.
        If CargarVector Then
            For x = Ini To Fin                                      '   //  Recorremos utilizando las variables Ini y Fin.
                vectorN(x) = txtNombre(x).Text                      '   //  Esto no me gusta pero ni que (Deverian de pasarse).
                vectorE(x) = txtEdad(x).Text                        '   //  Esto no me gusta pero ni que (Deverian de pasarse).
            Next
        End If
    End If
End Function



para eso de los vectores mejor usa el evento de los textbox LostFocus!¡.

Código (vb) [Seleccionar]


option explicit

Dim VectorNombres()         As String
Dim VectorEdades()          As Integer

Private Sub Command1_Click()
    Dim i As Long
    For i = LBound(VectorNombres) To UBound(VectorNombres)
        Debug.Print " Edad: "; VectorEdades(i); " Nombre: "; VectorNombres(i)
    Next
End Sub

Private Sub Form_Load()
    ReDim VectorNombres(txtNombre.LBound To txtNombre.UBound)
    ReDim VectorEdades(txtNombre.LBound To txtNombre.UBound)
End Sub
Private Sub Text1_LostFocus(Index As Integer)
    VectorNombres(Index) = txtNombre(Index).Text
    VectorEdades(Index) = Val(txtEdad(Index).Text)
End Sub

The Dark Shadow is my passion.

Dreamaker

#3
Utilizo procedimientos y no funciones ya que los procedimientos me cargarán los datos y las funciones se utilizan para devolver algo, en este caso no necesito que devuelvan nada sino sólo que los carguen, y no se por qué dices que está mal que X sea estática ya que cuando apreto el boton de Cargar para que no se pierda el valor que tenía la X en el for por ejemplo, le pongo que sea estática para que lo guarde :huh:

Entiendo parcialmente tu código, sólo utilizamos las funciones básicas para crear nuestras propias funciones, nada de Lbound y eso (que sé que es válido)

Osea no entiendo específicamente el error que me quisiste remarcar ;) De todas maneras el código como lo probé funciona..

BlackZeroX

#4
static es usada cuando y solo cuando!¡.

por decir asi

Código (vb) [Seleccionar]


Public Sub Sumar()
Static a As Long
a = a + 1
Debug.Print a
End Sub

Private Sub Form_Load()
   Call Sumar
   Call Sumar
   Call Sumar
   Call Sumar
   Call Sumar
End Sub




en total en la ventana inmediato a valdra

1
2
3
4
5


en cambio con si enlugar de static usas dim siempre sera


1
1
1
1
1


Ahora en un for Es TONTO usar Static ya que static preservera un valor AUN despues de hacer terminado su proceso es decir SEGUIRA EN MEMORIA!¡, DIm por otro lado solo es una variable Temporal-Local del proceso.

y DIm es mejor para un For-Next

MSDN declaracion con STATIC http://msdn.microsoft.com/es-es/library/z2cty7t8(VS.80).aspx
MSDN declaracion con Dim http://msdn.microsoft.com/en-us/library/7ee5a7s1(VS.80).aspx

Ahora yo use una funcion ya que (Me Cito a mi mismo en el Post Anterior)!¡

Cita de: BlackZeroX▓▓▒▒░░ en 23 Junio 2010, 21:34 PM

bien mira el proceso de arriba esta mal 0 y 2 jamas deberian ser estaticos y en el proceso si se meten vectores sin inicializar es decir Dim Vector() as tipo  causara un error al igual que si las dimenciones son erroneas!¡.

...


En castellano: lo puse como funcion ya que si es un proceso, ya que me gustaria saber si realmente se ha procesado la informacion asi que un sub no valdria en especial cuando tal vez las dimenciones de ampos Array's en los parametros NO SON de dimenciones indenticas o NO ESTAN INICIALIZADAS!¡.

Ahora la funcion devuelve true si todo a salido correctamente y false si hay algo erroneo en los parametros/proceso!¡.

Dulce Infierno Lunar!¡.
The Dark Shadow is my passion.

Dreamaker

Muchas gracias BlackZeroX▓▓▒▒░░ ahora si está claro ;)