Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Coloboración Paypal con ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #9  
Antiguo 29-08-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.610
Poder: 32
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
¡Hola!

Cita:
Empezado por gushynet Ver Mensaje
...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.
...
los pasos que creo se deberia seguir para realizar la asignacion son los siguientes:

1. Averigua el tipo del objeto pasado por parametro
...
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.
...
En esta página podrás descargar una biblioteca de funciones llamada GH Freebrary, es de mi autoría. En la unidad GHFObjects.pas encontrarás una función llamada ghClone que, en esencia, realiza esos pasos que has descrito con el objetivo de duplicar instancias de objetos.

Código Delphi [-]
Uses
  GHFObjects;
...
  Var
    O2 :TObject;
  Begin
    O2 := ghClone (O1);  // Siendo O1 un objeto de cualquier clase

Cabe aclarar que esta rutina de "clonación", después de crear la nueva instancia, copia solamente las propiedades publicadas (que básicamente son las mismas que pueden ser vistas en el inspector de objetos). También considera que el código de estas funciones está probado (en casos reales) con Delphi 7, pero no he terminado de adaptarlo a otras versiones (aunque un compañero del club tuvo la gentileza de adaptarlo a Delphi 6 y 2007 en pasadas semanas, sólo haría falta revisar tales adaptaciones).

Algo quizá más importante de considerar es que la función ghClone llamará al constructor que tenga definido la clase en cuestión sólo si se trata de una descendiente de TComponent (gracias a que el constructor de TComponent es virtual). Si el objeto a clonar no es un componente, ghClone ejecutará el constructor de la clase TObject después de crear la instancia.

Son tres las versiones (sobrecargas) de esta función:
Código Delphi [-]
  Function ghClone (Const Obj :TObject; Const Cls :TClass;
    Const Owner :TComponent = Nil; Const ExcludedProps :String = '')
    :TObject; Overload;
  Begin
    If Obj Is TComponent Then
      Result := TComponentClass (Cls).Create (Owner)
    Else
      Result := Cls.Create;

    Try
      ghCopyProps (Obj, Result, ExcludedProps);
    Except
      Result.Free;
      Raise;
    End;
  End;

  Function ghClone (Const Obj :TObject; Const Owner :TComponent = Nil;
    Const ExcludedProps :String = '') :TObject; Overload;
  Begin
    Result := ghClone (Obj, Obj.ClassType, Owner, ExcludedProps);
  End;
  
  Function ghClone (Const Obj :TObject; Const ExcludedProps :String)
    :TObject; Overload;
  Begin
    Result := ghClone (Obj, Obj.ClassType, Nil, ExcludedProps);
  End;

Como podrás ver, las tres sobrecargas terminan llamando a una función de nombre ghCopyProps, que en otros casos podrías usar para copiar las propiedades de un objeto existente a otro.

El parámetro opcional ExcludedProps te sirve para indicarle a la función que no copie algunas propiedades en particular:
Código Delphi [-]
Var
  C2 :TComponent;
Begin
  C2 := TComponent (ghClone (C1, 'Name;OnClick'));  // Siendo C1 un objeto componente

Cita:
Empezado por gushynet Ver Mensaje
...PD:disculpas por lo extendido que me ha quedado el mensaje.
Creo que esa petición está de sobra, gushynet. El tamaño y estilo de tu mensaje, para ser el primero, muestra un verdadero interés por darse a entender y solucionar el problema.

Un abrazo doble.

Al González.

Última edición por Al González fecha: 08-09-2008 a las 01:48:14.
Responder Con Cita
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Apuntar a un tipo genérico Guillermo80 Varios 4 09-03-2008 11:48:22
Reutilizar código "generico" adlfv OOP 13 06-09-2005 02:01:04
Ayuda, como llamar a un procedimiento desde otro procedimiento? Ariatna Varios 1 01-02-2005 04:05:35
reporte generico piyugo Impresión 8 07-05-2004 18:20:03
Configuar Generico/solo texto en Win 2000 sperezp Impresión 0 13-01-2004 15:13:43


La franja horaria es GMT +2. Ahora son las 00:34:06.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi