Blog coding and discussion of coding about JavaScript, PHP, CGI, general web building etc.

Friday, February 5, 2016

How do I free the contents of a TList?

How do I free the contents of a TList?


I have this code in Delphi 4. I created 10 objects of type T_Charge (see below), which I added to a TList, named myList. The T_Charge type has references to three objects of type T_Platte (see below).

What is the correct way of freeing all the memory of all 10 objects? So, for every object I want to free the memory of P1, P2, P3, F_Treated and so on, as well as the memory of myCharge itself. I tried about everything, but keep getting errors.

procedure Test;  var     myList: TList;    myCharge: T_Charge;  begin    myList := TList.Create;      for i := 0 to 9 do    begin;      myCharge := T_Charge.Create(...);      myList.Add(myCharge);    end;    ...  end;    type    T_Platte = class(TObject)    private      F_Nummer : Integer;      F_Los    : Integer;      F_Dicke  : Real;      F_Lange  : Real;      F_Breite : Real;      F_QuenchCode : Integer;      F_Geschwindigkeit : Real;      F_Menge  : Integer;      F_MengeInLos : Integer;      F_Treated : Boolean;    public      constructor Create(inNummer, inLos: Integer; inDicke, inLange, inBreite, inGeschwindigkeit : Real; inQuenchCode,inMenge: Integer; inTreated: Boolean); overload;      constructor Create(inPlatte: T_Platte); overload;      destructor Destroy; override;        property Nummer: Integer read F_Nummer write F_Nummer;      property Los: Integer read F_Los write F_Los;      property Dicke: Real read F_Dicke write F_Dicke;      property Lange: Real read F_Lange write F_Lange;      property Breite: Real read F_Breite write F_Breite;      property QuenchCode : Integer read F_QuenchCode write F_QuenchCode;      property Geschwindigkeit: Real read F_Geschwindigkeit write F_Geschwindigkeit;      property Menge: Integer read F_Menge write F_Menge;      property MengeInLos: Integer read F_MengeInLos write F_MengeInLos;      property Treated: Boolean read F_Treated write F_Treated;        function getPlattenRecord: string;    end; // class T_Platte        T_Charge = class(TObject)    private      F_P1 : T_Platte;      F_P2 : T_Platte;      F_P3 : T_Platte;      F_Treated : Boolean;      F_Vmin : Real;      F_Qty : Integer;      F_RelationNext : Boolean;    public      constructor Create(inP1, inP2, inP3 : T_Platte; inTreated: Boolean; inVmin: Real; inQty: Integer; inRelationNext: Boolean);  overload;      constructor Create(inCharge : T_Charge); overload;      destructor Destroy; override;        property P1: T_Platte read F_P1 write F_P1;      property P2: T_Platte read F_P2 write F_P2;      property P3: T_Platte read F_P3 write F_P3;      property Treated : Boolean read F_Treated write F_Treated;      property Vmin : Real read F_Vmin write F_Vmin;      property Qty : Integer read F_Qty write F_Qty;      property RelationNext : Boolean read F_RelationNext write F_RelationNext;        function getChargeRecord: string;    end; // class T_Charge      constructor T_Platte.Create(inNummer, inLos: Integer; inDicke, inLange, inBreite, inGeschwindigkeit: Real; inQuenchCode,inMenge: Integer; inTreated: Boolean);  begin    F_Nummer := inNummer;    F_Los := inLos;    F_Dicke := inDicke;    F_Lange := inLange;    F_Breite := inBreite;    F_Geschwindigkeit := inGeschwindigkeit;    F_QuenchCode := inQuenchCode;    F_Menge := inMenge;    F_MengeInLos := 0;    F_Treated := inTreated;  end;    constructor T_Charge.Create(inP1, inP2, inP3 : T_Platte; inTreated: Boolean; inVmin:  Real; inQty: Integer; inRelatio nNext: Boolean);  begin    F_P1 := T_Platte.Create(inP1);    F_P2 := T_Platte.Create(inP2);    F_P3 := T_Platte.Create(inP3);    F_Treated := inTreated;    F_Vmin := inVmin;    F_Qty := inQty;    F_RelationNext := inRelationNext;  end;  

Answer by Keith Miller for How do I free the contents of a TList?


Before destroying myList you need:

for i := 0 to myList.Count - 1 do    begin;    TObject(myList[i]).Free  end;  

In the destructor for T_Charge you need to free F_P1, F_P2 and F_P3.

Answer by Ken White for How do I free the contents of a TList?


Add the following to the destructor for T_Charge:

destructor T_Charge.Destroy;  begin    F_P1.Free;    F_P2.Free;    F_P3.Free;    // Other code as needed    inherited;  end;  

Before you free your list, loop through and delete each T_Charge:

for i := 0 to myList.Count - 1 do    TObject(myList[i]).Free;         // This will free the inner `T_Platt3`                                      // each `T_Charge` contains.  

Answer by LU RD for How do I free the contents of a TList?


Don't forget to type cast the items, since they holds a pointer without type !

for i := 0 to myList.Count - 1 do  begin    T_Charge(myList[i]).Free;  // Type cast  end;  

Answer by Mad Hatter for How do I free the contents of a TList?


To free the list objects, create your list and override TList.Notify().

procedure THotFixList.Notify(Ptr: Pointer; Action: TListNotification);  begin    inherited;    if Action = lnDeleted then      Tobject(Ptr).Free;  end;  

It will ensure your objects are freed whenever you call TLIst.Delete, TList.Clear, TList.Free, without having to iterate the list yourself each time.

Answer by iamjoosy for How do I free the contents of a TList?


Specifically when a list should hold class instances I think you should rather use TObjectList for that purpose (TObjectList). Call the constructor of the TObjectList with Create(True) which tells the list to free all contained class instances once the list gets destroyed or you remove an item from it. Nevertheless, as mentioned in Ken White's answer you still need to free F_P1 etc. in the T_Charge destructor.

Answer by Anonymous for How do I free the contents of a TList?


Little knowledge of classes: TList vs TObjectList

TList holds Pointers so has no idea of how to free any TObject stored

TObjectList hols TObjects, so can free them and does it automatically

My best i can say: Use TObjectList instead of TList as your base class or type declaration.

Samples:

Wrong: TMyListOfObjects=class(TList) ...   Good: TMyListOfObjects=class(TObjectList) ...    Wrong: MyListOfObjects:TList;   Good: MyListOfObjects:TObjectList;  

Note: TList is declared on unit classes and TObjectList is declared on Contnrs, that makes so many people use TList and do not know anything about TObjectList (also me before i read about TObjectList on Internet some time ago).


Fatal error: Call to a member function getElementsByTagName() on a non-object in D:\XAMPP INSTALLASTION\xampp\htdocs\endunpratama9i\www-stackoverflow-info-proses.php on line 72

0 comments:

Post a Comment

Popular Posts

Powered by Blogger.