Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Pause in einer Schleife (https://www.delphipraxis.net/156248-pause-einer-schleife.html)

nlz 25. Nov 2010 06:46

Pause in einer Schleife
 
Hallo und Guten Morgen liebe Delphi freunde,

habe ein kleines Problem, und sehe wahrscheinlich den wald vor lauter bäumen nicht. Habe Delphi 7

Ich habe ein Programm geschrieben das einen art weg in ein stringgrid.array schreibt. das funktioniert auch ganz gut. der weg wird von unten an angefangen ( Start ) und geht dann immer eine zeile höher bis er ganz oben an gekommen ist.... sow ie bei tabalugas final runde egen den frost schneemann :-P, wers kennt !

Nun wird der Weg allerdings sehr schnell gezeichnet. Das ganze ist in einer while schleife eingebunden.:

Code:
while ARow <> 0 do
[weg weiter zeichenn]
end;
Ich möchte nun das nach jedem wegpunkt eine kleine Pause von ca ner 0,5 sekunden kommt, damit der spieler sich den weg genau einprägen kann. also:
Code:
while Arow <> 0 do
[weg weiter zeichen ]
pause = 500 msec;
end;
da der code für das wegzeichenn unwichtig ist habe ich ihn mal aus faulheit weg gelassen....

Hoffe Ihr könnt mir helfen wie schon so oft !!!:-D

hoika 25. Nov 2010 06:54

AW: Pause in einer Schleife
 
Hallo,


Sleep(500) wäre das einfachste.


Heiko

pustekuchen 25. Nov 2010 06:56

AW: Pause in einer Schleife
 
Hallo,

Delay oder MSDN-Library durchsuchenSleep sollte dir weiterhelfen.

Bummi 25. Nov 2010 07:14

AW: Pause in einer Schleife
 
Häng noch ein Application.ProcessMessages vor Dein Sleep, oder wie beschrieben Delay.

blauweiss 25. Nov 2010 09:52

AW: Pause in einer Schleife
 
Zitat:

Zitat von Bummi (Beitrag 1063877)
Häng noch ein Application.ProcessMessages vor Dein Sleep, oder wie beschrieben Delay.

Hallo Bummi,

wieso empfiehlst Du dem OP ein Application.ProcessMessages ?
Aus seiner Frage wird doch ersichtlich: er möchte, daß ein (Win)Control (StringGrid) neugezeichnet werden soll. Und nicht, daß die Messagequeue abgearbeitet werden soll. Wird denn überhaupt berücksichtigt, wie sich die Applikation dann verhalten würde bei Benutzeraktionen (z.B. Alt+F4, Resize, Klick auf irgendwelche Schalflächen...) während dieser Zeit ?

Falls jemand fragt, was er tun soll um seine alten Liebesbriefe von seiner Ex Manuela zu löschen, könnte man antworten "dann zünd doch Dein Haus an". Stimmt natürlich. Die alten Briefe von der Manuela sind danach weg. Die gleiche Antwort kann recycelt werden, für Fragen nach alten Liebesbriefen von Claudia, Tom, Anita...

Zurück zum Thema: Für Neuzeichnen von WinControls gibt es z.B. Repaint und Update.
Das leider häufig empfohlene Application.ProcessMessages hat seinen Sinn, aber woanders.

Gruß,
blauweiss

Bummi 25. Nov 2010 10:04

AW: Pause in einer Schleife
 
Einer von uns beiden hat die Anforderung falsch verstanden, kann gut sein daß ich das bin.
so ähnlich hatte ich das verstanden
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i:INteger;
begin
  for I := 20 downto 0 do
      begin
      Stringgrid1.Cells[1,i] := 'AAAA' ;
      Sleep(500);
      Application.ProcessMessages;
      end;
end;
und da wird es ohne Application.ProcessMessages duster...

blauweiss 25. Nov 2010 10:59

AW: Pause in einer Schleife
 
Zitat:

Zitat von Bummi (Beitrag 1063901)
Einer von uns beiden hat die Anforderung falsch verstanden, kann gut sein daß ich das bin.
so ähnlich hatte ich das verstanden
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i:INteger;
begin
  for I := 20 downto 0 do
      begin
      Stringgrid1.Cells[1,i] := 'AAAA' ;
      Sleep(500);
      Application.ProcessMessages;
      end;
end;
und da wird es ohne Application.ProcessMessages duster...


Hallo Bummi,

Du hast offensichtlich nicht nur die Anforderung falsch verstanden, sondern auch meine Antwort.

Pausiert werden kann mit z.B. Sleep(500).
Neugezeichnet werden kann mit z.B. a) Repaint, b) Update oder c) Application.ProcessMessages. Die Variante c) hat Nebeneffekte, auf die der Programmierer vorbereitet sein muß, sonst kann es ganz gewaltig knatschen. Ich kann Dir gerne Beispiele geben.

Application.ProcessMessages wird leider hier gerne Foristen empfohlen, die offensichtlich unerfahren sind. Das halte ich für fahrlässig, wenn man selber mehr darüber weiß.

Zurück zur Anforderung.
Z.B. hiermit wird das geänderte StringGrid neugezeichnet:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i:INteger;
begin
  for I := 20 downto 0 do
      begin
      Stringgrid1.Cells[1,i] := 'AAAA' ;
      Sleep(500);
      Stringgrid1.Repaint; // oder Stringgrid1.Update
      end;
end;
Gruß
blauweiss

Bummi 25. Nov 2010 11:24

AW: Pause in einer Schleife
 
Dann geht der Punkt im Sinne des TE an Dich.
Da ich blockierende Anwendungen nicht akzeptabel finde werde ich auch weiterhin mit Application.ProcessMessages arbeiten (Anforderungen wie in diesem Beispiel würde ich ohnehin wenn Umfangreicher in einem Thread, wenn so banal in einem Timer abarbeiten)
Wenn man sich im klaren ist was asynchrone Abarbeitung für Seiteneffekt ziehen kann ist es nicht schwierig die von Dir genannten Probleme zu vermeiden.
Wenn ich die 2. 15 Jahre mit Delphi hinter mir habe darf ich mich hoffentlich auch zu den nicht mehr unerfahrenen Programmieren zählen.:cry:

blauweiss 25. Nov 2010 12:24

AW: Pause in einer Schleife
 
Hallo Bummi,

halt, Mißverständnis... das mit dem "unerfahren" hatte ich auf den TE bezogen, nicht auf Dich !
Wenn ich Deine Posts hier lese, ziehe ich durch die Bank den Hut vor Dir und Deinem Wissen.
Sorry, wenn das so rüberkam. War so nicht gemeint von mir !

Es ist wohl wie oft, Lob gibt's eher selten und Kritik schnell... vermutlich ahnt dieser TE und andere gar nicht, was im auf-den-ersten-Blick-ja-funktionierenden Code für Fallstricke lauern. Und er wird vielleicht auch nie drüber stolpern.

Außerdem noch ein Sorry von mir: an Dich, weil -wie ich glaube- mein Ton in meinem letzten Beitrag etwas harsch war... :oops: danke für Deine trotzdem offene und freundliche Antwort, Respekt.
Punkt also an Dich ! :thumb:

Gruß,
blauweiss


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