Entwickler-Ecke

Sonstiges (Delphi) - Pause zwischen Anweisungen


Rage - Mi 23.02.05 17:56
Titel: Pause zwischen Anweisungen
Hi Leuts ich habe eigentlich eine ganz einfache Frage für die erfahrenen unter euch.

Ich möchte etwas sehr simples Programmieren und zwar einfach nur, das sich zwei Shapes (vierecke) immer mit der Farbe abwechseln, also Shape1 soll drei Sekunden lang rot sein, dann soll Shape2 drei Sekunden rot sein wärend Shape1 wieder weiß ist.
So ich wollte das so lösen, ich habe einen Button entworfen (Startbutton) der das ganze in gang setzt, dann habe ich mir folgendes überlegt


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Button1Click(Sender: TObject);

 begin
       Shape1.Brush.Color := clRed;
       //"setpause für 3 sekunden"
       Shape1.Brush.Color := clwhite;
       Shape2.Brush.Color := clRed;
       //"setpause für 3 sekunden"
       
      //........usw......
  end


so jetzt weiß ich nicht wie ich das "setpause für 3 Sekunden" schreiben kann, könnt ihr mir das sagen ?

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt.


Delete - Mi 23.02.05 18:01

Entweder mit Suche im MSDN SLEEP oder Suche in: Delphi-Forum, Delphi-Library DELAY.


Harry Hunt - Mi 23.02.05 18:24

..oder so


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var
  StatTime: Integer;
const
  DelayTime = 3000// 3000 MSecs = 3 Secs
begin
  StartTime := GetTickCount;
  while GetTickCount < StartTime + DelayTime do
    Application.ProcessMessages;
end;


Rage - Mi 23.02.05 18:53

Hi ja das hoert sich ziemlich kompleziert an wenn ich ehrlich bin, ich habe das so gemacht aber es funktioniert net ganz.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Button1Click(Sender: TObject);
begin
      Shape1.Brush.Color := clRed;
      sleep(3000);
      Shape1.Brush.Color := clWhite;
      Shape2.Brush.Color := clBlue;
      sleep(3000);
      Shape2.Brush.Color := clWhite;
      Shape1.Brush.Color := clRed;
end;


das problem is das wenn ich auf satrt klicke, dann dauert es erst mal eine weile und dann faerbt er einfach den Shape1 Red. er laesst also die anderen anweisungen aus, da hab ich mir ueberlegt das mit "Case....of" zu machen. aber da muss ich ja zwischen case un of eine variable angeben, aber ich weiss nicht was das dann für eine variable sein soll, einfach integer vllt. aber wenn ich das so mache startet er nicht und sagt mir das er eine Konstante erwartet. ausserdem fürt er ja immer nur die letzte anweisung aus also das
Shape1.Brush.Color := clRed;
was davor steht beachtet er nicht

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt.


retnyg - Mi 23.02.05 18:57

klar, denn mit sleep steht dein ganzes programm.
eleganter löst du das mit einem Timer, der z.b. alle sekunde die farbe ändert

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
var firstcolor: boolean = true;

...

procedure timer1timer;
begin
  if firstcolor then begin
     firstcolor := false;
     image1.color := clred;
  end 
  else begin
     firstcolor := true;
     image1.color := clwhite;
  end;
end;


Sprint - Mi 23.02.05 19:00


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
procedure TForm1.Button1Click(Sender: TObject);

  procedure Wait(MS: DWORD);
  var
    Stop: DWORD;
  begin

    Stop := GetTickCount + MS;
    while Stop > GetTickCount do
    begin
      Sleep(100);
      Application.ProcessMessages;
    end;

  end;

begin

  Shape1.Brush.Color := clRed;
  Wait(3000);
  Shape1.Brush.Color := clWhite;
  Shape2.Brush.Color := clBlue;
  Wait(3000);
  Shape2.Brush.Color := clWhite;
  Shape1.Brush.Color := clRed;

end;


delfiphan - Do 24.02.05 01:49

Rage hat folgendes geschrieben:
das problem is das wenn ich auf satrt klicke, dann dauert es erst mal eine weile und dann faerbt er einfach den Shape1 Red. er laesst also die anderen anweisungen aus,

Nur damit es klar ist: Du musst ein "Application.ProcessMessages;" schreiben damit deine Farbänderung inmitten einer Prozedur aktualisiert wird. Das wurde auch in den vorgeschlagenen Lösungen gemacht.

Ich würde auch Sprints Lösung vorschlagen, jedoch das "Application.ProcessMessages;" als erstes, um eine anfängliche Verzögerung zu verhindern:

Delphi-Quelltext
1:
2:
  Application.ProcessMessages;
  Sleep(100);


Die Lösung von retnyg hat den Vorteil, dass sich dein Programm auch wirklich im Leerlauf befindet. Das Programm ist schliessbar, wenn du auf das [X] klickst. Es ist dann auch nicht möglich, dass deine Button1Click-Prozedur während dem "Application.ProcessMessages;" erneut, d.h. verschachtelt aufgerufen wird.


Delete - Do 24.02.05 16:49

Rage hat folgendes geschrieben:

das problem is das wenn ich auf satrt klicke, dann dauert es erst mal eine weile und dann faerbt er einfach den Shape1 Red. er laesst also die anderen anweisungen aus,

Du musst deinem Fenster auch die Möglichkeit geben die Shapes neu zu zeichnen. Also rufst du nach dem Ändern der Eigenschaften Application.Processmessages auf oder Form/Shape.Repaint.


Rage - Do 24.02.05 23:25

ok danke, ich denke das sinn genug möglichkeiten für mich :-)

ich wollte die anweisung für das wechseln der farben in eine reapeat .. until schleife einfuegen damit er es unendlich lang macht bis ich auf meinen "stop"button klick...

bei der schleife kommt der fehler "dekleration erwarten" ... mhh was er da will weiss ich net da ich denke das es ruichtig so ist...

un wie kann ich das mit dem stop machen...meine idee is so

repeat farbwechsel
until "procedure TForm1.Button2Click(Sender: TObject);"

aber das kann ich so sicherlich nicht schreiben, ich will einfach angeben das nach dem until der button steht der gedrueckt werden muss damit das prog anhaelt.

wie mach ich das ??


Net-Spider - Do 24.02.05 23:45

die variante von retnyg ist schon auf unendlich getrimmt, du musst nur einen button machen,
der bei einem click den timer anhält:

Delphi-Quelltext
1:
2:
3:
begin
  timer1.enabled:=false;
end;


Rage - Sa 26.02.05 13:22

ja gut ok, aber ich hab das eher generell gemeint wie das geht... :-)