Hallo Lucius,
Code kann immer nur so gut sein, wie das Problemverständnis. Hier ist meine Beschreibung zu deinem Problem und glaube mir, es ist eigentlich eine unzureichende Kurzfassung. Der Umfang müsste noch auf ein Vielfaches anwachsen, bevor das Problem kontraktfähig beschrieben wäre.
Du holst dir periodisch von einem Server eine Liste mit News (WorkList), welche die neuesten Veröffentlichungen (20) aus einer chronologisch absteigenden Gesamtliste (NewsList) enthält. Da diese WorkList eine feste Kapazität hat, wird beim Hinzufügen eines neuen Items das älteste Item aus der Liste entfernt, wenn diese Kapazität erschöpft ist.
Anhand der WorkList möchtest du auf dem Client eine ähnlich vollständige NewsList aufbauen, damit du auf eine größere Anzahl von Items zugreifen kannst. Deine NewsList ist nicht in der Größe beschränkt. Die Items dieser Liste haben eine von dir festgelegte Lebensdauer (TIMETOLIVE), sodass überalterte Items entfernt werden können.
Die Items werden anhand eines Strings (title) ohne Beachtung der Groß-/Kleinschreibung identifiziert. Beim Verarbeiten der WorkList treten folgende Fälle auf:
- Ein neues Item wurde veröffentlicht: Fehlt das Item in der NewsList, dann wird es hinzugefügt.
- Informationen zu einem Item wurden geändert: Existiert das Item in der NewsList, dann werden seine Daten aktualisiert.
- Ein veröffentlichtes Item wurde zurückgezogen: Um solche Items aus der NewsList zu entfernen geht man die Items aus der WorkList durch und vergleicht mit dem jeweils korrespondierenden Item in der NewsList. Wird eine Ungleichheit festgestellt, dann werden an der aktuellen Stelle soviele Items aus der NewsList entfernt, bis wieder Gleichheit eintritt.
Hier ein paar Zeilen Code dazu:
Delphi-Quellcode:
procedure SynchronizeItems(WorkList, NewsList: TStrings);
var
i: integer;
begin
for i := 0 to Pred(WorkList.Count) do
if NewsList.IndexOf(WorkList[i]) < 0 then
// new item encountered
NewsList.Insert(0, WorkList[i])
else if AnsiCompareText(NewsList[i], WorkList[i]) = 0 then
// there is more to an item than just a title
UpdateItem(i)
else
// withdrawn item encountered
NewsList.Delete(i);
end;
Der Code von Flocke (hallo Volker) löscht zwar alle zurückgezogenen Items aus der NewsList, danach sind dann aber auch nur noch maximal 20 Items drin, die ganze Historie ist gelöscht worden. Das sind bei einer geschätzten publishing rate von 10/Tag und einer TTL von 60 Tagen etwa 600 Items...
Warum dieser Beitrag? Direkt verantwortlich für die Qualität eines Lösungsvorschlages ist die Vollständigkeit und Korrektheit der Problembeschreibung, besonders wenn es um mehr geht als nur ein einzelnes Statement oder eine vergessene
API Funktion. Ich habe ab und zu das Bedürfnis darauf hinzuweisen.
Freundliche Grüße vom marabu