Ver Mensaje Individual
  #1  
Antiguo 28-08-2008
gushynet gushynet is offline
Miembro
 
Registrado: ago 2008
Posts: 26
Reputación: 0
gushynet Va por buen camino
procedimiento de asignación genérico

Hola, tengo unas dudillas a ver si alguien me puede orientar un poco.

Cuando se realiza la siguiente asignacion en delphi:

objeto1 := objeto2;

realmente no se hace la asignacion sino que objeto1 apuntara a la misma posicion de memoria que objeto2.

Estoy intentando hacer un procedimiento que realice la asignacion completa, es decir, el procedimiento debe crear una nueva instancia del objeto pasado por parametro (objeto2), que en principio no sabemos de que tipo es, y copiar el contenido de todas las propiedades del objeto2 en las propiedades del objeto1.

procedimiento TObjeto.Asignar(obj: pointer );

En este punto se me han planteado una serie de dudas sobre la solucion que se me ha ocurrido pero que no he conseguido implementar.


Primero, el tipo del parametro que le paso al metodo es de tipo pointer ya que delphi, si no me equivoco la variable objeto no tiene el objeto en si sino la direccion del mismo, por lo que si el parametro es de tipo pointer, el método aceptara cualquier tipo de objeto ya que como dije todo objeto en delphi es un puntero al objeto. No se si este razonamiento es válido y eficiente pero compilar compila.

Una vez entramos en el metodo los pasos que creo se deberia seguir para realizar la asignacion son los siguientes:

1. Averigua el tipo del objeto pasado por parametro

aqui se que puedo usar propiedades como ClassName o ClassType pero aunque he conseguido acceder a ClassName no he conseguido siquiera cambiar el valor de una propiedad del objeto pasado porque siempre se produce el mismo error en tiempo de ejecucion, error en el acceso a memoria.

2. crea una nueva instancia del objeto una vez averiguado su tipo

3. accedemos a todos los campos del objeto pasado por parametro y copiamos su contenido en las propiedades del objeto creado. Aqui se me plantea el problema de como recorrer todas las propiedades del objeto pasado por parametro.

4. Devolvemos el objeto creado.


Las dudas que tengo son muchas pero ahi van unas cuantas:

- la unica manera de averiguar el tipo del objeto que me han pasado es asignando el pointer a un objeto local de tipo TObject y accediento a la propiedad NameClasses o haciendo una conversion directa:

NombreClase := PTObject(Objeto)^.ClassName;

PTObject es un puntero a TObject.

- ¿como creo una nueva instancia? lo he conseguido hacer si dentro del metodo realizo una conversion (al parametro)al tipo que sé que le estoy pasando al metodo pero la gracia esta en que ese metodo lo pueda usar cualquier independientemente del objeto para el que vaya a realizar la conversion.
- Sabeis de documentacion(en español mejor) sobre la Programacion orientada a objetos en object pascal sin ser el manual de delphi y que tenga ejemplos mas elaborados sobre las referencias de clase ya que no tengo ni idea de en que contexto se usan o para que sirven, aunque sospecho que alguna relacion con el problema que he planteado seguro que tienen.


Gracias de antemano por la ayuda.
Un saludo.

PD:disculpas por lo extendido que me ha quedado el mensaje.
Responder Con Cita