Autor Beitrag
Stread
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 188

Win 7
Delphi XE
BeitragVerfasst: Fr 22.05.09 18:40 
Hi

Ich möchte gerne ein Reaktionsspiel machen. Es werden zufällige Rechtecke in 3 verschiedenen Farben in einer beliebigen Größe irgendwo auf der Fläche des Programms erzeugt die anklickbar sind. Wenn es ein grünes ist gibt es einen Punkt, bei einem roten wird einem einen Punkt abgezogen. Bei einem blauen Feld gibt es 10 Punkte dazu. Das habe ich hinbekommen.

Nun möchte ich dass das über einen Timer geht. Alle Formen sollen 3sec bleiben bevor die nächste Form kommt. Wann die nächste Form kommt soll auch vom Zufall abhängen.(Zwischen 1 und 5sec). Wie kann ich die Werte aus den Timer in das (Haupt)-Programm geben?
Als Ansatz habe ich das hier. (PS: Bin Anfänger, sieht man bestimmt :D )

ausblenden volle Höhe 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:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
procedure TForm12.Button1Click(Sender: TObject);
var height,width,left,top,colorint:integer;
begin
randomize;
Timer1.Enabled;
Timer2.Enabled;
top:=random(500)+66;
left:=random(500)+1;
height:=random(100)+10;
width:=random(100)+10;
Panel1.Width:=width;;
Panel1.Height:=height;;
Panel1.Left:=left;
Panel1.Top:=top;

colorint:=random(3)+1;
if colorint=1 then
Panel1.Color:=clgreen;
if colorint=2 then
Panel1.Color:=clred;
if colorint=3 then
Panel1.Color:=clnavy;

end;

procedure TForm12.Panel1Click(Sender: TObject);
var score: Integer;
begin
score:=0;
if Panel1.Color=clgreen then
  begin
    score:=StrToInt(Edit1.Text);
    score:=score+1;
    Edit1.Text:=IntToStr(Score);
  end;
if Panel1.Color=clred then
  begin
    score:=StrToInt(Edit1.Text);
    score:=score-1;
    Edit1.Text:=IntToStr(Score);
  end;
if Panel1.Color=clnavy then
  begin
   score:=StrToInt(Edit1.Text);
   score:=score+10;
   Edit1.Text:=IntToStr(Score);
  end;
end;

procedure TForm12.Timer1Timer(Sender: TObject);
var zeit1: Integer;
begin
zeit1:=3;
if zeit1=0 then


end;

procedure TForm12.Timer2Timer(Sender: TObject);
var zeit2: Integer;
begin
zeit2:=random(5)+1;


end;

end.


Danke
Regan
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: Fr 22.05.09 22:55 
Hast du 12 Forms erstellt? Warum machst du das nicht über eine Form und mehrere Pagecontrols?
Stread Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 188

Win 7
Delphi XE
BeitragVerfasst: Fr 22.05.09 23:02 
12Forms? Nein wurde automatisch so genannt weil es meine 12. Form war.

Hat jemand eine Lösung?
ffgorcky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Sa 23.05.09 07:36 
Zum Thema Werte in das Haupt-Form geben:
Du musst doch nur die Variablen in diesem Bereich definierern:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
 private  
    { Private-Deklarationen }  
    var score:Integer;
  public  
    { Public-Deklarationen }

Dann sind sie nicht nur während der einen Prozedur-Durchführung da, sondern gelten in diesem Form, solange wie es läuft.
Hier geht das genauso, wie bei einer einzelnen Prozedur mit var davor.
Wenn Du die Variable wirklich aus einem anderen Fenster abfragen möchtest, dann brauchst Du sie nur unter public zu setzen.
Dann kannst Du sie auch in anderen Forms ansprechen mit:
ausblenden Delphi-Quelltext
1:
FormWelcherNameAuchImmer.score					

und musst sie ja auch nur einmal unter FormCreate oder ButtonNeuesSpielOnClick auf 0 setzen.

...und zum Thema Form12: Delphi fängt doch bei jedem neuen Projekt wieder mit Form1 an.
Baust Du so eine große Anwendung mit 12 verschiedenen Fenstern?

Und zum Thema if colorint=1 then:
Ich weiß ja leider noch nicht so ganz, ob ich Dir das schon so sagen darf (oder ob Dich das so früh schon überfordert), aber eigentlich sollte man da ganze ab 3 Möglichkeiten lieber so machen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
case colorint of
   1: Panel1.Color:=clgreen;
   2: Panel1.Color:=clred;
   3: Panel1.Color:=clnavy;
end// hier hört dann mit einem einfachen end Deine case-Abfrage auf.


Das geht dann bei if Panel1.Color=clgreen then genauso mit:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
case Panel1.Color of
   clgreen:machDieses;
   clred:machWasAnderes;
   clnavy:machNochWasAnderes;
end;


PS: Ein Anfänger mit 109 Beiträgen? Irgendwie komisch...
Stread Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 188

Win 7
Delphi XE
BeitragVerfasst: Sa 23.05.09 13:27 
Bei mir fängt Delphi immer mit der nächsten Form an wenn ich die jetzt gebraucht Form nicht abspeichere. Hir nochmal der ganze Code.

ausblenden volle Höhe 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:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
unit randomtest1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm12 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    Edit1: TEdit;
    Button2: TButton;
    Timer1: TTimer;
    Timer2: TTimer;
    procedure Panel1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form12: TForm12;

implementation

{$R *.dfm}

procedure TForm12.Button1Click(Sender: TObject);
var height,width,left,top,colorint:integer;
begin
randomize;
Timer1.Enabled;
Timer2.Enabled;
top:=random(500)+66;
left:=random(500)+1;
height:=random(100)+10;
width:=random(100)+10;
Panel1.Width:=width;;
Panel1.Height:=height;;
Panel1.Left:=left;
Panel1.Top:=top;

colorint:=random(3)+1;
if colorint=1 then
Panel1.Color:=clgreen;
if colorint=2 then
Panel1.Color:=clred;
if colorint=3 then
Panel1.Color:=clnavy;

end;

procedure TForm12.Panel1Click(Sender: TObject);
var score: Integer;
begin
score:=0;
if Panel1.Color=clgreen then
  begin
    score:=StrToInt(Edit1.Text);
    score:=score+1;
    Edit1.Text:=IntToStr(Score);
  end;
if Panel1.Color=clred then
  begin
    score:=StrToInt(Edit1.Text);
    score:=score-1;
    Edit1.Text:=IntToStr(Score);
  end;
if Panel1.Color=clnavy then
  begin
   score:=StrToInt(Edit1.Text);
   score:=score+10;
   Edit1.Text:=IntToStr(Score);
  end;
end;

procedure TForm12.Timer1Timer(Sender: TObject);
var zeit1: Integer;
begin
zeit1:=3;
if zeit1=0 then


end;

procedure TForm12.Timer2Timer(Sender: TObject);
var zeit2: Integer;
begin
zeit2:=random(5)+1;


end;

end.


Vielleicht ist es so klarer was ich meine. Ich brauche den Timer nur für die Zeit, weiß aber nicht wie ich Button1 sagen kann dass er erst nach 3sec das nächste und dieses Randommäßig lange dalasen soll.

Mit Case ist eine gute Idee werde ich dann umsetzen. Danke

PS.Bis jetzt habe ich als funktionierendes Programm nur einen Taschenrechner und ein kleines Lotto Programm gemacht. Ich sehe mich also noch als Anfänger. www.delphi-forum.de/download.php?id=10327
Regan
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: Sa 23.05.09 13:41 
Warum versuchst du es nicht mit einem PageControl, wie ich es schon vorgeschlagen habe. Da brauchst du nur eine einzige Form.
Stread Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 188

Win 7
Delphi XE
BeitragVerfasst: Sa 23.05.09 14:58 
Willst du das nicht kapieren?

DAS IST NUR EINE FORM!!! :autsch:

Der Name dieser Form ist eben Form12.

Hier das Programm wenn dir der Quelltext nicht ausreicht.
Einloggen, um Attachments anzusehen!
ffgorcky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Sa 23.05.09 18:36 
Das Programm sieht ja schon ganz gut aus!
Das Programm berechnet die Score wie gewünscht, nur die Timerfunktion fehlt doch noch...
Im Moment kann man die ganze Zeit immer auf die selbe Stelle clicken und bekommt Punkte dazugezählt oder abgezogen.
Das Rechteck(/Panel) ändert seine Position und Farbe nicht - es erscheint nur bei jedem (click auf) Start woanders.
Regan
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: Sa 23.05.09 20:42 
user profile iconStread hat folgendes geschrieben Zum zitierten Posting springen:
DAS IST NUR EINE FORM!!! :autsch:

Der Name ist doch völlig egal. Von mir aus kann die auch anders heißen.

Ich glaube, ich habe dich da etwas falsch verstanden, weil du im Anfangspost von verschiedenen Formen (= plural von Form = TForm) gesprochen hast. Tschuldigung :flehan: :wink: .

Zu deinem Problem:
Nimm einfach einen dritten Timer, von welchem du das Interval zufällig änderst und in dem du die Buttonclickmethode aufrufst.
ffgorcky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Sa 23.05.09 20:57 
Um Deinen Timer1 runterzählen zu lassen, brauchst Du doch nur die Variable zeit als Form-Variable zu bauen (un da möglichst unter private), also so:
ausblenden Delphi-Quelltext
1:
2:
3:
private
   var score:Integer; //aus meinem vorherigen Vorschlag
       zeit1: Integer;


und dann
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm12.Timer1Timer(Sender: TObject);
begin
zeit1:=zeit1-1;
if zeit1=0 then //also wenn der Timer die 3 Sekunden runtergezählt hat
   begin
   zeit1:=3//hier wieder neu setzen, für den nächsten Durchgang
   //hier kommt dann die Verarbeitung, für den Fall, dass der Timer die 3 Sekunden runtergezählt hat, ohne dass geclickt wurde
   end;
end;

Oder Du setzt einfach das Timer12.Intervall auf 3000

Du solltest aber dann bei einem OnClick des Panels/Buttons dann möglichst noch
ausblenden Delphi-Quelltext
1:
2:
Timer1.enabled:=false //und direkt dahinter
Timer1.enabled:=true;

schreiben, damit der Timer dann wirklich die drei Sekunden erst dann anfängt zu zählen und nicht schon eine halbe Sekunde noch von dem vorheigen Durchgang vergäudet hat.