doctorhd,
Cita:
Empezado por doctorhd
...porque si al aplicar FreeAndNil en mi código no establece el valor del objeto nil...
|
El problema radica en que estas pasando
los objetos por valor y no por referencia al método TfunGlobal.CloseObjet.
Revisa este código
Código Delphi
[-]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
public
end;
TNelson = class
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure CloseNelson(var Nelson : Array of TNelson);
var
i : Integer;
begin
for i:= Low(Nelson) to High(Nelson) do
if Assigned(Nelson[i]) then
FreeAndNil(Nelson[i]);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Nelson : Array[0..1] of TNelson;
i : Integer;
begin
for i := Low(Nelson) to High(Nelson) do
Nelson[i] := TNelson.Create;
for i := Low(Nelson) to High(Nelson) do
if Assigned(Nelson[i]) then
MessageDlg(Format('Instancia %d de la clase Nelson',[i]),mtInformation,[mbOK],0)
else
MessageDlg(Format('Elemento %d del arreglo de clase Nelson no instanciado',[i]),mtInformation,[mbOK],0);
for i := Low(Nelson) to High(Nelson) do
if Assigned(Nelson[i]) then
FreeAndNil(Nelson[i]);
for i := Low(Nelson) to High(Nelson) do
if Assigned(Nelson[i]) then
MessageDlg(Format('Instancia %d de la clase Nelson',[i]),mtInformation,[mbOK],0)
else
MessageDlg(Format('Elemento %d del arreglo de clase Nelson no instanciado',[i]),mtInformation,[mbOK],0);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
Nelson : Array[0..1] of TNelson;
i : Integer;
begin
for i := Low(Nelson) to High(Nelson) do
Nelson[i] := TNelson.Create;
for i := Low(Nelson) to High(Nelson) do
if Assigned(Nelson[i]) then
MessageDlg(Format('Instancia %d de la clase Nelson',[i]),mtInformation,[mbOK],0)
else
MessageDlg(Format('Elemento %d del arreglo de clase Nelson no instanciado',[i]),mtInformation,[mbOK],0);
CloseNelson(Nelson);
for i := Low(Nelson) to High(Nelson) do
if Assigned(Nelson[i]) then
MessageDlg(Format('Instancia %d de la clase Nelson',[i]),mtInformation,[mbOK],0)
else
MessageDlg(Format('Elemento %d del arreglo de clase Nelson no instanciado',[i]),mtInformation,[mbOK],0);
end;
end.
En el código anterior en Delphi 7 sobre Windows 7 Professional x32, el método TForm1.Button1Click
instancia y libera objetos de la clase TNelson directamente, pero en el método TForm1.Button2Click la liberación de los objetos de la clase TNelson
se hace por medio del procedimiento CloseNelson al cual se le pasa por referencia un arreglo de objetos TNelson, si el paso fuera por valor
solo se aplicaria nil a los objetos actuales del arreglo Nelson del procedimiento CloseNelson, no a los objetos originales del arreglo Nelson del método TForm1.Button2Click, sin embargo los objetos serían liberados dado que el paso por valor contiene la referencia a los mismos.
La solución es :
Código Delphi
[-]
procedure TfunGlobal.CloseObjet(var AObjeto : Array of TObject);
var
vIndice : Integer;
begin
for vIndice := Low(AObjeto) to High(AObjeto) do
if Assigned(AObjeto[vIndice]) then
FreeAndNil(AObjeto[vIndice]);
end;
Espero sea útil
Nelson.