Delphi-PRAXiS
Seite 2 von 2     12   

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: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 11:57 Uhr.
Seite 2 von 2     12   

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