Ver Mensaje Individual
  #7  
Antiguo 27-04-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Reputación: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
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
    { Private declarations }
  public
    { Public declarations }
  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.

Última edición por nlsgarcia fecha: 27-04-2015 a las 08:04:30.
Responder Con Cita