![]() |
If ... or ... then verwirrt mich
Moin moin,
ich steig grad durch mein eigenes Programm nicht durch... Folgendes ist der Fall:
Delphi-Quellcode:
Ich durchsuche eine Combobox nach den Wörtern YASU und DT... naja..
i := 0;
repeat if (combobox1.items.Strings[i] = 'YASU') or (combobox1.Items.Strings[i] = 'DT') then combobox1.Items.Delete(i); a := combobox1.Items.Count; i := i+1; until i >= combobox1.Items.Count+2; Er löscht immer nur DT, warum? Alternative, damit es funzt ist
Delphi-Quellcode:
Für micht ist das das selbe!? Wenn Yasu oder DT vorkommt lösche den, sonst mach weiter... hmmm
repeat
if combobox1.items.Strings[i] = 'DT' then combobox1.Items.Delete(i); if combobox1.Items.Strings[i] = 'YASU' then combobox1.Items.Delete(i); a := combobox1.Items.Count; i := i+1; until i >= combobox1.Items.Count+2; weitere abhilfe schafft aber auch, wenn ich in der ini datei aus der ich das ganze lade dt und yasu an erster stelle setzt, anstatt an letzter... aber es sollte mit beiden funktionieren, damit ich später nicht in der ini rumfuchteln muss... ps... die variable a ist nur zu debug zwecken grad da, weil ich vorher ne endlosschleife hatte, weil i plötzlich größer war also combo.count und ich dort das > noch nicht dirn hatte... naja :D hab mich halt gewundert ;) deswegen auch die +2 für zwei gelöschte einträge. mfg Marcel |
Re: If schleife verwirrt mich
Erst einmal gibt es keine if-Schleife. Und dann hab ich noch nicht ganz begriffen, was Du vorhast. Sollen alle Einträge gelöscht werden, die YASU oder DT an beliebiger Stelle enthalten?
|
Re: If schleife verwirrt mich
Zitat:
combobox1.Items.Delete(i); ;) ja wie gesagt ist einfach eine ini datei.. alle sections werden in die combobox geladen und die die dt oder yasu enthalten sollen nicht angezeigt/gelöscht werden sry, if schleife ist doof ;) aber halt die repeat schleife führt das if ständig wieder aus :D |
Re: If schleife verwirrt mich
Hallo!
Besser ist es mit einer for-Schleife zu machen!
Delphi-Quellcode:
lg
for I := ComboBox1.Items.Count-1 DownTo 0 do
if (ComboBox1.Items[I] = 'YASU') or (ComboBox1.Items[I] = 'DT') then ComboBox1.Items.Delete(I); |
Re: If schleife verwirrt mich
das funzt....
aber warum das mit der repeat until schleife nicht???? ^^ ich wills ja einfach nur verstehn, damit ich ein wenig schlauer werde |
Re: If schleife verwirrt mich
Dann würde ich das so machen:
Delphi-Quellcode:
[edit] Wo kommen denn die Beiträge auf einmal her? Außerdem ist eine repeat-Schleife hier nicht angesagt, da man evtl. auf einen nicht existenten Eintrag zugreift.[/edit]
ComboBox.Items.BeginUpdate;
try for i := ComboBox.Items.Count - 1 downto 0 do if AnsiContainsText(ComboBox.Items[i],'yasu') or AnsiContainsText(ComboBox.Items[i],'dt') then ComboBox.Items.Delete(i); finally ComboBox.Items.EndUpdate; end; |
Re: If ... or ... then verwirrt mich
hmmm...
das verwirrt mich zu sehr ;) hab nich mal ne ahnung, wozu combobox.items.beginupdate da ist. wie gesagt die verison da vor funzt, ich nehm die und nun ja... mein erstes prob ist immernoch nich gelöst.. warum funktioniert das nicht? |
Re: If ... or ... then verwirrt mich
Das Problem ist, dass du nach Löschen ja die Anzahl und den Index des nachfolgenden Eintrages löscht. In einem solchen Fall, laufe ich immer die Liste von oben nach unten durch, dann verschieben sich die Indices nicht.
|
Re: If ... or ... then verwirrt mich
Funktioniert es denn so?
Delphi-Quellcode:
i := 0;
repeat if (combobox1.items.Strings[i] = 'YASU') or (combobox1.Items.Strings[i] = 'DT') then combobox1.Items.Delete(i) else i := i+1; a := combobox1.Items.Count; until i >= combobox1.Items.Count; |
Re: If ... or ... then verwirrt mich
Die Zeile
Delphi-Quellcode:
scheint falsch zu sein. Richtig wäre
until i >= combobox1.Items.Count+2;
Delphi-Quellcode:
until i > combobox1.Items.Count - 1;
Zitat:
![]() |
Re: If ... or ... then verwirrt mich
zack :D nagel aufm kopf getroffen ^^
okay ;) also bewirkt das beginupdate, dass die indexe (indicies sieht genauso bescheuert aus ^^) gleich bleiben und sich nicht verschieben, was bei mir ja der fall wäre, da ich ja einen lösche... okay okay ;) verstanden und danke :D |
Re: If ... or ... then verwirrt mich
Nein, BeginUpdate sorgt nur dafür, dass die Items während der Abarbeitung nicht neu gezeichnet werden, solange bis das entsprechende EndUpdate folgt.
|
Re: If ... or ... then verwirrt mich
Zitat:
Zitat:
|
Re: If ... or ... then verwirrt mich
Wenn du von vorn nach hinten durchgehst und was löschst und auch beim Löschen den Index hochzählst, dann überspringst du den nachfolgenden Eintrag, da dieser ja an die Stelle des Gelöschten rutscht. :zwinker:
a) Schleife rückwärts b) oder beim Löschen nicht weitergehn |
Re: If ... or ... then verwirrt mich
Edit: Ok wieder zu langsam.
Delphi-Quellcode:
ist nicht dasselbe wie
if (combobox1.items.Strings[i] = 'YASU') or (combobox1.Items.Strings[i] = 'DT') then
combobox1.Items.Delete(i);
Delphi-Quellcode:
weil zwischen den beiden IF's der Index i nicht geändert wird. Bei der ersten Version ändert sich der Index. Wenn also 'DT' und 'YASU' in der Liste direkt hintereinander stehen, wird bei der ersten Version nur DT gelöscht, bei der zweiten Version wird erst 'DT' gelöscht dann rückt 'YASU' an die Position von 'DT' und dann wird 'YASU' gelöscht.
if combobox1.items.Strings[i] = 'DT' then
combobox1.Items.Delete(i); if combobox1.Items.Strings[i] = 'YASU' then combobox1.Items.Delete(i); |
Re: If ... or ... then verwirrt mich
Zitat:
Zitat:
Bernhard |
Re: If ... or ... then verwirrt mich
Zitat:
Zitat:
|
Re: If ... or ... then verwirrt mich
Mit einem else würde er dasselbe machen.
Delphi-Quellcode:
if combobox1.items.Strings[i] = 'DT' then
combobox1.Items.Delete(i) else if combobox1.Items.Strings[i] = 'YASU' then combobox1.Items.Delete(i); |
Re: If ... or ... then verwirrt mich
1. Dafür nimmt man kein REPEAT...UNTIL sondern ein WHILE...DO
Delphi-Quellcode:
, denn so gibt es keine Zugriffsfehler, wenn keine Elemente in der Liste stehen.
i := 0;
while i < ComboBox1.Items.Count do begin end; 2. Was passiert bei Delete? ComboBox1.Items
Code:
wenn wir jetzt zu dieser Zeile ( i ist 1) kommen
(0)Hallo
(1)YASU (2)DT (3)du da
Delphi-Quellcode:
dann sieht ComboBox1.Items so aus
ComboBox1.Items.Delete( i );
Code:
Wenn jetzt im nächsten Schritt i um 1 erhöht wird ( i ist dann ja 2 ), dann wird die (jetzige) Zeile 1 nicht mehr überprüft!
(0)Hallo
(1)DT (2)du da Also sollte man nach einem Delete den Index nicht höchzählen, weil einem dann eine Zeile immer entwischt :mrgreen: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz