https://foro.gambas-es.org/viewtopic.php?f=1&t=1563&p=9082#p9082
-----------------------------------
soplo
Martes, 19 Abril 2011, 15:20

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

[quote]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? [/quote]
Efectivamente. Por eso te lo puse así, para que veas como lo instancio y que luego puedo incluso eliminarlo porque ya no me srive

En cuanto a las variables public yo no estoy en contra de lo que hss hecho. Seguro que te funciona, ahora bien es importante tener claros los conceptos. Por ejemplo si necesitas esas variables públicas lo que te sobra es el método porque no es necesario porque puedes asignarles valores directamente sin necesidad de ese método.

Otra alternativa es que hubieras hecho propiedades. Te explico como hacer la propiedad nombre
[code linenumbers=false syntax=gambas]
private $Nombre as string
property Nombre as string[/code]
Lo que hacemos es crear una variable $Nombre conocida a nivel de clase y no conocida en el exterior.
Luego definimos la propiedad nombre y al darle al enter a esa línea se escribe automáticamente al final de tu clase lo siguiente
[code linenumbers=false syntax=gambas]private function Nombre_Read() as string

end

private sub Nombre_Write(Value as string)

end[/code]
La procedure _Read está para cuando quieras leer el valor de la propiedad nombre allá donde sea
La función _Write está para cuando quieras asignarle un valor a la propiedad nombre.

Todo lo que tu haces es editar esto un poquito para que te quede así
[code linenumbers=false syntax=gambas]private function Nombre_Read() as string
   return $nombre
end

private sub Nombre_Write(Value as string)
   $Nombre=value
end[/code]
Y ya está.
A partir de ese momento tu puedes instanciar una clase y darle valores a la propiedad
Dim L as NEW lotes
[code linenumbers=false syntax=gambas]
'al hacer esto se ejecuta el _write y la variable privada $nombre coge su valor
L.nombre="pepito" [/code]
[code linenumbers=false syntax=gambas]
'al hacer esto se ejecuta el _read y se devuelve lo que la variable privada $nombre valga.
print L.nombre[/code]

Naturalmente es el caso mas simple pero puedes complicarlo cuanto quieras. Por ejemplo tu puedes hacer una propiedad que pida un dni y que cuando se lo das compruebe si es un DNI válido. Para eso en procudure _read añadirías una función ComprobarDni

Si en vez de declarar property pones property read es una propiedad de solo lectura que te devuelve algún valor que tu clase calcula internamente. Por ejemplo yo tengo una clase que hace certificados y le paso una serie de parámetros. La clase calcula el certificado y hay una property read que devuelve ese valor calculado.

Por último decir que los valores que pasas no tienen por que ser integers o strings, etc. Puede ser cualquier cosa. Yo tengo un formulario donde el usuario va escribiendo y rellenando cosas y todo lo que hace se va metiendo en un columnview. Cuando le da a terminar yo instancio una clase y en una propiedad le doy como valor el columnview entero. La clase esa tiene una variable privada de tipo columnview y lo que hago es analizar todo ese columview y en cada caso ir haciendo lo conveniente. Solo es un ejemplo de que puedes hacer una propiedad que como parámetro tenga un columnview, un formulario, otra clase o cualquier cosa que se te pueda ocurrir.


