Hi Leute,
das mit dem nil funzt nur, wenn man ein dynamisches Array anlegt. Hier kann man sicher folgendes machen:
Delphi-Quellcode:
type
TMyData = Record
Point : TPoint;
Param1 : Boolean;
Param2 : Boolean;
Param3 : Boolean;
Param4 : Boolean;
end;
type
TDataList = array of TMyData;
type
TForm1 = class(TForm)
private
{ Private-Deklarationen }
FDataList : TDataList;
public
{ Public-Deklarationen }
procedure AddData(Data : TMyData);
procedure Clear;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{ TForm1 }
procedure TForm1.AddData(Data: TMyData);
begin
IF High(FDataList) = 0 then SetLength(FDataList, 1) else
SetLength(FDataList, Length(FDataList) + 1);
FDataList[High(FDataList)] := Data;
end;
procedure TForm1.Clear;
begin
FDataList := nil;
end;
Das sieht sicher recht einfach aus. Ich persönich habe aber fest gestellt, dass man immer wieder zusätzliche Methoden für den Zugriff auf die einzelnen Elemente in der Liste benötigt.
Dann kommt man von selbst auf das was bttb930 sagt. Ich benutze übrigens nur noch diese Methode.
Der Vorteil ist unter anderem, dass du häufig benötigte Functionen in dein Listenobject integrieren kannst und nebenbei natürlich schon ne Menge Funktionalität vor findest.
Ein kleines Bsp. hier:
Delphi-Quellcode:
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
contnrs;
type
TMyData = class(TObject)
private
FParam1: Boolean;
FParam4: Boolean;
FParam2: Boolean;
FParam3: Boolean;
FPoint: TPoint;
protected
public
Constructor Create(APoint : TPoint;
Param1, Param2, Param3, Param4 : Boolean); overload;
property Point : TPoint read FPoint write FPoint;
property Param1 : Boolean read FParam1 write FParam1;
property Param2 : Boolean read FParam2 write FParam2;
property Param3 : Boolean read FParam3 write FParam3;
property Param4 : Boolean read FParam4 write FParam4;
end;
type
TDataList = class(TObjectList)
private
protected
public
Function GetPointfromIndex(Index : Integer):TPoint;
end;
type
TForm1 = class(TForm)
private
{ Private-Deklarationen }
FDataList : TDataList;
public
{ Public-Deklarationen }
procedure AddData(Data : TMyData);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{ TForm1 }
procedure TForm1.AddData(Data: TMyData);
begin
IF not Assigned(FDataList) then Exit;
FdataList.Add(Data);
end;
{ TMyData }
constructor TMyData.Create(APoint: TPoint; Param1, Param2, Param3,
Param4: Boolean);
begin
inherited create;
FParam1 := Param1;
FParam2 := Param2;
FParam3 := Param3;
FParam4 := Param4;
FPoint := APoint;
end;
{ TDataList }
function TDataList.GetPointfromIndex(Index: Integer): TPoint;
var Data : TMyData;
begin
// vorbelegen
Result := Point(-1, -1);
// bei blödsinnigem Index raus
IF (Index < 0) or (Index >= self.Count) then Exit;
// Typ-casting
Data := TMyData(self.Items[Index]);
try
IF not assigned(Data) then Exit;
Result := Data.Point;
except
Result := Point(-1, -1);
end;
end;
o.k. ich hab mir hier jetzt das creieren und frei geben der Liste gespart, aber es soll nur mal die grundlegende Vorgehensweise zeigen. Wie in den vorherigen Beiträgen beschrieben wird jetzt mit der Freigabe der Liste automatisch auch jedes enthaltene Data-Objekt mit frei gegeben.
das wars von mir,
Gruß oki