https://foro.gambas-es.org/viewtopic.php?f=1&t=1563&p=9080#p9080
-----------------------------------
santijav
Martes, 19 Abril 2011, 14:37

Re: Consulta Acerca De Una Matriz De Objetos: Todos Los Objetos Tienen Los Mismos Datos¿?
-----------------------------------
Estimado Soplo,

Muchísimas gracias por tu prontísima respuesta. :mryellow: 

La principal diferencia entre tu código y el mío  que veo es que instanciamos el objeto de tipo lote en distintos lugares. Vos lo hacés dentro del bucle y después de tener cada valor y yo lo hago al principio de todo... incluso antes de meterme en el bucle... Será eso el problema?

El tema de las variables públicas en el objeto lote... los creé así ya que esos valores son importantes para mi programa y necesito accederlos desde distintos lugares del programa. Sería mejor declararlas private y crear una función que me devuelva el valor que necesito? (suena más "correcto"... parece más oop, jeje)

Copio aquí mi código actual antes de tus sugerencias para que los interesados puedan aprender a través de un antiejemplo, jeje:

[code linenumbers=false syntax=gambas]
PUBLIC SUB Form_Open()
DIM aanombre AS String
DIM aacompra AS String
DIM aaventa AS String
DIM aaultimo AS String
DIM loteactual AS NEW lote


DIM xml AS NEW XmlReader

TRY xml.Open(User.Home & "/prueba2/opciones.xml")

IF ERROR THEN 
Message.Error("No se encuentra el archivo o no se puede abrir")
RETURN 
END IF
DO WHILE TRUE
  TRY xml.Read()
  IF xml.Eof THEN BREAK 
  
  IF xml.Node.Type = XmlReaderNodeType.Element
    IF xml.Node.name = "information" 'si es este elemento que no haga nada

    ELSE

    aanombre = xml.Node.Name 'tomo el nombre del elemento
      

      FOR EACH xml.Node.Attributes 
        
        SELECT CASE xml.Node.Name 'esto es muy ineficiente. Tendría que cortar cuando llega a last y pasar a otro elemento
          CASE "bid"
            aacompra = xml.Node.Value 'tomo el valor del elemento
          CASE "ask"
            aaventa = xml.Node.Value
          CASE "last"
            aaultimo = xml.Node.Value
        END SELECT 


      NEXT 

loteactual.nombre = aanombre
loteactual.pcompra = aacompra
loteactual.pventa = aaventa
loteactual.pultimo = aaultimo

variables.almacen.Add(loteactual)
variables.arraybusca.Add(loteactual.nombre)

      ENDIF 
  ENDIF 
  

  IF ERROR THEN Message.Error("no pude leer")
          
LOOP 
TRY xml.Close()
IF ERROR THEN Message.Error("no pude cerrar")
rellenaxml.rellenalbox(ListBox1, "/prueba2/opciones.xml")

END[/code]

Hasta allí las partes del formulario principal.

Ahora el código de la clase lote:

[code linenumbers=false syntax=gambas]PUBLIC nombre AS String
PUBLIC pcompra AS Float
PUBLIC pventa AS Float
PUBLIC pultimo AS Float

PUBLIC SUB leevalores(xmlnombre AS String, xmlpcompra AS Float, xmlpventa AS Float, xmlpultimo AS Float)
  
  nombre = xmlnombre 'aca me mete el nombre del lote
  pcompra = CFloat(xmlpcompra)
  pventa = CFloat(xmlpventa)
  pultimo = CFloat(xmlpultimo)[/code]

END

Y estas dos líneas de un módulo donde almaceno las cosas.

[code linenumbers=false syntax=gambas]PUBLIC almacen AS NEW Object[]
PUBLIC arraybusca AS NEW String[][/code]


En breve voy a poner a rodar tus ideas y postearé los resultados de la prueba.

Muchas gracias!

Saludos.
Santiago.


