Autor Beitrag
Rage
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: Mi 23.02.05 17:56 
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

ausblenden 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.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 23.02.05 18:01 
Entweder mit Suche im MSDN SLEEP oder Suche in: Delphi-Forum, Delphi-Library DELAY.
Harry Hunt
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 50



BeitragVerfasst: Mi 23.02.05 18:24 
..oder so

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Mi 23.02.05 19:00 
ausblenden 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;

_________________
Ciao, Sprint.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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:
ausblenden 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.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
begin
  timer1.enabled:=false;
end;
Rage Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: Sa 26.02.05 13:22 
ja gut ok, aber ich hab das eher generell gemeint wie das geht... :-)