![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
|||
|
|||
|
Hola, entiendo que self es una referencia a un objeto, pero no entiendo por que no puede cambiarse, en otros lugares he usado la instrucción
Código:
VecinoParticula:=VecinoAux9.Clon; Código:
VecinoAux9:=Self.Clon; El procedimiento correspondiente es: Código:
function clsParticula.Clon():clsParticula;
var
i:Integer; {Esta función realiza un clon independiete, elimina el uso de punteros en las instancias}
begin
Result:=clsParticula.Create;
Result.VClasificacion:=Copy(Self.VClasificacion);
Result.VCoordenadasActual:=Copy(Self.VCoordenadasActual);
Result.VCoordenasPosicionAnterior:=Copy(Self.VCoordenasPosicionAnterior);
Result.VCoordenadasMejorPosicion:=Copy(Self.VCoordenadasMejorPosicion);
Result.VDistancias:=Copy(Self.VDistancias);
Result.ValorDeLaInerciaActual:=Self.ValorDeLaInerciaActual;
Result.ValorInerciaEnMejorPosicion:=Self.ValorInerciaEnMejorPosicion;
Result.VCardinalidades:=Copy(Self.VCardinalidades);
Result.VVelocidad:=Copy(Self.VVelocidad);
//Tabu
Result.OperaRealizadaVecino:=Self.OperaRealizadaVecino;
Result.PosicionModificadaParaVecino:=Self.PosicionModificadaParaVecino;
Result.PosicionAActualizarEnLT:=Self.PosicionAActualizarEnLT;
SetLength(Result.ListaTabu,2,TamaMaxListaTabu);
Result.ListaTabu[0]:=Copy(Self.ListaTabu[0]);
Result.ListaTabu[1]:=Copy(Self.ListaTabu[1]);
Result.TamaActualLT:=Self.TamaActualLT;
Result.SeGeneroElVecino:=Self.SeGeneroElVecino;
end;
Saludos... |
|
#2
|
||||
|
||||
|
Porque SELF no es una variable, sino una constante. Siempre es la referencia (puntero) al objeto del método que se está ejecutando en ese momento.
Cuando defines un método de una clase, como por ejemplo:
en realidad el compilador lo interpreta como si fuera así:
Y cuando llamas al método:
El compilador lo interpreta como si fuera así:
El caso de RESULT es diferente, ya que sí es una variable cuya posición de memoria se corresponde con la posición de pila donde el llamante tomará el valor devuelto por la función. En cierto modo, una definición como: Se interpreta como si fuera: y si fuera método de una clase...
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi! - BAScript - Multi Language Scriptable Development Environment Última edición por Ñuño Martínez fecha: 18-12-2013 a las 15:20:18. |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| ??Como modificar una variable externa en un procedimiento?? | jasmad | Lazarus, FreePascal, Kylix, etc. | 6 | 02-12-2011 00:40:38 |
| condicionar un procedimiento dentro de otro procedimiento | yossi | Varios | 7 | 17-05-2010 11:47:14 |
| Abrir fichero asociado si la aplicacion ya esta activa. | Geta | Varios | 4 | 13-03-2009 02:43:51 |
| Como hacer un commit dentro de un procedimiento almacenado | altp | Firebird e Interbase | 6 | 03-11-2005 19:21:32 |
| Como modificar valores desde un dbgrid q esta asociado a un QUERY? | fmonte | SQL | 12 | 26-08-2004 23:25:22 |
|