Apúntate...


Consultas, desarrollo de programas y petición de presupuestos:

Mostrando entradas con la etiqueta objetos. Mostrar todas las entradas
Mostrando entradas con la etiqueta objetos. Mostrar todas las entradas

sábado, 29 de diciembre de 2012

Recorrer un array de clases: For Each.....

Un array de objetos se puede recorrer con un simple bucle for ... next

Print "Edad", "Nombre (descendiente)"
For a = 0 To listaPersonas.Max
Print listaPersonas[a].edad, listaPersonas[a].nombre
Next


Pero tambien podemos usar este bucle: For Each...

'Recorrer un array de clases usando: For Each.....
For Each per In listaPersonas
Print per.edad, per.nombre
Next
siendo más legible y entendible a simple vista.

Nota:
Tanto la variable "a" como "per" deben de ser definidas antes de usar el código

Dim a As Integer 'para el for..next
Dim per As New ClassPersona ' para el for each


Este ejemplo es una ampliación del ejemplo anterior (enlace)

Propiedades y Métodos (.add, .remove, .find, etc) de array de objetos

Propiedades y Métodos aplicables a array de objetos


Propiedades
bounds Retorna una cadena, que informa sobre el tipo de clase
count Devuelve el numero de elementos que tiene el array
data Retorno el puntero del dato
dim Retorna el numero de dimensiones del arrray
length Igual que count
max Devuelve el mayor indice del array: array.max=array.count-1
type Devuelve el tipo de dato. (ver: Constantes predefinidas de tipo de dato)
Métodos
Clear Limpia el array.
.Clear ( )
Remove Borra uno o mas elementos del array
.Remove ( Index As Integer [ , Length As Integer ] )
Resize Cambia el tamaño del array disminuyendolo o expandiendolo (solo es posible usarlo en array de una dimension)
.Resize ( Size As Integer )
add Añada (o inserta en la posicion indicada) un nuevo elemento nuevo.
.Add ( Value As Object [ , Index As Integer ] )
copy Retorna la copia de parte del array
.Copy ( [ InicioIndice As Integer, Longitud As Integer ] ) As Object[]
delete Borrar parte del array, retornandolo
.Delete ( InicioIndice As Integer [ , longitud As Integer ] ) As Object[]
exist Devuelve verdadero si existe la referencia al objeto dentro del array
.Exist ( Value As Object ) As Boolean
existbyref Al igual que el método exist, pero sin usar el metodo especial _compare
extract Igual que delete
fill Rellena un array con un objeto determinado
.Fill ( Value As Object [ , Start As Integer, Length As Integer ] )


find Busca un objeto dentro del array devolviendo la posicion donde que ocupa. Si no lo encuentra devuelve -1. Se puede indicar una posicion de inicio de la busqueda.
.Find ( Value As Object [ , Start As Integer ] ) As Integer
findbyref Al igual que find, pero sin usar el metodo especial _compare
insert Inserta un array de objetos dentro del mismo array, se puede especificar una posicion, sino, lo hará al final del array.
.Insert ( Array As Object[] [ , Pos As Integer ] ) As Object[]




pop Borra el último elemento del array, retornandolo.
.Pop ( ) As Object
push Añade un array al final del array (es una simplificacion del método .add)
.Push ( Value As Object )
reverse Invierte el orden del array de elementos y los devuelve
.Reverse ( ) As Object[]
sort Ordena el array Ascententemente (gb.ascent) o descendentemente (gb.descent)
Para ordenalo usa el método especial _compare
.Sort ( [ Mode As Integer ] ) As Object[]

Para más información:
Arrays tipo cadena de caracteres[]: http://gambaswiki.org/wiki/comp/gb/string[]?l=es


A continuación pongo un ejemplo, de como usar el método sort en un array de de objetos.
Tenemos una clase llamada ClassPersona, en ella tenemos dos propieades (nombre y edad). Queremos que los array que de esta clase se ordene por el nombre (en la documentacion de gambaWiki, viene ordenado por la edad (vease este enlace).

Este seria el código de la clase ClassPersona:
-->
' Gambas class file
Property edad As Integer
Private hedad As Integer

Property nombre As String
Private hnombre As String

Private Function nombre_Read() As String
Return hnombre
End

Private Sub nombre_Write(Value As String)
hnombre = Value
End

Private Function edad_Read() As Integer
Return hedad
End

Private Sub edad_Write(Value As Integer)
hedad = value
End

Public Function _compare(Other As ClassPersona) As Integer
' Return Sgn(hedad - Other.edad)
If hnombre > Other.nombre Then Return 1
Return -1
End
Nota:
Fijaos que el en método especial _compare, he puesto comentado como seria ordenando por la edad.

Ahora pasamos a crear el programa principal, donde creo el array de objetos (listaPersonas) y los voy a ordenar y mostrar de forma ascendiente y descendiente:
-->
Dim a As Integer 'contador para el for...next
Dim per As New ClassPersona 'objeto que nos sirve para ir añadiendo valores al array
Dim listaPersonas As ClassPersona[] 'array de objetos de la clase ClassPersona
per.edad = 23
per.nombre = "Eva Muñoz"
listaPersonas = New ClassPersona[]
listaPersonas.Add(per) 'añado nuevo elemento al array
per = Null 'borro el objeto

per = New ClassPersona
per.edad = 34
per.nombre = "Julio Sanchez"
listaPersonas.Add(per) 'añado nuevo elemento al array

 'ordeno....
listaPersonas = listaPersonas.Sort(gb.Ascent)
'muestro en la consola los valores de los objetos
Print "Edad", "Nombre (ascendiente)"
For a = 0 To listaPersonas.Max
Print listaPersonas[a].edad, listaPersonas[a].nombre
Next
'ahora los muestro de forma descendiente:
listaPersonas = listaPersonas.Sort(gb.Descent)
'muestro en la consola los valores de los objetos
Print "Edad", "Nombre (descendiente)"
For a = 0 To listaPersonas.Max
Print listaPersonas[a].edad, listaPersonas[a].nombre


Enlace del ejemplo completo: codigo completo

jueves, 27 de diciembre de 2012

Arrays: Propiedades y Métodos

Un arreglo de objetos de clase es útil cuando se requieren instancias múltiples de la misma clase.

Hay dos formas en las que se pueden relacionar los arreglos con los objetos:

  • Un arreglo puede contener elementos de tipo objetos
  • Una clase puede contener como atributos variables de tipo arreglo


Vamos a hacer un ejemplo con la 2º forma.

Ejemplo: Queremos llevar la gestión de articulos de una pequeña tienda.

Para ello vamos a usar 2 clases:
La clase ClassArticulo: contiene los datos del articulos ademas de varios metodos para modificar los datos del mismo
La clase ClassListaArticulo: contiene un array de objetos de la clase ClassArticulo, mas varios métodos para modificar este array (añadir articulos, buscar, registrar llegadas y salidas de articulos y ver un inventarios de los articulos existentes).

ClassArticulo:
Los articulos tienen las siguientes propiedades:
clave: es un numero que identifica el articulo de una manera unica, por ejemplo 11034
existencia: es un numero que indica la cantidad existente en el almacen de un determinado articulo
precio: precio del articulo

Ademas tiene varios métodos:
inicializa: le dá valores a las propiedades, clave, existencia y precio del objeto articulo
registraEntrada: indica que en el almacen han entrado un determinado numero
registraSalida: indica que del almacen han salido un determinado numero , ademas hace una comprobación, si la salida supera al numero de existencias, te indica un mensaje de error, y no saca ningun articulo.


' Gambas class file

Property clave As Integer
Private hclave As Integer

Property existencia As Integer
Private hexistencia As Integer

Property precio As Float
Private hprecio As Float

Public Sub inicializa(ValorClave As Integer, ValorExistencia As Integer, ValorPrecio As Float)
hclave = ValorClave
hexistencia = ValorExistencia
hprecio = ValorPrecio
End

Public Sub registraEntrada(cant As Integer)
hexistencia += cant
End

Public Function registraSalida(cant As Integer) As Boolean

If cant > hexistencia Then
Return False 'indica que no hubo suficientes articulos
Else
hexistencia -= cant
Return True ' indica que si registró la salida
Endif
End

Private Function clave_Read() As Integer
Return hclave
End

Private Sub clave_Write(Value As Integer)
hclave = Value
End

Private Function existencia_Read() As Integer
Return hexistencia
End

Private Sub existencia_Write(Value As Integer)
hexistencia = Value
End

Private Function precio_Read() As Float
Return hprecio
End

Private Sub precio_Write(Value As Float)
hprecio = Value
End



ClassListaArticulo:

Va a tener una propiedad "lista" que es un array de articulos ( ClassArticulo[] ), manejada por la variable privada "hlista"
Y varios métodos:
anadirArticulo():crea un objeto temporal del tipo classArticulo, nos pide los distintos datos del articulo. y la añade (usando el método add) a la lista de articulos.
verInventario(): devuelve una cadena de texto, con los datos de todos los articulos existentes (recorre con un for next el array "lista"
busca(): dado una clave busca  en la lista, un articulo que tenga esa clave, si no lo encuentra da un mensaje de error y si lo encuentra devuelve la posicion dentro del array del articulo.
registrallegada(): pide la clave del articulo y la cantidad, busca la posicion dentro del array de articulos y le añade la cantidad.
registraSalida(): pide la clave del articulo y la cantidad, busca la posicion dentro del array de articulos, y le quita la cantidad (si no puede, te lo indica en un mensaje)



' Gambas class file

Property lista As ClassArticulo[]
Private hlista As New ClassArticulo[]

Private Function lista_Read() As ClassArticulo[]
Return hlista
End

Private Sub lista_Write(Value As ClassArticulo[])
hlista = Value
End

Public Function verInventario() As String
Dim texto As String
Dim i As Integer
texto = "La lista de articulos en el almacen es la siguiente:" & gb.CrLf
texto &= "Clave" & gb.Tab & "Cantidad en Existencia" & gb.tab & "Precio" & gb.CrLf
For i = 0 To hlista.Max
texto &= hlista[i].clave & gb.Tab & hlista[i].existencia & gb.tab & hlista[i].precio & gb.CrLf
Next
'devuelvo el texto generado de todos los elementos de la lista
Return texto
End

Public Function busca(BuscaClave As Integer) As Integer
Dim i As Integer
Dim posicion As Integer = -1 '-1 indica que no se encontro el artidulo
For i = 0 To hlista.Max
If hlista[i].clave = buscaclave Then
posicion = i 'encontrado el articulo
Return posicion
Endif
Next
Return posicion
End

Public Sub registrallegada()
Dim posicion As Integer, cve As Integer, cantidad As Integer
Print "Cual es la clave del articulo:"
Input cve
'busca la clave en el almacen:
posicion = busca(cve)
If posicion <> -1 Then
Print "Cuantos artículos llegaron: "
Input cantidad
hlista[posicion].registraEntrada(cantidad)
Print "Ok,cantidad introducida...." & gb.CrLf
Else
Print "*** Esa clave no existe ***" & gb.CrLf
Endif
End

Public Sub registraSalida()
Dim posicion As Integer, cve As Integer, cantidad As Integer
Print "¿cual es la clave del articulo? "
Input cve
'busca la clave en el almacen...
posicion = busca(cve)
'[
If posicion <> -1 Then
'{
Print "¿cuantos articulos salieron? "
Input cantidad
If (hlista[posicion].registraSalida(cantidad) = False) Then
Print "No hay suficientes articulos..." & gb.CrLf
Endif
'}
Else
Print "Esa clave no existe" & gb.CrLf
Endif
']
End

Public Sub anadirArticulo()
Dim valorclave As Integer, valorexistencia As Integer, valorprecio As Float
'creo un articulo temporal que sera el que use para los datos iniciales
Dim arttemp As New ClassArticulo
'pregunto y obtengo los valores que me interesa.
Print "Teclea la clave para el articulo:"
Input valorclave
Print "Teclea la existencia del articulo:"
Input valorexistencia
Print "Teclea el precio del articulo:"
Input valorprecio
'inicializo los datos del articulo
arttemp.inicializa(valorclave, valorexistencia, valorprecio)
'añado al array de articulo el nuevo articulo
hlista.Add(arttemp)
End


Ademas de estas dos clases, tenemos el módulo MMain, que contiene una subrutina llamada Main, que va a procesar un pequeño menu, donde el usuario mediante teclas va a introduccir que opcion quiere que se realice.


' Gambas module file

Public Sub Main()
Dim listaArticulos As New ClassListaArticulos
Dim opc As String
Repeat
opc = menu()
Select opc
Case "a"
listaArticulos.anadirArticulo()
Case "b"
Print listaArticulos.verInventario()
Case "c"
listaArticulos.registrallegada()
Case "d"
listaArticulos.registraSalida()
End Select
Until (opc = "e")
'fin del programa
End

Public Function menu() As String
Dim opc As String
Print ""
Print "Menu de Opciones" & gb.CrLf
Print "(a) Añadir Articulo ";
Print "(b) Ver Inventario ";
Print "(c) Registrar una llegada al almacen " & gb.CrLf
Print "(d) Registrar una salida de almacen ";
Print "(e) Salir de la aplicacion" & gb.CrLf
Repeat
Print "Opcion: "
Input opc
Until ((opc >= "a") Or (opc <= "e"))
Return opc
End


Para descargar el ejemplo completo: ejemplo de array de objetos: gestion de articulos

Enlace GambasWiki:
http://gambaswiki.org/wiki/doc/object-model?l=es
http://gambaswiki.org/wiki/cat/object?l=es
http://gambaswiki.org/wiki/lang/type/object



A falta de donativos... un poco de publicidad