Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Buttons während Endlosschleife betätigen (https://www.delphipraxis.net/191657-buttons-waehrend-endlosschleife-betaetigen.html)

StolenURBike 7. Feb 2017 13:42

Buttons während Endlosschleife betätigen
 
Servus Leute,
wie der Titel schon verrät habe ich ein Problem, dass ich in meinem Projekt (Snake) während der Endlosschleife keine anderen Buttons ausführen kann.
Ich habe bisher schon mit deiesem Befehl probiert
Code:
 Application.ProcessMessages;
Jedoch hat es dann auch andere Prozeduren unterbrochen wie z.B., dass mein Spielfeldrand, welcher durch eine Canvas-Prozedur gezeichnet wird einfach verschwunden ist.

Hier der Code der Schleife:

Code:
procedure TForm1.Start();
var s:integer;
begin
s:=0;
snake := TSnake.Create;
snake.InitSnake(70,50);
snake.Richtung:=2;
Label3.Caption:='0';
while s=0 do
      begin
         snake.FoodListener();
         snake.KeyListener();
         snake.MoveSnake();
         sleep(100 - (((snake.length - 3) div 2)*8));
         s:=snake.SnakeListener();

         end;

end;

EWeiss 7. Feb 2017 13:54

AW: Buttons während Endlosschleife betätigen
 
was denkst du was du noch bedienen kannst wenn du mit Sleep deine Anwendung quasi anhältst ?

gruss

StolenURBike 7. Feb 2017 13:56

AW: Buttons während Endlosschleife betätigen
 
Mhh. Das stimmt auch wieder. Aber gibt es dann eine Alternative zu dem Sleepbefehl, der auch seine Aufgabe erledigt eine kurze Pause einzufügen.

stahli 7. Feb 2017 13:57

AW: Buttons während Endlosschleife betätigen
 
Du könntest alternativ einen Timer mit einem kleinen Interval starten, der immer jeweils einen nächsten Schritt ausführt (also z.B. Snake.X := Snake.X + 1 und PaintSnake).

Dann bleibt Deine Anwendung bedienbar und mit der ButtonBehandlung kannst Du Deinen Timer ausschalten.

Nur mal so als Anregung.
Du kannst zwar nicht sicher sein, dass der Timer wirklich in dem gewünschten Zyklus feuert, aber vielleicht läuft es insgesamt ja flüssig genug.


EDIT: Der "professionelle Weg" wäre übrigens, die Fortschritte in einem Thread zu berechnen. Das wird aber dann schon komplizierter.

Geda 7. Feb 2017 14:45

AW: Buttons während Endlosschleife betätigen
 
Hast Du schon eine Kombination aus Sleep (kurzes Intervall!) und ProcessMessages versucht?

p80286 7. Feb 2017 15:37

AW: Buttons während Endlosschleife betätigen
 
Warum hat Snake eigentlich einen KeyListener?
Wenn man eine Taste drückt, sollte die Form wissen was damit zu geschehen hat. Und wenn der Tastendruck für Snake gedacht ist dann reicht man ihn entsprechend weiter.
Ungefähr so: (pseudoCode)

Code:
if Keypressed=vk_CurUp then snake.newposV(1);
if Keypressed=vk_CurDwn then snake.newposV(-1);
if Keypressed=vk_Esc then application.terminate;
usw.
Wenn die Schlange zu lang wird könnte es ein Zeitproblem geben, Aber für den Anfang sollte es gehen.
(Die DOS-Version hatte übr. einen Timer)

Gruß
K-H

EWeiss 7. Feb 2017 16:32

AW: Buttons während Endlosschleife betätigen
 
Zitat:

Wenn man eine Taste drückt, sollte die Form wissen was damit zu geschehen hat.
Ja soweit sie denn reagiert.
Aber das möchte ich bei seinem Code bezweifeln.

gruss

p80286 7. Feb 2017 16:59

AW: Buttons während Endlosschleife betätigen
 
Naja es ist doch offensichtlich das er die Steuerung von dem Form an snake weiterreicht.
Oder etwa nicht?


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