Club Delphi  
    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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-08-2006
Avatar de xEsk
[xEsk] xEsk is offline
Miembro Premium
 
Registrado: feb 2006
Posts: 454
Poder: 20
xEsk Va por buen camino
Duplicar "objetos"

Hola.

A ver, os explico el tema, puede q la pregunta sea muy estupida (pero no habia usado hasta hace poco la POO en delphi xD).

La cosa esq tengo un objeto propio, q no es nativo del delphi, como por ejemplo:

Código Delphi [-]
TMyClass = class   
// codigo 
end;

o

Código Delphi [-]
TMyObject = class (TObject)   
// codigo 
end;

Y quiero duplicarlo, osea crear 2 objetos iguales pero q sean independientes. Lo q esta claro esq si hacemos algo parecido a esto:


Código Delphi [-]
var   
  obj1, obj2: TMyObject;  

begin   
  obj1:=TMyObject.Create;   
  obj1.Propiedad:='Hola Caracola!';     
  obj2:=obj1;     
  obj1.Free;   
  ShowMessage(obj2.Propiedad); // Resultado = ''  (nada)   
  obj2.Free; // Error: Invalid pointer operation


Ok, esto es normal q pase, ya q lo unico q hace es q el obj2 copia el puntero de obj1, y q si liberamos el obj1, el obj2 por asociacion se libera tambien, pero mi pregunta viene aqui: ¿Como lo hago para crear un objeto duplicado identico pero independiente uno del otro?

He buscado por el foro, "copiar objeto", y me ha salido un post parecido a este, pero era para copiar Componentes visuales, y una de las respuestas me dio una idea, y es el "Assign", pero claro mis clases no tienen este proceso. ¿Deberia implementarla o heredarla de un objeto de nivel mas alto? ¿Hay alguna solucion facil y q no sepa q existe (q seria lo mas seguro xD)?

Ahi va el tema, gracias por adelantado.

Saludos.
Responder Con Cita
  #2  
Antiguo 12-08-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.122
Poder: 35
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Reconozco que saco la frase de contexto, pero, es que me intriga de veras: ¿a qué te refieres cuando dices...

Cita:
(...) duplicarlo, osea crear 2 objetos iguales pero q sean independientes
¿Qué entiendes por dos objetos iguales? ¿Dos instancias de una misma clase? ¿Pero no son independientes entonces?
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 12-08-2006
Avatar de xEsk
[xEsk] xEsk is offline
Miembro Premium
 
Registrado: feb 2006
Posts: 454
Poder: 20
xEsk Va por buen camino
A mi tb me costo escribirlo, a ver si puedo definirlo de otra forma, hehe

Me refiero a q se cree una segunda instancia, q sea una copia de la primera (vamos con los mismos valores) pero q si elimino la primera, esta segunda (la nueva) no se vea afectada de ninguna forma y siga funcionando tranquilamente.

No se si me he explicado mejor (en mi cabeza lo tengo muy claro, pero me cuesta definirlo de una forma q se entienda bien xDD)

El mismo ejemplo, pero mostrado de otra forma:
Código Delphi [-]
var
  obj1, obj2: TMyObject;
  puntero1, puntero2: Pointer;

begin
  obj1:=TMyObject.Create;   
  puntero1:=obj1;
  obj2:=obj1; 
  puntero2:=obj2;

  if puntero1 = puntero2 then
    ShowMessage('Vaya, apuntamos al mismo sitio de memoria!!');    

  obj1.Free;
  // El obj2, no hace falta liberarlo... xD

Saludos.

Última edición por xEsk fecha: 12-08-2006 a las 16:33:59.
Responder Con Cita
  #4  
Antiguo 12-08-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.122
Poder: 35
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Bueno. Ahora creo haberte entendido. Me parece que el concepto sería "clonar" un objeto. Al menos así lo entiendo yo desde que conozco (a medias) la interface "ICloneable" disponible en la clase "System" de la plataforma .NET. En esta página (Delphi Basics) se trata sobre dicha interfaz, y, creo que la misma consigue está ahí para echar una mano a lo que te propones.

Empero,... la verdad es que yo me pierdo un poco hablando de estos temas. A mí se me ocurre que si el objeto que quieres "clonar" no es muy "complejo", el mismo podría contar con un método (especificado o no por alguna interfaz al uso, que no sé si existe en Delphi, o si merecería la pena, si se ganaría algo), que el objeto contara con un método, digo, que fuera el encargado de la tarea que nos ocupa.

Yo imagino algo así, pero, intuyo que podría mejorarse mucho, que me meto en temas que no comprendo bien. Parece ser que en esto de clonar objetos puede tirarse por dos caminos:

Cita:
A shallow copy of a collection copies only the elements of the collection, whether they are reference types or value types, but it does not copy the objects that the references refer to. The references in the new collection point to the same objects that the references in the original collection point to.


In contrast, a deep copy of a collection copies the elements and everything directly or indirectly referenced by the elements.
Y dependerá, como digo, de la "complejidad" del objeto que quieras clonar. A mí, con un objeto creado para la ocasión y muy sencillo, me sale algo así:

Código Delphi [-]
interfaz

type
  TObjeto = class
  private
    FVariable: string;
  public
    function Clonar(var destino: TObjeto) : boolean;
  public
    property Propiedad: string read FVariable write FVariable;
  end;

implementation

{ TObjeto }

function TObjeto.Clonar(var destino: TObjeto): boolean;
begin
  destino.Propiedad := Self.FVariable;
  Result := true;
end;

Una prueba podría resultar más o menos esto:

Código Delphi [-]
var
  objeto, objeto2: TObjeto;
begin
  objeto := TObjeto.Create;
  objeto.Propiedad := 'Una cadena';

  objeto2 := TObjeto.Create;
  objeto.Clonar(objeto2);

  objeto.Free; // Liberamos

  // Pero objeto2 hace las veces de objeto
  ShowMessage(objeto2.Propiedad);

  objeto2.Free;
end;
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
Antiguo 12-08-2006
Avatar de xEsk
[xEsk] xEsk is offline
Miembro Premium
 
Registrado: feb 2006
Posts: 454
Poder: 20
xEsk Va por buen camino
Hola.

Antes q nada, gracias por perder tu precioso tiempo conmigo.

Si, tienes razon q seria mucho mas sencillo llamarlo clonar.
Tu solucion es una de mis primeras pensadas, pero luego como tu bien resaltas, si no son objetos complejos, cosa q no es el caso, heheh (vaya mala pata xD), ya q la clase q quiero clonar tiene bastantes propiededes, q a su vez estas tambien son clases con sus propiedades.

Por el momento, la solucion mas cutre q se me ocurre, es intentar eviatar la necesidad de clonar.

Despues de escribir este mensaje voy a leer el link q me has pasado.

Saludos.
Responder Con Cita
  #6  
Antiguo 12-08-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Pues si es complejo... a lo facil.

Deriva de TComponent que ya tienes los métodos Assign. Eso sí, deberás mirar como manipulas memoria dentro de tu objeto, pero en principio sería algo asi:

Código Delphi [-]
type TMyClass = Class(Tcomponent)
// el codigo
end;

var o1, o2 : TMyClass;
begin
o1 := TMyClass.Create;
o1.propiedad := 'mio';
o2 := TMyClass.Create;
o2.Assign(o1);
// ahora si, tenemos 2 objetos distintos.
end;

Si indagas por la VCL y la ayuda de Assign, creo que te puede hacer la vida más fácil.

Alguna vez, para guardar un objeto en disco con SaveToStream, simplemente cambié el TObject por TComponent y todo resuelto, aunque creo que para tí no será tan simple.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
Respuesta



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
¿cuál es mejor: "close" o "application.terminate"? unreal4u Varios 5 05-03-2007 11:01:19
porque no me reconoce los caracteres "*" ni "%" cuando filtro mrmago Conexión con bases de datos 10 27-01-2006 04:21:16
Compartir "objetos" entre varias instancias mafebresv Varios 4 16-01-2006 23:38:23
Tipo de Variable."String" ó "Double" UTECYBER OOP 7 15-12-2003 20:25:39


La franja horaria es GMT +2. Ahora son las 06:14:01.


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