Hallo,
ich habe mich etwas mit Generic TList beschäftigt und hänge nun bei ein paar Punkten. Hier zunächst Code-Auszüge (im Anhang das ganze Projekt).
Delphi-Quellcode:
TMyClass = class
private
FCounter, FValue: Integer;
public
property Counter: Integer read FCounter write FCounter;
property Value: Integer read FValue write FValue;
end;
TMyList = class(TList<TMyClass>)
private
FFreeOnDelete: Boolean;
procedure Notify(Ptr: Pointer; Action: TListNotification); virtual;
public
constructor Create(bValue: Boolean = true);
end;
var
MyList: TMyList;
MyCopyList: TMyList;
MyList := TMyList.Create;
MyCopyList := TMyList.Create(false); // In Copyliste bei Delete Daten nicht löschen
// Datenliste erzeugen
for i := 0 to 50 do
begin
Values := TMyClass.Create;
Values.Counter := i;
Values.Value := random(200);
MyList.Add(Values);
end;
// Datenliste in Memofeld anzeigen
for i := 0 to MyList.Count - 1 do
begin
Values := MyList.Items[i];
Memo1.Lines.Add(format('%d: %d, %d', [i, Values.Counter, Values.Value]));
end;
// Datenliste kopieren
for i := 0 to MyList.Count - 1 do
begin
Values := MyList.Items[i];
MyCopyList.Add(Values);
end;
// Jeden 10 Datensatz in kopierter Liste löschen
MyCopyList.Delete(40);
MyCopyList.Delete(30);
MyCopyList.Delete(20);
MyCopyList.Delete(10); // gelöscht werden aber die letzten 4 Datensätze
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
MyCopyList.Free;
MyList.Free;
end;
{ TMyList }
constructor TMyList.Create(bValue: Boolean = true);
begin
inherited Create;
FFreeOnDelete := bValue;
end;
procedure TMyList.Notify(Ptr: Pointer; Action: TListNotification);
begin
if (FFreeOnDelete) and (Action = lnDeleted) then
TObject(Ptr).Free;
// inherited Notify(Ptr, Action);
end;
Folgende Fragen:
- Gibt es grundsätzliche Fehler bei der Behandlung
- In der Originalliste funktioniert MyList.Delete(30);
einwandfrei, in der kopierten Liste wird mit jedem Aufruf der letzte Satz gelöscht. Warum?
- Notify zum löschen des Speicherplatz funktioniert nicht und inherited führt gleich zu Fehler. Irgendwie scheint der Header in XE10 nicht dem in der Hilfe zu entsprechen. Aber wie geht es richtig?
Danke für eure Unterstützung
Gerd