Duda con asignacin de fecha a otra variable fecha

Hola

Estaba trabajando sobre un cdigo muy sencillo en el que comet un error y esto me ha llevado a encontrarme con una duda que me gustara aclarar.

El cdigo que est en un evento que recibe (D as Date) es el siguiente:

dim i As integer
dim fecha As Date

i=0

while i < 3
Fecha = D
Fecha.Day=fecha.Day+1
RadioGroup1.CellCaption(i,0)=Fecha.ShortDate
i = i+1
wend

El asunto es que yo quera generar 3 fechas a partir del da siguiente al recibido en D, y al revisar el cdigo veo que aunque funciona bien, no debera, ya que en el bucle while pongo a Fecha = D en cada iteracin. Como digo funciona correctamente (hace lo que quera) y los 3 radio se rellenan con las 3 fechas a partir del da siguiente a la fecha recibida en D, pero si fecha se pone en cada iteracin = D, entiendo que debera repertirse 3 veces la fecha del da siguiente a menos que por alguna razn que desconozco al igualar Fecha a D, al modificar fecha tambin lo haga D, cosa que he comprobado cambiando la linea

RadioGroup1.CellCaption(i,0)=Fecha.ShortDate

por

RadioGroup1.CellCaption(i,0)=D.ShortDate

Y efectivamente se muestran tambin 3 fechas distintas, luego D sigue a Fecha de alguna manera.

Alguien me puede explicar por que es esto y como hacer para que aunque no tenga el funcionamiento esperado este cdigo inicialice Fecha cada vez con el valor inicial de D y no se modifique este al hacerlo Fecha?

Gracias!

Saludos

Me autorespondo porque he encontrado la solucin en:

https://forum.xojo.com/9201-is-it-safe-to-simply-compare-date-objects-when-comparing-dates/0

El tema es que hay que crear una nueva fecha para Fecha, ya que si no, se referencia el objeto

Cambiando

Fecha = D

por

Fecha = new date(D)

Funciona como yo esperaba con mi error en la rutina, o sea, repite 3 veces la misma fecha.

Efectivamente,

Cuando se hacen asignaciones entre variables de objetos, estas se toman por referencia en vez de por copia. Sin embargo cuando se hace la asignacin con tipos de datos primarios (enteros, nmeros de coma flotante, etc.) entonces s que se hace por copia de valor y no por referencia.

Cuando los objetos (por ejemplo Date, como en tu ejemplo) se pasan como argumentos a una funcin o mtodo tambin se har por referencia, mientras que en el caso de los tipos de datos primarios se puede utilizar la palabra clave ByRef para que tambin se pasen por referencia.

Javier Rodrguez
Evangelista Xojo en Espaol
Autor del libro “Programacin multiplataforma Xojo

Muchas gracias por tu explicacin, Javier.

Para aclarar al mximo el uso de variables en mtodos pasadas por copia y/o por referencia (y cuando ocurre cada cosa por omisin), he publicado una nueva entrada en el blog de AprendeXojo. Confo que la encontris de utilidad.

Javier Rodrguez
Evangelista Xojo en Espaol
Autor del libro “Programacin Multiplataforma Xojo”

Hola Javier

Gracias por el articulo, como siempre muy bueno.

En el ejemplo del Array, en el mtodo cambiaArray hay un error

For i as integer = 5 to 9
'n(i-5) = 5
n(i-5) = i
Next

Saludos.
Mauricio

Excelente artculo @JavierMenndez. Todos hemos pasado por esto al aprender Xojo. Viene genial! :slight_smile:

Gracias por el apunte Mauricio! (corregido), y muy agradecido por los comentarios Amando :wink:

Javier Rodrguez
Evangelista Xojo en Espaol
Autor del libro “Programacin Multiplataforma Xojo”