Hola Shordi, Jesús. Creo que la cita de Benoit que hizo Jesús deja bastante en claro que aquí tenemos una limitación.
Lo único que puedo aclarar es que no hay que confundir el paso de argumentos con el manejo de objetos. Obviamente el manejo de objetos se hace a través de referencias (punteros) y el paso de argumentos se hace por valor a menos que se especifique byref tanto en la definición de los parámetros formales como en la aplicación de la función.
En este caso, el paso por valor a la función de Shordi no es de utilidad porque lo que se pasa es una referencia a un objeto, de modo que lo que se copia es el valor de la referencia, es decir un puntero, una dirección de memoria. En consecuencia, al manipular esa referencia dentro de la función se estaría manipulando el objeto original, no una copia.
gambas no tiene una forma sencilla que yo conozca para clonar objetos. Esto no quiere decir que no exista, sólo que si existe yo no la conozco. Si es así, podría ser un feature request que deberíamos solicitarle a Benoit, si evaluamos que es algo realmente necesario (otros lenguajes tienen esa característica así que probablemente sea importante).
Pero para intentar aproximar una solución al problema de Shordi creo que deberíamos entender mejor que es lo que se intenta hacer, para buscar otro modo de hacerlo.
El camino que me parece obvio es escribir una rutina que tome la referencia que recibe esa función y a partir de ella cree un nuevo contenedor con todos los controles que éste contiene y establezca sus atributos con los mismos valores. Algo así:
'Reemplazar todas las apariciones de Container por el tipo de contenedor adecuado
PRIVATE FUNCTION procesaChildren(pContainer AS Container) AS Container
DIM copia AS Container = copiar(pContainer)
'Hacer algo con la copia
END
'Esta función podría ser miembro de una clase estática
'Reemplazar todas las apariciones de Container por el tipo de contenedor adecuado
'Verificar si se puede usar el tipo Object, probablemente Control sería más apropiado
PRIVATE FUNCTION copiar(pContainer AS Container) AS Container
DIM nuevoContainer AS NEW Container() 'Especificar algún contenedor como parámetro del constructor
DIM unObjecto, nuevoObjeto AS Object
FOR EACH unObjeto IN pContainer.Children
'Crear objetos del tipo correcto
nuevoObjeto.Reparent(nuevoContainer)
'Setear objetos
NEXT
END
De todos modos la función copiar no es trivial y podría traer varios problemas nuevos que se deberían solucionar. Es cuestión de pensarlo un rato y probar algunas cosas (algunas de las sentencias que escribí podrían ser ilegales en
gambas, pero creo que se podría arreglar). En principio, gracias al polimorfismo sería válido crear controles mediante referencias de tipo Object y habría que verificar que al añadirlas al container éste convierta su referencia al subtipo correcto, de lo contrario podrían presentarse problemas en la manipulación posterior de los objetos de ese contenedor o tal vez ni siquiera sea legal añadir una variable tipo Object a un Container.
Shordi, si te parece prueba este camino e intentamos resolver los problemas que aparezcan.
Saludos.