Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Go Back   Foros Club Delphi > Principal > Varios
Register FAQ Members List Calendar Guía de estilo Search Today's Posts Mark Forums Read

Coloboración Paypal con ClubDelphi

Reply
 
Thread Tools Search this Thread Display Modes
  #1  
Old 08/11/2011
TecnoBestia TecnoBestia is offline
Miembro
 
Join Date: Jun 2010
Posts: 35
Poder: 0
TecnoBestia Va por buen camino
Como puedo asignar una copia de una instancia sin que sea una referencia.

Hola amigos, una vez más requiero de su gran ayuda.

Tengo una clase definida de esta manera:

Code:
Individuo=class(TObject)
  private
  protected
  public
    VClasificacion:VectorIR;
    VCoordenadas:VectorIR;
    Inercia:Double;
    VDistancias:VectorIR;
    TieneClasesVacias:Boolean;
    procedure CargarClasificacionYDistancias();
    procedure GenerarVecino(CantiParticion:Integer);
    procedure CGRealesParaClasificacion();
    function RecalcularInercia:Double;
  published
    //destructor Destroy; override;
end;
Si tengo dos variables Var1 y Var 2 de tipo Individuo, de manera que dependiendo de una condición, no importa cual sea, se debe guardar el contenido de Var1 en Var2 para luego cambiar Var1 o bien destruirlo para luego reutilizarlo. La situación es la siguiente, si ejecuto el siguiente código:

Code:
Var2:=Var1;
Var1.Destroy;
Esto me destruye también a Var2, me suena que lo anterior lo que hace es una asignación de punteros y cuando cambio Var1 luego de guardarlo en Var2, se me cambia lo contenido en Var1.

Mi pregunta es: ¿existe una forma de realizar la asignación de modo que se me guarde una copia y no una referencia al mismo espacio de memoria?

Con el fin de modificar luego una de las variables manteniendose la otra intacta.

Gracias de antemano por su valiosa ayuda.
Reply With Quote
  #2  
Old 08/11/2011
escafandra's Avatar
[escafandra] escafandra is offline
Miembro Premium
 
Join Date: Nov 2007
Posts: 2,211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Escribe un procedimiento Assign que asigne todas las propiedades de tu clase.

TPersistent tiene ese método virtual, así que puedes derivar de TPersistenty completar tu Assign con las nuevas propiedades de tu clase.

Por supuesto puedes realizar tu método de asignación desde cero.

Cuando se realizan asignaciones de este tipo se debe tener cuidado al asignar punteros y en este sentido todos los objetos VCL lo son, así que tendrás que asignar contenidos. Por eso lo mejor es usar el Assign de las clases VCL y completar la asignación de lo propio de nuestra clase.

Saludos.
Reply With Quote
  #3  
Old 08/11/2011
TecnoBestia TecnoBestia is offline
Miembro
 
Join Date: Jun 2010
Posts: 35
Poder: 0
TecnoBestia Va por buen camino
Muchas gracias. Cambie TObject por TPersistent y coloqué un nuevo procedimiento
Code:
  procedure Individuo.Assign(IndiEnviado:Individuo);
  begin
    VCoordenadas:= IndiEnviado.VCoordenadas;
    VClasificacion:=IndiEnviado.VClasificacion;
    VDistancias:=IndiEnviado.VDistancias;
    Inercia:=IndiEnviado.Inercia;
    TieneClasesVacias:=IndiEnviado.TieneClasesVacias;
  end;
y todo parece funcionar bien.

Gracias por su aporte y su valioso tiempo.
Reply With Quote
  #4  
Old 08/11/2011
ecfisa's Avatar
ecfisa ecfisa is offline
Moderador
 
Join Date: Dec 2005
Location: Tres Arroyos, Argentina
Posts: 10,508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola TecnoBestia.

Me alegra que hayas solucionado el problema, pero creo que el amigo escafandra se refería a algo parecido a esto:
Código Delphi [-]
...
type
  TIndividuo = class(TPersistent)
    procedure Assign(aCustomer: TPersistent); override;
  private
    FNombre: string;
    FEdad: Integer;
    ...
  public
    ...
    property Nombre: string read FNombre write FNombre;
    property Edad  : integer read FEdad write FEdad;
   ...
  end;

procedure TIndividuo.Assign(aCustomer: TPersistent);
begin
  if aCustomer is TIndividuo then
  begin
    FNombre := TIndividuo(aCustomer).FNombre;
    FEdad   := TIndividuo(aCustomer).FEdad;
    ...
  end
  else
    inherited Assign (aCustomer);
end;
...
end.

//--------------------------------------------------------------
...
procedure TForm1.btnAssign(Sender: TObject);
var
  Individuo1, Individuo2: TIndividuo;
begin
  Individuo1 := TIndividuo.Create;
  Individuo1.Nombre := 'PEPE';
  Individuo1.Edad := 15;
  Individuo2 := TIndividuo.Create;
  Individuo2.Assign(Individuo1);
  Individuo1.Free;
  ShowMessage(Format('%s %d',[Individuo2.Nombre, Individuo2.Edad]));
  ...
end;

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Reply With Quote
  #5  
Old 08/11/2011
escafandra's Avatar
[escafandra] escafandra is offline
Miembro Premium
 
Join Date: Nov 2007
Posts: 2,211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Exacto, se trata de sobreescribir el método Assign para añadir en él las asignaciones de las propiedades propias de nuestra nueva clase, tal como muestra ecfisa en su código.

TecnoBestia, se trata de sobrecargar la función virtual para terminar llamando a la heredada, en otro caso te pierdes las propiedades de la clase madre.

Saludos.
Reply With Quote
  #6  
Old 08/11/2011
Delphius's Avatar
[Delphius] Delphius is offline
Miembro Premium
 
Join Date: Jul 2004
Location: Salta, Argentina
Posts: 5,582
Poder: 28
Delphius Va camino a la fama
¿Y Vale la pena heredar desde TComponent sólo por un método? Antes a cambios en la estructura jerárquicas de nuestras clases es mejor pensarlo dos veces.

¿Te aporta alguna otra ventaja que sea de la clase TComponent? ¿necesitarás hacer streaming para recuperar datos?

¿En que te afecta, o que tan complicado es directamente añadirle un método CopiarA() que haga un trabajo similar? Digo... siendo honestos es lo mismo que harías con el Assing:

Código Delphi [-]
ObjDestino.Propiedad := ObjFuente.Propiedad;

Con todo repeto, me parece un desperdicio heredar de TComponent si en verdad la clase no se va a comportar como un componente.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Reply With Quote
  #7  
Old 08/11/2011
Al González's Avatar
[Al González] Al González is offline
In .pas since 1991
 
Join Date: 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
Muy puntual lo dicho por ecfisa y escafandra.

Solamente una observación:
Quote:
Originally Posted by escafandra View Post
[...] se trata de sobrecargar la función virtual para terminar llamando a la heredada [...]
Tratándose de la palabra reservada Override, el término es redefinir (en el ejemplo se redefine un método virtual), mientras que el término sobrecarga tiene que ver con el uso de Overload, lo cual es otro concepto. Seguro que escafandra así lo entiende también y fue simplemente un despiste.

Saludos.

Al González.
Reply With Quote
  #8  
Old 08/11/2011
[maeyanes] maeyanes is offline
Capo de los Capos
 
Join Date: May 2003
Location: Campeche, México
Posts: 2,732
Poder: 26
maeyanes Va por buen camino
Hola...

Delphius, según creo recordar, TComponent desciende de TPersistent y no al revés. A lo que voy es que heredar una clase de TPersistent no hace que esta se comporte como un componente. TPersistent solo define métodos para serializar un objeto.


Saludos...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter
Reply With Quote
  #9  
Old 08/11/2011
TecnoBestia TecnoBestia is offline
Miembro
 
Join Date: Jun 2010
Posts: 35
Poder: 0
TecnoBestia Va por buen camino
Más sobre mi problema

Mi clase es muy simple y es para la aplicación de un algoritmo denominado Simulating Annealing para hacer clasificación de datos, mi clase es un Individuo que que contendrá únicamente lo que se muestra en el código siguiente:
PHP Code:
Individuo=class(TObject)
  private
  protected
  public
    
VClasificacion:VectorIR;
    
VCoordenadas:VectorIR;
    
Inercia:Double;
    
VDistancias:VectorIR;
    
TieneClasesVacias:Boolean;
    
procedure CargarClasificacionYDistancias();
    
procedure GenerarVecino(CantiParticion:Integer);
    
procedure CGRealesParaClasificacion();
    function 
RecalcularInercia:Double;
  
published
    
//destructor Destroy; override;
end
Si creo la clase derivada de TObject y genero el procedimiento GenerarCopia tal como se muestra en el código siguiente


PHP Code:
  procedure Individuo.GenerarCopia(IndiEnviado:Individuo);
  
begin
    VCoordenadas
:= IndiEnviado.VCoordenadas;
    
VClasificacion:=IndiEnviado.VClasificacion;
    
VDistancias:=IndiEnviado.VDistancias;
    
Inercia:=IndiEnviado.Inercia;
    
TieneClasesVacias:=IndiEnviado.TieneClasesVacias;
  
end
Y uso éste para poder realizar la copia y no la asignación del puntero, ¿qué problema tendría? ¿qué estoy perdiento al hacerlo así, ya que en este momento me está funcionando? Pero claro que si es mejor hacerlo de la manera que ustedes indican lo haré sin problema.
Reply With Quote
  #10  
Old 08/11/2011
roman's Avatar
roman roman is offline
Moderador
 
Join Date: May 2003
Location: Ciudad de México
Posts: 20,269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Quote:
Originally Posted by maeyanes View Post
Delphius, según creo recordar, TComponent desciende de TPersistent y no al revés. A lo que voy es que heredar una clase de TPersistent no hace que esta se comporte como un componente. TPersistent solo define métodos para serializar un objeto.
Así es. Aún así, aplica lo que comenta Delphius. ¿Vale la pena derivar de TPersistent?

// Saludos
Reply With Quote
  #11  
Old 08/11/2011
Delphius's Avatar
[Delphius] Delphius is offline
Miembro Premium
 
Join Date: Jul 2004
Location: Salta, Argentina
Posts: 5,582
Poder: 28
Delphius Va camino a la fama
Quote:
Originally Posted by maeyanes View Post
Hola...

Delphius, según creo recordar, TComponent desciende de TPersistent y no al revés. A lo que voy es que heredar una clase de TPersistent no hace que esta se comporte como un componente. TPersistent solo define métodos para serializar un objeto.


Saludos...
¡Tienes razón! Siempre me confundo a estas dos clases. Tengo que estudiar más y mejor

Pero como dijo román, el planteo sigue siendo igual de válido. ¿Vale la pena heredar la clase sólo por un método? Yo no creo.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Reply With Quote
  #12  
Old 08/11/2011
TecnoBestia TecnoBestia is offline
Miembro
 
Join Date: Jun 2010
Posts: 35
Poder: 0
TecnoBestia Va por buen camino
Hola, ¿De quien me recomiendan heredar?
¿Puedo heredar de TOject y crear un procedimiento Copiar? algó así como
PHP Code:
  procedure Individuo.CopiarInstancia(IndiEnviado:Individuo);
  
begin
    VCoordenadas
:= IndiEnviado.VCoordenadas;
    
VClasificacion:=IndiEnviado.VClasificacion;
    
VDistancias:=IndiEnviado.VDistancias;
    
Inercia:=IndiEnviado.Inercia;
    
TieneClasesVacias:=IndiEnviado.TieneClasesVacias;
  
end
¿pierdo algo al hacerlo así?

Gracias por sus acertadas respuestas .
Reply With Quote
  #13  
Old 08/11/2011
[maeyanes] maeyanes is offline
Capo de los Capos
 
Join Date: May 2003
Location: Campeche, México
Posts: 2,732
Poder: 26
maeyanes Va por buen camino
Hola...

Para tu caso en particular, no veo por que no hacerlo así, ya que es una clase simple y no necesitas sobrecargarla con métodos que ni vas a usar.


Saludos...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter
Reply With Quote
  #14  
Old 08/11/2011
TecnoBestia TecnoBestia is offline
Miembro
 
Join Date: Jun 2010
Posts: 35
Poder: 0
TecnoBestia Va por buen camino
Gracias, lo haré así.
Reply With Quote
  #15  
Old 08/11/2011
escafandra's Avatar
[escafandra] escafandra is offline
Miembro Premium
 
Join Date: Nov 2007
Posts: 2,211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Y volviendo a la idea de Delphius si la clase es tan simple, ¿porqué definirla como derivada de otra? ¿Que se quiere heredar?


Saludos.
Reply With Quote
  #16  
Old 08/11/2011
escafandra's Avatar
[escafandra] escafandra is offline
Miembro Premium
 
Join Date: Nov 2007
Posts: 2,211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Quote:
Originally Posted by Al González View Post
Tratándose de la palabra reservada Override, el término es redefinir (en el ejemplo se redefine un método virtual), mientras que el término sobrecarga tiene que ver con el uso de Overload, lo cual es otro concepto. Seguro que escafandra así lo entiende también y fue simplemente un despiste.
Tienes toda la razón en tu observación Al González, así lo entiendo yo también.

Saludos.
Reply With Quote
Reply


Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
Como Puedo Asignar un TObjetList a un CxBdlookupCombobox Sin Recorrer La Lista joelphi Conexión con bases de datos 1 14/02/2009 02:44
¿Cómo puedo saber el tamaño que debo asignar al buffer? MON___ API de Windows 5 02/02/2008 22:08
Como puedo librarme de la referencia circular? Lionheart OOP 2 13/12/2005 13:58
Como puedo asignar un ip a un equipo yayita Internet 3 12/03/2004 22:09
Como puedo saber si un una variable instancia se le a realiso un create orfeo OOP 1 05/05/2003 08:42


All times are GMT +2. The time now is 21:10.


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