Einzelnen Beitrag anzeigen

norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
504 Beiträge
 
Delphi 12 Athens
 
#1

Fragen zu Generic TList

  Alt 25. Jan 2017, 21:27
Delphi-Version: 10 Seattle
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:
  1. Gibt es grundsätzliche Fehler bei der Behandlung
  2. In der Originalliste funktioniert MyList.Delete(30); einwandfrei, in der kopierten Liste wird mit jedem Aufruf der letzte Satz gelöscht. Warum?
  3. 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
Angehängte Dateien
Dateityp: zip TListClass.zip (52,6 KB, 9x aufgerufen)
  Mit Zitat antworten Zitat