Cita:
|
Empezado por dec
Por poner un ejemplo, cuando se destruye un determinado objeto su variable no apuntará ya a la dirección de memoria en que se hacía referencia (si alguna vez fue instanciada la clase de objeto en cuestión) a dicho objeto, y, por lo tanto, la variable de marras será "nil".
|
Si usamos Objeto.Free la variable Objeto se queda con la dirección de memoria donde estaba creada la variable, por ende, es mejor usar siempre FreeAndnil(Objeto) para que se quede apuntando a nil.
Tambien el código:
Código Delphi
[-]
if SerialPort <> nil then
SerialPort.Caption := 'Connected';
se puede traducir como: ¿el Objeto SerialPort ha sido creado previamente?:
- Si, por tanto se puede acceder a su propiedad Caption, así que la modificamos.
- No, entonces, si intentamos acceder a una propiedad (Caption en este caso) que en realidad no existe en memoria, estamos traspasando un puntero nulo y obtendríamos un Access Violation.
Como se puede apreciar, es una pregunta de seguridad. Al tiempo de destruir el objeto SerialPort, seguro que pone FreeAndnil(SerialPort).
Resumiendo:
- Si declaramos una variable que desciende de Tobject, como valor primario debe tener nil (delphi ya lo hace por nosotros), aunque yo prefiero poner Objeto := nil (para clarificar el código)
- Cuando vamos a crear el objeto, miramos si tiene nil:
- Si tiene nil, creamos el objeto.
- Si no tiene nil, significa que ya ha sido creado, por tanto accedemos a él.
Las funciones Assigned y FreeAndnil nos ayudan bastante en nuestro código:
Assigned(objeto) es identico a poner if Objeto <> nil then
Código Delphi
[-]
private
nodo:TTreeNode;
end;
implementation
procedure TForm1.Form1Create;
begin
nodo := nil;
end;
procedure TForm1.button1Click;
begin
if assigned(nodo) then
nodo.text:= 'si ';
else
nodo := TTreenode.Create(self);
end;
procedure Tform1.FormClose;
begin
freeandnil(nodo);
end;
saludos