Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   If ... or ... then verwirrt mich (https://www.delphipraxis.net/149887-if-then-verwirrt-mich.html)

hellow554 1. Apr 2010 17:05


If ... or ... then verwirrt mich
 
Moin moin,

ich steig grad durch mein eigenes Programm nicht durch...

Folgendes ist der Fall:

Delphi-Quellcode:
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;
Ich durchsuche eine Combobox nach den Wörtern YASU und DT... naja..
Er löscht immer nur DT, warum?
Alternative, damit es funzt ist
Delphi-Quellcode:
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;
Für micht ist das das selbe!? Wenn Yasu oder DT vorkommt lösche den, sonst mach weiter... hmmm
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

DeddyH 1. Apr 2010 17:07

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?

hellow554 1. Apr 2010 17:09

Re: If schleife verwirrt mich
 
Zitat:

Zitat von DeddyH
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?

sollte diese zeile sagen:

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

IceBube 1. Apr 2010 17:12

Re: If schleife verwirrt mich
 
Hallo!

Besser ist es mit einer for-Schleife zu machen!

Delphi-Quellcode:
  for I := ComboBox1.Items.Count-1 DownTo 0 do
    if (ComboBox1.Items[I] = 'YASU') or (ComboBox1.Items[I] = 'DT') then
      ComboBox1.Items.Delete(I);
lg

hellow554 1. Apr 2010 17:14

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

DeddyH 1. Apr 2010 17:15

Re: If schleife verwirrt mich
 
Dann würde ich das so machen:
Delphi-Quellcode:
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;
[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]

hellow554 1. Apr 2010 17:19

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?

MrSpock 1. Apr 2010 17:22

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.

DeddyH 1. Apr 2010 17:23

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;

dominikkv 1. Apr 2010 17:24

Re: If ... or ... then verwirrt mich
 
Die Zeile
Delphi-Quellcode:
until i >= combobox1.Items.Count+2;
scheint falsch zu sein. Richtig wäre
Delphi-Quellcode:
until i > combobox1.Items.Count - 1;
Zitat:

Zitat von hellow554
hab nich mal ne ahnung, wozu combobox.items.beginupdate da ist.

Delphi-Referenz durchsuchenTComboBox.Items.BeginUpdate verhindert das Neuzeichnen der ComboBox und beschleunigt daher das Programm. Das muss mit .EndUpdate natürlich wieder aufgehoben werden. Und zur Sicherheit, damit das auch wirklich aufgehoben wird, ist der Schutzblock da.

hellow554 1. Apr 2010 17:25

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

DeddyH 1. Apr 2010 17:28

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.

dominikkv 1. Apr 2010 17:32

Re: If ... or ... then verwirrt mich
 
Zitat:

Zitat von hellow554
also bewirkt das beginupdate, dass die indexe (indicies sieht genauso bescheuert aus ^^) gleich bleiben und sich nicht verschieben

Nope
Zitat:

TStrings simply keeps track of when the list of strings is being changed. Some descendants of TStrings use this information to perform certain actions, such as telling a control to repaint, when updates are complete.
Es wird also nur die "Es-hat-sich-was-verändert"-Nachricht unterdrückt, die das Neuzeichnen anstößt.

himitsu 1. Apr 2010 18:18

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

samso 1. Apr 2010 18:20

Re: If ... or ... then verwirrt mich
 
Edit: Ok wieder zu langsam.
Delphi-Quellcode:
if (combobox1.items.Strings[i] = 'YASU') or (combobox1.Items.Strings[i] = 'DT') then
  combobox1.Items.Delete(i);
ist nicht dasselbe wie
Delphi-Quellcode:
if combobox1.items.Strings[i] = 'DT' then
  combobox1.Items.Delete(i);
if combobox1.Items.Strings[i] = 'YASU' then
  combobox1.Items.Delete(i);
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.

rollstuhlfahrer 1. Apr 2010 18:53

Re: If ... or ... then verwirrt mich
 
Zitat:

Zitat von samso
Delphi-Quellcode:
if (combobox1.items.Strings[i] = 'YASU') or (combobox1.Items.Strings[i] = 'DT') then
  combobox1.Items.Delete(i);
ist nicht dasselbe wie
Delphi-Quellcode:
if combobox1.items.Strings[i] = 'DT' then
  combobox1.Items.Delete(i);
if combobox1.Items.Strings[i] = 'YASU' then
  combobox1.Items.Delete(i);

Der Quellcode macht exakt das gleiche also ist diese Bemerkung nicht ganz richtig.

Zitat:

Zitat von samso
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.

JA.

Bernhard

rwachtel 1. Apr 2010 22:33

Re: If ... or ... then verwirrt mich
 
Zitat:

Zitat von rollstuhlfahrer
[...] Der Quellcode macht exakt das gleiche also ist diese Bemerkung nicht ganz richtig. [...]

Nein, das macht er nicht - wie Du ja auch eine Zeile später selbst bestätigst:

Zitat:

[...]

JA.

Bernhard

DeddyH 1. Apr 2010 22:50

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);

Sir Rufo 3. Apr 2010 00:02

Re: If ... or ... then verwirrt mich
 
1. Dafür nimmt man kein REPEAT...UNTIL sondern ein WHILE...DO
Delphi-Quellcode:
i := 0;
while i < ComboBox1.Items.Count do
  begin
  end;
, denn so gibt es keine Zugriffsfehler, wenn keine Elemente in der Liste stehen.
2. Was passiert bei Delete?
ComboBox1.Items
Code:
(0)Hallo
(1)YASU
(2)DT
(3)du da
wenn wir jetzt zu dieser Zeile ( i ist 1) kommen
Delphi-Quellcode:
ComboBox1.Items.Delete( i );
dann sieht ComboBox1.Items so aus
Code:
(0)Hallo
(1)DT
(2)du da
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!
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