Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Listbox loescht verkehrtes item. (https://www.delphipraxis.net/58529-listbox-loescht-verkehrtes-item.html)

lucius 8. Dez 2005 15:07


Listbox loescht verkehrtes item.
 
Hallo Leute ich brauche nochmal kurz euere Hilfe bitte.
Ich habe eine Listbox die wird verglichen met eine StringListe, jetzt wollte ich das wenn ein Item nicht in der StringListe vorkommt das es aus der Listbox entfernt wird.
Delphi-Quellcode:
for b := y.Count-1 downto 0 do
  for p := ListBox1.Items.Count-1 downto 0 do
     if not listbox1.Items.IndexOf(y.Strings[b])= -1 then
       begin
       ListBox1.Items.Delete(b); //Loescht aber das verkehrte Item//
       showmessage(listbox1.Items.Strings[b]); //zur Kontrolle zeigt das richtig zu loeschende Item an//
       end;
Kann mir da einer helfen bitte?
Ist bestimmt nen kleinen Fehler aber ich sehe ihn im Moment nicht.

MFG Lucius.

Flocke 8. Dez 2005 15:18

Re: Listbox loescht verkehrtes item.
 
Versuche es so:
Delphi-Quellcode:
for b := y.Count-1 downto 0 do
begin
  p := listbox1.Items.IndexOf(y.Strings[b]);
  if p <> -1 then
    ListBox1.Items.Delete(p);
end;

Scorpion 8. Dez 2005 15:20

Re: Listbox loescht verkehrtes item.
 
Also wenn du erst löschst und dann das showmessage kann ja garnicht das richtige angezeigt werden, da es sich nicht mehr in der listbox befindet ;)

lucius 8. Dez 2005 15:28

Re: Listbox loescht verkehrtes item.
 
Flocke, dein Code loescht das verkehrte Item aus der Listbox.
Scorpion, hast recht.

Flocke 8. Dez 2005 15:36

Re: Listbox loescht verkehrtes item.
 
Wenn ich deinen Code richtig `verstehe´ dann bezieht sich der Index "b" auf die Liste "y" und der Index "p" auf "ListView1.Items". Wieso prüfst du denn erst, ob "y.Strings[b]" vorhanden ist, wenn du dann doch "ListView1.Items[b]" löscht?

lucius 8. Dez 2005 15:50

Re: Listbox loescht verkehrtes item.
 
Hallo Flocke ich werde es dir mal erklaeren, also
die StringListe y wird immer gefuellt mit 20 Items, die StringListe y wird dan von unten ab vergliechen mit den Listbox Items wenn es Unterschiede gibt werden diese in eine Stringliste w uebergeben.
Die StringListe w enthaelt also die NEU hinzugekommenen Items, diese werden wieder an der Listbox hinzugefuegt(Insert(0, --)).
So jetzt kann es aber mal vorkommen das ein Item wieder vom Server aus der StringListe y rausgenommen wird, das dan wohl noch in der Listbox steht also ist die Listbox nicht mehr aktuell und jetzt kommt der Code den ich gepostet habe der das Item wieder rausnehmen soll.

Hoffentlich verstehst du was ich meine.

GRuss Lucius.

Flocke 8. Dez 2005 16:47

Re: Listbox loescht verkehrtes item.
 
Dann ist dein Code oben aber ziemlich `unsinnig´ (gelinde gesagt) 8)

Du willst also alle Zeilen aus "ListView1" löschen, die nicht in "y" stehen?
Das geht so:
Delphi-Quellcode:
for p := ListBox1.Items.Count - 1 downto 0 do
  if y.IndexOf(ListBox1.Items[p]) = -1 then
    ListBox1.Items.Delete(p);

lucius 8. Dez 2005 17:11

Re: Listbox loescht verkehrtes item.
 
Ja Flocke funktioniert, vielen Dank.
Zitat:

Dann ist dein Code oben aber ziemlich `unsinnig´ (gelinde gesagt)
Kommt davon wenn man 2 Stunden am selben Code sitzt und probiert und probiert und ich bin eben noch kein Profi wie die meisten hier sind nehme ich an. :roll:

MFG Lucius.

leddl 8. Dez 2005 17:25

Re: Listbox loescht verkehrtes item.
 
Zitat:

Zitat von lucius
Kommt davon wenn man 2 Stunden am selben Code sitzt und probiert und probiert und ich bin eben noch kein Profi wie die meisten hier sind nehme ich an. :roll:

Das glaube ich nicht. Von den ca 16.000 Mitgliedern wird wohl die überwältigende Mehrheit reine Hobbyprogrammierer sein. Und selbst Profis passieren auch mal ziemlich dumme Fehler. Und nur durch Fehler lernt man, diese auch zu verhindern. ;)

lucius 8. Dez 2005 17:30

Re: Listbox loescht verkehrtes item.
 
Dank leddl fuer die Bestaetigung. :wink:

marabu 8. Dez 2005 19:02

Re: Listbox loescht verkehrtes item.
 
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

Neutral General 8. Dez 2005 19:03

Re: Listbox loescht verkehrtes item.
 
Zitat:

Zitat von leddl
Zitat:

Zitat von lucius
Kommt davon wenn man 2 Stunden am selben Code sitzt und probiert und probiert und ich bin eben noch kein Profi wie die meisten hier sind nehme ich an. :roll:

Das glaube ich nicht. Von den ca 16.000 Mitgliedern wird wohl die überwältigende Mehrheit reine Hobbyprogrammierer sein. Und selbst Profis passieren auch mal ziemlich dumme Fehler. Und nur durch Fehler lernt man, diese auch zu verhindern. ;)

Hobbyprogrammierer sind nicht zwingend unprofessionell :evil: :wink:

lucius 8. Dez 2005 19:13

Re: Listbox loescht verkehrtes item.
 
Tja marabu, kurz und knapp, dein Beitrag beinhaltet alles ueber mein Problem aber ich denke nach 3 Tagen Arbeit und genug Zigaretten ab Heute, werde ich wieder ein kleines Schtueck naeher an der Loesung sein.
Bevor ich aber das ganze Problem Wasserdicht habe denk ich mal brauche ich wohl noch eine Weile.

MFG Lucius.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:07 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