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.