Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi repeat-until ersetzten durch if/for/while (https://www.delphipraxis.net/20375-repeat-until-ersetzten-durch-if-while.html)

Thorben86 16. Apr 2004 19:16


repeat-until ersetzten durch if/for/while
 
Hi, ich hab ein Probelm, und zwar hab ich ne repeat until schleife (s.u.) darf die jedoch nicht benutzten, da wir die in der schule noch nicht hatten und keine sachen mit reinbringen dürfen, die wir noch nicht hatten, da die schwächeren schüler sonst angeblich nicht mitkommen würden.(und das nach über nem 1/2 schuljahr delphi, wobei der andere kurs das chon lange hat.) wir dürfen eigentlich nur if-anweisungen, und for/while schleifen benutzen.

Mein Problem ist, dass mir gerade nicht eifällt, wie ich das mit den 3 "schleifen" hinkrieg. In nen timer will ich es nicht baun, weil ich nach der einen schleife das ganz nochmal mit anderen labels machen will und dann bräuchte ich verdammt viele Timer.

:dp:

Delphi-Quellcode:
repeat
c := ColorToRGB(l_rahmenprogramm.Font.Color);
if GetRValue(c) > 0 then r := GetRValue(c)-1;
if GetGValue(c) > 0 then g := GetGValue(c)-1;
if GetBValue(c) > 0 then b := GetBValue(c)-1;
l_rahmenprogramm.Font.Color:=rgb(r,b,g);
l_rahmenprogramm.Refresh;
sleep(1);
until (r=0) or (g=0) or (b=0);

glkgereon 16. Apr 2004 19:26

Re: repeat-until ersetzten durch if/for/while
 
vorschlag:

Delphi-Quellcode:
while (r<>0) and (g<>0) and (b<>0)
do begin
    c := ColorToRGB(l_rahmenprogramm.Font.Color);
    if GetRValue(c) > 0 then r := GetRValue(c)-1;
    if GetGValue(c) > 0 then g := GetGValue(c)-1;
    if GetBValue(c) > 0 then b := GetBValue(c)-1;
    l_rahmenprogramm.Font.Color:=rgb(r,b,g);
    l_rahmenprogramm.Refresh;
    sleep(1);
    end;
was hab ichn gemacht?
or durch and und
= durch <> in den bedingungen ersetzt

wenn das min. 1mal gemacht werden soll, schreibs einfach nochmal davor :-D

himitsu 16. Apr 2004 19:34

Re: repeat-until ersetzten durch if/for/while
 
such dir was aus - einmal mit if und das andere mit max:
Delphi-Quellcode:
c := ColorToRGB(l_rahmenprogramm.Font.Color);
while c and $ffffff > 0 do begin
  c := rgb(Max(GetRValue(c) - 1, 0), Max(GetGValue(c) - 1, 0), Max(GetBValue(c) - 1, 0));
  l_rahmenprogramm.Font.Color := c;
  l_rahmenprogramm.Font.Refresh;
  sleep(1);
end;
Delphi-Quellcode:
c := ColorToRGB(l_rahmenprogramm.Font.Color);
while c and $ffffff > 0 do begin
  if GetRValue(c) > 0 then r := GetRValue(c) - 1 else r := 0;
  if GetGValue(c) > 0 then g := GetGValue(c) - 1 else g := 0;
  if GetBValue(c) > 0 then b := GetBValue(c) - 1 else b := 0;
  c := rgb(r, b, g);
  l_rahmenprogramm.Font.Color := c;
  l_rahmenprogramm.Font.Refresh;
  sleep(1);
end;
PS: bei deiner Schleife war auch noch ein großer Fehler - wenn eine Farbe 0 war, so wurde der entsprechenden Variable (r, g, oder b) nichts zugewiesen.


[ADD]
glkbkk's Code stimmt genau mit deinem Beispiel überein, nur eben mit while und nicht mit repeat, aber dor ist auch der Fehler mit den nicht zugewiesenen Variablen drin und bei mir geht es komplett runter auf 0. Wenn z.B. im Extremfall die Schriftfarbe = Rot ist, so wird bei euren Schleifen nicht viel passeren ;)

Thorben86 16. Apr 2004 19:35

Re: repeat-until ersetzten durch if/for/while
 
Thx, das müsste gehen

Skiron 16. Apr 2004 19:36

Re: repeat-until ersetzten durch if/for/while
 
umms etwas allgemeiner zu beschreiben:
Delphi-Quellcode:
repeat
  Anweisung;
until Bedingung;
enspricht
Delphi-Quellcode:
Anweisung
while not Bedingung do begin
  Anweisung;
end;

himitsu 16. Apr 2004 19:40

Re: repeat-until ersetzten durch if/for/while
 
Ach ja, wenn es so anfängt

Delphi-Quellcode:
while (r<>0) and (g<>0) and (b<>0)
do begin
...
dann ist auch noch ein nette Fehler entstanden, den die Variablen, werden erst innerhalb der Schleife gesetzt (wenn überhaupt ;) ), und sind demnach vorher noch nicht definiert.

dizzy 17. Apr 2004 01:28

Re: repeat-until ersetzten durch if/for/while
 
Zitat:

Zitat von Thorben86
Delphi-Quellcode:
repeat
c := ColorToRGB(l_rahmenprogramm.Font.Color);
if GetRValue(c) > 0 then r := GetRValue(c)-1;
if GetGValue(c) > 0 then g := GetGValue(c)-1;
if GetBValue(c) > 0 then b := GetBValue(c)-1;
l_rahmenprogramm.Font.Color:=rgb(r,b,g);
l_rahmenprogramm.Refresh;
sleep(1);
until (r=0) or (g=0) or (b=0);

:roll: der Code kommt mir irgendwie bekannt vor... :gruebel:

:zwinker:

@himitsu: r, g und b sind sicherlich mit 0 initialisiert ;)


gruss,
dizzy

\edit: btw: das or ist in der Bedingung auch beim repeat..until falsch. Du willst ja sicherlich ein Label nach schwarz faden, gell!? Dann müssen erst ALLE Farbanteile 0 werden. Dann erst ist's wirklich schwarz. Also statt or auch hier and nehmen!

negaH 17. Apr 2004 02:27

Re: repeat-until ersetzten durch if/for/while
 
Delphi-Quellcode:
while true do
begin

  if r and g and b = 0 then break;
end;

Loop := True;
while Loop do
begin

  Loop := r and g and b <> 0;
end;
Nicht schön aber ersetzt ohne kompliziertes Nachdenken jede repeat until Schleife ;)

Gruß Hagen

himitsu 17. Apr 2004 06:14

Re: repeat-until ersetzten durch if/for/while
 
Zitat:

Zitat von dizzy
@himitsu: r, g und b sind sicherlich mit 0 initialisiert ;)

genau da ist ja das Problem bei der While-Schleife
Delphi-Quellcode:
while (r<>0) and (g<>0) and (b<>0)
do begin
...
denn wenn die Variablen nul sind, was ja rein zufällig auch der Abbruchbedingung entspricht, dann wird nämlich die Schleiche nie durchaufen, da While ja vor'm Durchlauf und nicht danach auswertet.


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