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!
Gracias por el apunte Mauricio! (corregido), y muy agradecido por los comentarios Amando
Javier Rodrguez
Evangelista Xojo en Espaol
Autor del libro “Programacin Multiplataforma Xojo”