Thema: Delphi Was muss ich einbinden?

Einzelnen Beitrag anzeigen

Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Was muss ich einbinden?

  Alt 24. Jan 2007, 08:50
TList ist eine Klasse zum Verwalten von Zeigern. Daher müsst du einen Zeiger auf den Record einfügen. Der Record selber geht nicht, sonst müsste TList rausbekommen wie gross die Elemente sind. Da sie das nicht kann, verwaltet sie einfach nur Zeiger auf die Elemente und die Daten an sich interessieren sie nicht - da zeigt ja der Zeiger hin.

Um einen Zeiger auf den Record einzufügen, musst du erstmal einen festen Speicherplatz für den Record erstellen. Ein einfacher @-Operator hilft nicht viel, da dies nur ein temporärer Zeiger wäre, da der Record dann nur eine lokale Veriable wäre, welche bei verlassen der Procedure seine Gültigkeit verliert.

Delphi-Quellcode:
unit DartBoard;

interface

uses
  Classes, SysUtils, Dialogs, Windows;

type
  TDartField = record
    Region : HRGN;
    Field : String
  end;
  PDartField = ^TDartField; // Zeiger auf Record als PDartField definieren

  TDartBoard = class(TList)
  private

  protected
    procedure Notify(Ptr: Pointer; Action: TListNotification); override;

  public

    procedure Add(Item: TDartfield);
  end;

implementation

{ TDartBoard }

procedure TDartBoard.Add(Item: TDartField);
Var
  lEntry: PDartField;
begin
  New(lEntry); // neuen Record Speicherplatz besorgen
  lEntry^ = Item; // Inhalt kopieren
  inherited Add(Item); // Zeiger einreihen
end;

procedure TDartBoard.Notify(Ptr: Pointer; Action: TListNotification);
Begin
  If Action = lnDeleted Then
    Dispose(PDartField(Ptr));

  Inherited;
End;

end.
Die Funktion Notify wird von TList deklariert und von TList aufgerufen, wenn die Items verarbeitet werden. Dabei kann man gut die Aufrufe vom Entfernen eines Eintrages nutzen, um den alloziierten Speicherplatz wieder freizugeben. Die Funktion wird von Delete, Clear, Extract etc aufgerufen und so muss man nur hier ansetzen um das zentral zu erledigen.
  Mit Zitat antworten Zitat