AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fragen zu Generic TList

Ein Thema von norwegen60 · begonnen am 25. Jan 2017 · letzter Beitrag vom 26. Jan 2017
 
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
505 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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz