Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - probleme mit repeatschleife


klausiemausie - Mi 04.02.09 21:24
Titel: probleme mit repeatschleife
ich hab folgenden code bei mir eingebaut

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
repeat
begin angriff:=angriff-10;
edit1.Text:=floattostr(angriff);
verteidigung:=verteidigung-10;
edit2.Text:=floattostr(verteidigung);
sleep(1000);
end;
until (angriff<0or (verteidigung<0);

delphi soll quasi die variable angriff immer um 10 verringern, den neuen wert ins edit1 schreiben, das selbe mit verteidigung und edit2, und das solange, bis ein wert unter 0 kommt. es funktioniert auch, er ist irgendwann fertig, aber er zeigt mir die zwischenzahlen nicht in im editfeld an, woran könnte das liegen?

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


jaenicke - Mi 04.02.09 21:33

Das liegt daran, dass Sleep den Hauptthread lahm legt und einfach keine Verarbeitung der Repaintnachrichten passiert.

Du solltest statt Sleep dieses Delay benutzen:
http://www.delphipraxis.net/topic7355_delay+revisited.html

Und wenn du (z.B. in einer Schleife, dann aber am besten nicht bei jedem Durchlauf) einmal visuelle Komponenten aktualisieren willst, dann kannst du das mit Application.ProcessMessages / Komponente.Repaint machen. Das passiert hier aber in dem Delay schon. Wobei Application.Processmessages auch dafür sorgt, dass deine Anwendung noch auf Eingaben reagiert.

Dafür musst du aber dafür sorgen, dass man durch das Klicken von anderen Befehlen während der Schleife dein Programm nicht durcheinanderbringt. ;-)


klausiemausie - Mi 04.02.09 21:44

gut und soll ich anstelle von sleep einfaach delay schreiben? oder wie baue ich die delayprozedu in mein prog ein?


Delete - Mi 04.02.09 21:46

Kopier Dir den Quellcode und füge ihn in die aufrufende Unit ein.


jaenicke - Mi 04.02.09 21:47

Du kopierst den Code. :mrgreen:

Beispiele:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure Delay...
begin
  ...
end;

procedure TForm1.Button1Click(...
begin
  Delay...
end;

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Button1Click(...

  procedure Delay...
  begin
    ...
  end;

begin
  Delay...
end;


Delete - Mi 04.02.09 21:56

Oder die elegantere Möglichkeit (im Sinne von Wiederverwendbarkeit): erstelle Dir eine neue Unit, schreib den Prozedur- bzw. Funktionskopf in den interface-Teil und den Quellcode selbst in den implementation-Teil. Künftig musst Du nur diese Unit einbinden, um Delay nutzen zu können.