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; Shape1.Brush.Color := clwhite; Shape2.Brush.Color := clRed; end |
so jetzt weiß ich nicht wie ich das "setpause für 3 Sekunden" schreiben kann, könnt ihr mir das sagen ?
Moderiert von
raziel: Delphi-Tags hinzugefügt.
Delete - Mi 23.02.05 18:01
Entweder mit
SLEEP oder
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; 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
raziel: 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... :-)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!