Re: Dynamic arrays of record/object



sakkieLFS@xxxxxxxxx wrote:
I ready to pull out my hair on the creation of dynamic arrays of a
record or object. For some reason I'm having problems setting the
lenght of the array and assigning values to the elements of the array
(which is a record). I have included source code. Please help!

According to this code, your problem should not be in setting the array's length. The problem occurs beforehand.

type

TSectionData = record
DataHeader: string;
Data: string;
end;


TXMLSectionData = class(TObject)

private
FCount: Integer;
FSectionData: array of TSectionData;
function GetCount: integer;
public

constructor Create;
destructor Destroy; override;

property Count: integer read GetCount write FCount;

Don't have a property that directly writes the value of that field. If you assign a new value of the property, then FCount is no longer an accurate representation of the length of the array.

You don't really even need FCount. The array already knows its own length, and it's easy to detect with the Length function.

procedure AddSection(DataHeader: string; Data: string);

end;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TXMLSectionData }

procedure TXMLSectionData.AddSection(DataHeader, Data: string);

Declare those parameters const to avoid unnecessary reference counting.

begin
SetLength(FSectionData,FCount+1);
FSectionData[FCount].DataHeader:= DataHeader;
FSectionData[FCount].Data:= Data;
Inc(FCount);
end;

constructor TXMLSectionData.Create;
begin
inherited;
FCount:= 0;
SetLength(FSectionData,FCount);

Dynamic arrays start out with length zero, so you don't really need to set it explicitly.

Likewise, a class begins life with numeric fields zero and dynamic arrays empty, so you don't really need a constructor at all.

end;

destructor TXMLSectionData.Destroy;
begin

inherited;
end;

If that's all you're really doing, then you don't need to have a destructor in this class. The one it inherits from its ancestor is sufficient.

procedure TForm1.Button1Click(Sender: TObject);
var Data: TXMLSectionData;
begin
Data.Create;

That line will surely fail. Doesn't the compiler warn you about using an uninitialized variable?

Data.AddSection('Header1','test data');

end;

function TXMLSectionData.GetCount: integer;
begin
Result := FCount;
end;



--
Rob
.


Quantcast