AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Listbox Einträge vergl., bei Doppelbelegung einen Löschen
Thema durchsuchen
Ansicht
Themen-Optionen

Listbox Einträge vergl., bei Doppelbelegung einen Löschen

Ein Thema von Ginko · begonnen am 9. Okt 2008 · letzter Beitrag vom 9. Okt 2008
Antwort Antwort
Seite 1 von 3  1 23      
Ginko

Registriert seit: 30. Aug 2008
208 Beiträge
 
FreePascal / Lazarus
 
#1

Listbox Einträge vergl., bei Doppelbelegung einen Löschen

  Alt 9. Okt 2008, 12:45
Hallo, ich habe folgendes Problem, also ich will die einträge einer Listbox an bestimmten stellen
vergleichen und bei Doppelbelegung einen rauslöschen. Ich habe es mit einer 'repeat' Schleife wie folgt versucht:
Delphi-Quellcode:
  
if listbox0.Items.Count = 5 then
  begin
    o:=0;
    p:=0;
    repeat
      o := o + 1;
      p := p + 1;
      if (listbox0.Items[o][5] + listbox0.Items[o][7] + listbox0.Items[o][9]) =
         (listbox0.Items[p][5] + listbox0.Items[p][7] + listbox0.Items[p][9]) then
           listbox0.Items.Delete(o);
    until (listbox0.Items.Count <> 5) or (o = 5);

  end;
Allerdings löscht er nicht den doppelten Eintrag sondern einfach den ersten in der Listbox, dass ist das Problem....
Wäre toll wenn jemand eine Idee hätte !

Also die Einträge sind nur an den bestimmten Stellen gleich.
also es sieht zB ein gleicher Eintrag so aus:
1) 0 1 1
4) 0 1 1
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.685 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Listbox Einträge vergl., bei Doppelbelegung einen Lösche

  Alt 9. Okt 2008, 13:05
o und p sind immer gleich, und dadurch ergibt dein Vergleich auch immer "true". Du müsstest wenn mit einer Doppelschleife anrücken.

Wäre es jedoch nicht prinzipiell einfacher, vor dem Einfügen eines neuen Eintrages zu prüfen ob er schon vorhanden ist, und ggf. diesen zu verwerfen?
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

Re: Listbox Einträge vergl., bei Doppelbelegung einen Lösche

  Alt 9. Okt 2008, 13:09
Hallo,
p und o sind bei Dir doch immer gleich, Du vergleichst da anscheinend einen Eintrag immer mit sich selbst und da die Schleife aufhört, wenn count <> 5, wird bei 5 Einträgen nur der erste gelöscht, da danach ja nur noch 4 vorhanden sind, änderst Du until (listbox0.Items.Count <> 5) or (o = 5); auf until (listbox0.Items.Count <> 3) or (o = 3); werden entsprechend mehr Einträge gelöscht. Willst Du zwei hintereinanderliegende Einträge miteinander vergleichen, so sollte p um eins größer als o sein.
Versuchs mal damit:
Delphi-Quellcode:
if listbox0.Items.Count = 5 then
begin
  o:=1;
  repeat
    if (listbox0.Items[o][5] + listbox0.Items[o][7] + listbox0.Items[o][9]) =
       (listbox0.Items[o - 1][5] + listbox0.Items[o - 1][7] + listbox0.Items[o - 1][9]) then
         listbox0.Items.Delete(o);
    Inc(o);
  until (listbox0.Items.Count <> 5) or (o = 5);
end;
p ist dann überflüssig.
  Mit Zitat antworten Zitat
Ginko

Registriert seit: 30. Aug 2008
208 Beiträge
 
FreePascal / Lazarus
 
#4

Re: Listbox Einträge vergl., bei Doppelbelegung einen Lösche

  Alt 9. Okt 2008, 14:44
Hallo danke für die schnellen Antworten, also es klappt mit deiner Lösung fast, allerdings nur wenn ich 'o'
auf 4 ändere
Delphi-Quellcode:
  if listbox0.Items.Count = 5 then
    begin
      o:=1;
      repeat
        if (listbox0.Items[o][5] + listbox0.Items[o][7] + listbox0.Items[o][9]) =
           (listbox0.Items[o - 1][5] + listbox0.Items[o - 1][7] + listbox0.Items[o - 1][9]) then
            listbox0.Items.Delete(o);
            Inc(o);
      until (listbox0.Items.Count <> 5) or (o = 4);
    end;
ansonsten bringt er mir nen Exception, das liegt aber denk ich mal daran, dass bei der Listbox der 'Index' bei 0
anfängt und der 'Count' normal bei 1.
Also 'o' ist ja die Indexnummer und bei 4 müsste der 'Count' auf 5 stehen, damit kein Fehler kommt, wenn ich mich nicht täusche.
Jedenfalls das Problem ist, dass der erste, der zweite und der letzte Wert nicht verglichen werden also nur wenn
wenn Idex[2] und Index[3] gleich sind wird eins gelöscht...
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#5

Re: Listbox Einträge vergl., bei Doppelbelegung einen Lösche

  Alt 9. Okt 2008, 14:53
Hallo,

nein, Deine Annahme stimmt nicht.
Mit jedem Löschen eines Eintrages ändert sich automatisch count, so dass die Abfrage auf o = 4 nur dann stimmt, wenn Du vorher 5 Einträge hast und davon einen löschst. Das von Dir gewählte Konstrukt ist so hochgefährlich, wenn es funktioniert, dann nur unter ganz bestimmten Bedingungen, jede noch so kleine Abweichung führt zu einem Programmfehler.
Hinterfrag bitte mal, ob die Abfrage or o = 4 oder wie auch immer überhaupt erforderlich ist. Und auch die Abfrage auf count <> 5 ist gefährlich. Dass erste Löschen eines Eintrages führt ja schon dazu, dass Count <> 5 ist. In dem Falle dürfte die Abfrage auf o überflüssig sein. Eventuell wäre da ein Count <= o die sinnvollere Alternative.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#6

Re: Listbox Einträge vergl., bei Doppelbelegung einen Lösche

  Alt 9. Okt 2008, 15:02
Mal so eine Idee:
Delphi-Quellcode:
procedure DeleteDoubleItems(const sl: TStrings; MaxIndex: integer = -1);
var i: integer;
begin
  sl.BeginUpdate;
  try
    if (MaxIndex < 0) or (MaxIndex >= sl.Count) then
      MaxIndex := Pred(sl.Count);
    for i := MaxIndex downto 1 do
      if sl.IndexOf(sl[i]) < i then
        sl.Delete(i);
  finally
    sl.EndUpdate;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  DeleteDoubleItems(ListBox1.Items);
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Ginko

Registriert seit: 30. Aug 2008
208 Beiträge
 
FreePascal / Lazarus
 
#7

Re: Listbox Einträge vergl., bei Doppelbelegung einen Lösche

  Alt 9. Okt 2008, 15:17
also
until listbox0.Items.Count <= o; klappt auch aber er frägt nur die Werte zwischen dem ersten und letzten Index ab.
Die Äußeren werden nicht beachtet.
  Mit Zitat antworten Zitat
Ginko

Registriert seit: 30. Aug 2008
208 Beiträge
 
FreePascal / Lazarus
 
#8

Re: Listbox Einträge vergl., bei Doppelbelegung einen Lösche

  Alt 9. Okt 2008, 15:20
Hui DeddyH da blick ich jetzt als Anfänger noch gar nicht durch aber ich werd mich mal veruchen mit
zu beschäftigen, Danke dir trotzdem.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#9

Re: Listbox Einträge vergl., bei Doppelbelegung einen Lösche

  Alt 9. Okt 2008, 15:25
Hallo,

das wird mir zu kompliziert:
Delphi-Quellcode:
if listbox0.Items.Count = 5 then begin
  for o := listbox0.Items.Count - 1 DownTo 1 do begin
    if (listbox0.Items[o][5] + listbox0.Items[o][7] + listbox0.Items[o][9]) =
       (listbox0.Items[o - 1][5] + listbox0.Items[o - 1][7] + listbox0.Items[o - 1][9]) then
         listbox0.Items.Delete(o);
  end;
end;
Damit solltest Du doppelte Einträge wegbekommen. Mir ist bisher nicht klar geworden, wofür die Abfrage auf 5 oder sonstwieviele Einträge gut sein soll, sollen mindestens 5 Einträge in der Listbox überbleiben, auch wenn sie doppelt sind? Warum werden Doppelte nur entfernt, wenn mehr als 5 Einträge vorhanden sind?
  Mit Zitat antworten Zitat
Ginko

Registriert seit: 30. Aug 2008
208 Beiträge
 
FreePascal / Lazarus
 
#10

Re: Listbox Einträge vergl., bei Doppelbelegung einen Lösche

  Alt 9. Okt 2008, 15:37
Also wenn ein Eintrag gelöscht worden ist, soll die Suche beendet werden, deshalb habe ich die Beschränkung auf 5 gemacht, ansonsten sucht er ja weiter wenn er einen gelöscht hat und es sind nur noch 4 Werte da und es wird ein Fehler verursacht, weil auch an der 5ten stelle wieder gesucht wird, die aber jetzt leer ist.

Aber wie ich sehe klappt es auch mit deiner 'for' Schleife nur werden hier auch nicht alle Werte abgefagt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 08:04 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