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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-04-2010
alquimista alquimista is offline
Miembro
 
Registrado: ene 2008
Posts: 203
Poder: 17
alquimista Va por buen camino
Ahhh...
Claro, mi intencion era clonar el objeto para usarlo de almacenamiento temporal y al liberarlo me pasaba lo que ha explicado Nuño.

¿Y si quiero clonarlo , como se debería hacer? hay algo como Copy...?

PD: Algo hemos avanzado con los conceptos de objetos... Lo reconozco he usado algun Destroy por ahi

PD2: Muy buena explicacion.. concluyendo debo expresar mi nivel de Delphi
con una variable Double; var Nivelouble; .. Nivel:=0.001;
Responder Con Cita
  #2  
Antiguo 08-04-2010
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Cita:
Empezado por alquimista Ver Mensaje
Ahhh...
Claro, mi intencion era clonar el objeto para usarlo de almacenamiento temporal y al liberarlo me pasaba lo que ha explicado Nuño.

¿Y si quiero clonarlo , como se debería hacer? hay algo como Copy...?
Pues hasta donde yo sé, no hay un método para clonar objetos. Cada clase debe definir su propio método de copia. Si no tiene, se puede intentar asignando a través de sus propiedades.

Sirva como ejemplo la clase "TStrings". Puede clonarse un objeto de esta clase asignando la propiedad Text, es decir:

Código Delphi [-]
ObjetoStringList.Text := ObjetoOrigen.Text;

Ahora los dos objetos contienen una copia idéntica de las cadenas, pero cada uno es independiente. Sin embargo este sistema sólo sirve para esta clase y sus derivadas (por ejemplo, TStringList).
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #3  
Antiguo 08-04-2010
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Ñuño, recuerda tambien:
Código Delphi [-]
var a, b:TStringList;
begin
  a := TStringlist.create;
  a.add('uno'); 
  a.add('dos');
  b:= TStringlist.create;
  b.Assign(a);

Para clonar objetos está el método Assign, pero pertenece a TPersistent y puede que incluya muchas cosas que no quieras. Además debes modificar el método Assign en tu clase para que sea 100 % operativo, total, como he soltado un rollo ahí vá lo que deberías hacer:
Código Delphi [-]
procedure TSecuencia.Assign(Avalue:TSecuencia);
begin
 Numero := Avalue.Numero
    Nombre  := Avalue..Nombre;
    Descripcion := Avalue.Descripcion;
   // o sea copiar a la instancia actual, la que se pasa por parámetro.
  // realmente no clona objetos, solo copia los valores de uno a otro

  Recorr.Origen := Avalue.Recorr.Origen
  SetLength(Recorr.tradmov, Avalue.Recorr.Count);
  for i:= 0 to Avalue.Recorr.Count -1 do // Count no debería ser privada 
     Recorr.tradmov[i] := Avalue.Recorr.tradmov[i]; 
  // hace años que no uso "records", delphi los copiaba ¿verdad?
  // sino un simple test y salimos de dudas.
Y ahora si podemos usar un código como...

Código Delphi [-]
var a, b: TSecuencia;
begin
  a := TSecuencia.create;
  b := TSecuencia.Create;
  a.Nombre := 'pepe';
  // relleanar todos los valores
  b.Assign(a);
  "b" será un clon de "a"

//queda por liberar y eso...

Esto que has visto es realmente lo que hace el método TPersistent.Assign(), pero es más lioso de entender por la herencia (la primera vez que vi el código de Assign no entendí nada de nada).

Edito:
como me quedé intrigado hice la prueba, Delphi si clona los registros con el operador ":="
Código Delphi [-]
type  tu = record
   nombre :string;
   end  ;

var   a,b:tu;
procedure TForm1.FormCreate(Sender: TObject);
begin
  a.nombre := 'pepe';
  b:= a;
  a.nombre := 'juan';
  ShowMessage('a.nombre es ' a.nombre + ' b.nombre es '+ b.nombre)
end;
obtenemos el mensaje "a.nombre es juan b.nombre es pepe"
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 08-04-2010 a las 19:20:16.
Responder Con Cita
  #4  
Antiguo 08-04-2010
alquimista alquimista is offline
Miembro
 
Registrado: ene 2008
Posts: 203
Poder: 17
alquimista Va por buen camino
Muchas gracias por las lecciones magistrales.

A ver si con toda esa ayuda puedo terminar mi programa..
Un saludo.

Una ultima pregunta:
¿Si libero ListaSprites, se libera la memoria de los objetos Secuencia que estan en ListaSprites?


Código:
for i:=1 TO MAXBOTS do
   if ListaSprites[i]<>nil then
      ListaSprites[i].free;
Código:
type
  TSprite = class
  public
    x, y, xAnterior, yAnterior: Integer;
    ColorTransparente: TColor;
    Imagen, Mascara,buffer: TImage;
    Seleccion: integer;
    deltx,delty:integer;
    Orientacion:TOrientacion;
    Secuencia: Array [1..MAXSEQ] of TSecuencia;
PD:A ver si puedo incrementar mi variable nivel un poco mas: nivel:=inc(nivel);

Última edición por alquimista fecha: 09-04-2010 a las 00:57:07.
Responder Con Cita
  #5  
Antiguo 09-04-2010
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Cita:
Empezado por Lepe Ver Mensaje
Edito:
como me quedé intrigado hice la prueba, Delphi si clona los registros con el operador ":="
Claro: porque los registros (RECORD) no se referencian como los objetos. Esa es una de las diferencias entre registros y clases.

Por cierto, gracias por la explicación acerca de "Assign".




Cita:
Empezado por alquimista Ver Mensaje
Una ultima pregunta:
¿Si libero ListaSprites, se libera la memoria de los objetos Secuencia que estan en ListaSprites?


Código Delphi [-]
for i:=1 TO MAXBOTS do
   if ListaSprites[i]<>nil then
      ListaSprites[i].free;
Exacto: tienes que liberar cada sprite por separado.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #6  
Antiguo 10-04-2010
Avatar de DriverOp
DriverOp DriverOp is offline
Miembro
 
Registrado: ago 2007
Posts: 93
Poder: 17
DriverOp Va por buen camino
Una regla que es bueno recordar siempre: lo que se crea por código, se debe destruir por código.
Responder Con Cita
  #7  
Antiguo 10-04-2010
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Cita:
Empezado por DriverOp Ver Mensaje
Una regla que es bueno recordar siempre: lo que se crea por código, se debe destruir por código.
Yo más bien diría: "Lo que delphi crea, delphi lo destruye, lo que creo yo, lo destruyo yo".

El tema viene por esto:
Código Delphi [-]
form2 := Application.CreateForm(TForm2, Form2);

// o bien

form2 := TForm2.Create(Application);

aquí estamos creando nosotros la ventana, pero le decimos que Delphi la destruya automáticamente al terminar la aplicación; nosotros no tenemos que destruirla.

Caso bien distinto a:
Código Delphi [-]
form2 := TForm2.Create(nil);
donde nosotros lo creamos y nadie se hará cargo de su destrucción. Nosotros debemos destruirla en el OnClose o llamar a form2.Free
__________________
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
Crear Clases propias o Usar Existentes jorllazo Debates 19 27-04-2007 03:07:39
Crear y utilizar librerías de clases Val OOP 2 13-04-2007 17:27:11
Crear clases desde Delphi albertoP OOP 6 19-09-2006 21:47:05
crear clases en delphi alextmb Varios 6 24-04-2006 01:40:45
Como usar correctamente ReplaceDialog? clanmilano Varios 1 06-02-2006 13:41:57


La franja horaria es GMT +2. Ahora son las 08:56:11.


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