Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Möglichkeiten einen Schritt der for-Schleife zu überspringen (https://www.delphipraxis.net/1248-moeglichkeiten-einen-schritt-der-schleife-zu-ueberspringen.html)

Daniel B 5. Nov 2002 21:11


Möglichkeiten einen Schritt der for-Schleife zu überspringen
 
Nabend allerseits,

welche möglichkeiten gibt es um in einer for-Schleife, einen durchlauf zu überspringen?

Code:
for i := 0 to 9 do
begin
  if i <> 4 then
  begin
    tuedies := unddas;
  end;
end;
So in der Art. Welche möglichkeiten gibt es noch?

Grüsse, Daniel :hi:

Tpercon 5. Nov 2002 21:39

Warum keine While Schleife?
Code:
i:=0;
while i<=9 do
 If i=3
  then Inc(i,2)
  else Inc(i);
Wobei das auch nicht viel eleganter ist.

Daniel B 5. Nov 2002 21:44

Zitat:

Zitat von Tpercon
Wobei das auch nicht viel eleganter ist.

Nicht wirklich. :wink:

Grüsse, Daniel :hi:

PS: ich dachte eher an sowas: if i = 4 then i := 5 oder i +1

Tpercon 5. Nov 2002 21:50

Tja, aber sonst wüßt ich auch nichts...

Gruß zurück :hi:

Luckie 5. Nov 2002 22:20

Das Problem ist, in einer for-Schleife kannst du dioe Zählvariable nicht verändern. Deswegen ist wohl eine while-Schleife das beste.

Daniel B 5. Nov 2002 22:45

Vielleicht was zum warum, der Frage.

In einer LV sind Einträge, welch Wunder... :roll:
Nur einem dieser Einträge, kann eine 1 zugewiesen werden, ich muss also alle, bis auf den Markierten auf 0 setzen. Dazu müsste ich eben den Markierten Eintrag überspringen. Je nachdem welchen ich auf 1 setze, alle anderen müssen dann automatisch auf 0 gesetzt werden.

Grüsse, Daniel :hi:

Daniel 5. Nov 2002 22:52

Hallo Daniel,

ich sehe noch nicht, warum sich dies nicht elegant mit einer FOR-Schleife lösen läßt:
Delphi-Quellcode:
For index:= 0 To myListView.Items.Count-1 Do
Begin
  If myListWiew.Items[Index].Selected Then
    myListView.Items[Index]._welche_Property_auch_immer:= 1
  Else
    myListView.Items[Index]._welche_Property_auch_immer:= 0;
End;
Warum nicht so?

Christian Seehase 5. Nov 2002 23:16

Moin Zusammen,

oder so:

Delphi-Quellcode:
for i := 0 to ListView1.Items.Count-1 do
begin
  ListView1.Items[i].BeliebigeEigenschaft := ord(ListView1.Items[i].Selected);
end;
Damit hätte man auch Multiselect erledigt.

Wenn es definitiv nur ein Eintrag ist, könnte man sich auch eine Form Property einrichten, die jeweils den Index des zuletzt gewählten Eintrages enthält (initial -1). Dann hätte man immer den Index des Eintrages, dass beim Wechsel des Selected Items auf 0 gesetzt werden müsste, und könnte gezielt, via ListView1.Selected.Index, den einen Eintrag ansprechen, bei dem auf 1 gesetzt werden muss. Dieser Index kommt dann in die Property.
Das könnte sich, zumindest bei vielen Werten, ausgesprochen positiv auf die Laufzeit auswirken. (im Gegensatz zum Durchlauf durch alle Items)

Hansa 6. Nov 2002 00:24

Hi,

Zitat:

Zitat von Luckie
Das Problem ist, in einer for-Schleife kannst du die Zählvariable nicht verändern. Deswegen ist wohl eine while-Schleife das beste.

Das ist aber nicht so. Ob while oder for ist eigentlich egal. Der Unterschied besteht darin, daß die for-Schleife bis zum bitteren Ende durchlaufen wird oder eine Exception eintritt :mrgreen:.

Das Bsp. von Typercon ist ein klassischer Fall. Variable bleibt Variable. bei 9 tritt der exit-Fall ein. Würde man schreiben :

FOR i:= 1 TO 10000

würde die 9 der while schleife ignoriert, das entspräche dann for i := 1 to 9. Das ginge ja noch.

Gruß
Hansa

Luckie 6. Nov 2002 00:28

Das meine ich:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to 10 do
  begin
    Listbox1.Items.Add(IntToStr(i));
    i := i + 2;
  end
end;
Du kannst die Zählvariable innerhalb der for-Schleife nicht verändern! Und das hatte er ja vor, siehe hier:
Zitat:

PS: ich dachte eher an sowas: if i = 4 then i := 5 oder i +1

Hansa 6. Nov 2002 00:51

Hi Luckie,

Warum soll das denn nicht gehen ? :roll: Setze ich INNERHALB der Schleife die Zähler-Variable auf einen anderen Wert nimmt er den zugewiesenen als nächsten und macht weiter, als sei nichts geschehen.

Wenn innerhalb der Schleife z.B. jeder zweite Wert genommen werden soll, d.h. einer wird jeweils übersprungen, würde ich gennauso vorgehen, nur halt i mod 2 = 0 verwenden (oder = 1).

Mit AddItem wird dannn nur jeder zweite Wert mit berücksichtigt.

Gruß
Hansa

Luckie 6. Nov 2002 00:55

Zitat:

Warum soll das denn nicht gehen ? Setze ich INNERHALB der Schleife die Zähler-Variable auf einen anderen Wert nimmt er den zugewiesenen als nächsten und macht weiter, als sei nichts geschehen.
Genau das habe ich ja versucht in meinem Beispiel, aber das kompiliert dir Delphi nicht.

Hansa 6. Nov 2002 01:31

Hi,

tatsächlich, habe es ausprobiert. So soll man es ja normalerweise auch nicht machen. Habe auch eine Stelle im Programm, wo ich das brauche,aber wo ? Und das geht nicht!!! :mrgreen: So ein Mist. In einem kleinen Programm brauch ich das. Na ja, dann eben mit while, ist logischer und sicherer, wenn es geht. Diese Sch... Exit-Sachen.

Jetzt bin ich ja zumindest vorgewarnt und behaupte das Gegenteil. Aber die Compiler-Schalter müßte man sich doch noch ansehen.

Gruß
Hansa

P.S.: Bist Du echt in Tennessee? Dann versteh ich die Uhrzeit. :cat: Die Katze kann ja dann Jack Daniels trinken.

Luckie 6. Nov 2002 01:36

Man muß sich mal den ASM-Code für so eine for-Schleife ankucken. Wenn du da die Zählvarible änderst, wirst du wohl den Inhalt der Register ordentlich durcheinander bringen und deswegen verhindert Delphi die Kompilierung.

Allerdings kenne ich mich mit ASM nicht besonders aus, weswegen ich mich da nicht so festlegen will, ist nur eien Vermutung.

In Tennessee bin ich leider nicht, da wäre ich aber gerne, in Memphis eben oder Los Angles am Strand oder so. Und den Jack Daniels trinke ich schon selber, mach dir da mal keine Sorgen. :P

jbg 6. Nov 2002 06:11

Möglich wäre es auch so:
Code:
for i := 0 to 9 do
begin
  if i = 4 then Continue;
  tuedies := unddas;
end;

Daniel B 6. Nov 2002 06:33

Hallo Christian,

Zitat:

Zitat von Christian Seehase
Wenn es definitiv nur ein Eintrag ist, könnte man sich auch eine Form Property einrichten, die jeweils den Index des zuletzt gewählten Eintrages enthält (initial -1). Dann hätte man immer den Index des Eintrages, dass beim Wechsel des Selected Items auf 0 gesetzt werden müsste, und könnte gezielt, via ListView1.Selected.Index, den einen Eintrag ansprechen, bei dem auf 1 gesetzt werden muss. Dieser Index kommt dann in die Property.
Das könnte sich, zumindest bei vielen Werten, ausgesprochen positiv auf die Laufzeit auswirken. (im Gegensatz zum Durchlauf durch alle Items)

Das hört sich interessant an. Es ist allerdings schon möglich mehrere Einträge gleichzeitig zu löschen. Das Maximum an Einträgen ist 200. Somit ist es mit der Geschwindigkeit, nicht aoo arg schlimm, dennoch interessiert mich das. Man(n) will ja auch was neues Lernen.

@Daniel,

so habe ich es bisher gelöst, dennoch Danke.
Ich bin nur auf der suche, nach etwas Performance-Technischen möglichkeit, oder wie man sachen leichter und einfacher machen kann, ohne immer das zu benutzen, was sich am leichtesten schreiben lässt. :mrgreen:

Zitat:

Zitat von Hansa
Warum soll das denn nicht gehen ? Setze ich INNERHALB der Schleife die Zähler-Variable auf einen anderen Wert nimmt er den zugewiesenen als nächsten und macht weiter, als sei nichts geschehen.

Irgendwie komme ich im Kopf in eine Endlosschleife. :shock: :roll: :mrgreen:
Also, 0 to 5. Der dritte soll übersprungen werden.
i hat gerade 2, ich schreibe in diesem Druchgang i := i +1, der nächste durchgang ist bereits 3, somit hätte ja meine änderung nichts bewirkt. Ich müsste es doch auf i := i +2 setzen. Eigentlich müsste ich i 2 durchläufe vorher +2 setzen, bei 1 schon. Aaarghh, mein Kopf expodiert gleich. Es ist eh schon zu früh. :freak:
ODer? Wenn ich mir da so durchdenke, werd ich ständig verwirrt. Hmm...

Grüsse, Daniel :hi:

d3g 6. Nov 2002 14:39

Hallo Luckie,

Zitat:

Zitat von Luckie
Du kannst die Zählvariable innerhalb der for-Schleife nicht verändern!

Es geht mit einem schmutzigen Trick:

Code:
[b]procedure[/b] Produce();
[b]var[/b]
  i: Integer;
  p: ^Integer;
[b]begin[/b]
  [b]for[/b] i := 0 [b]to[/b] 9 [b]do[/b]
    [b]if[/b] (i = 4) [b]then begin[/b]
      ShowMessage(IntToStr(i));
      p := @i;
      p^ := i + 1;
      ShowMessage(IntToStr(i));
    [b]end[/b];
[b]end[/b];
MfG,
d3g

Motzi 6. Nov 2002 14:39

Man braucht das gar nicht irgendwie kompliziert über ASM machen.. es reicht schon ganz normal über einen Pointer auf die Zählvariable zuzugreifen:

for i := 0 to x do
Integer(Pointer(@i)^) := i + 1;


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