Einzelnen Beitrag anzeigen

oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Records, Pointer, Listen & Co.

  Alt 22. Sep 2006, 08:27
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
  Mit Zitat antworten Zitat