Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Werte aus Timer nehmen
Stread - Fr 22.05.09 18:40
Titel: Werte aus Timer nehmen
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 )
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 - Fr 22.05.09 22:55
Hast du 12 Forms erstellt? Warum machst du das nicht über eine Form und mehrere Pagecontrols?
Stread - Fr 22.05.09 23:02
12Forms? Nein wurde automatisch so genannt weil es meine 12. Form war.
Hat jemand eine Lösung?
ffgorcky - Sa 23.05.09 07:36
Zum Thema Werte in das Haupt-Form geben:
Du musst doch nur die Variablen in diesem Bereich definierern:
Delphi-Quelltext
1: 2: 3: 4: 5:
| private var score:Integer; public |
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:
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:
Delphi-Quelltext
1: 2: 3: 4: 5:
| case colorint of 1: Panel1.Color:=clgreen; 2: Panel1.Color:=clred; 3: Panel1.Color:=clnavy; end; |
Das geht dann bei
if Panel1.Color=clgreen then genauso mit:
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 - 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.
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 public 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.
http://www.delphi-forum.de/download.php?id=10327
Regan - 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 - 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.
ffgorcky - 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 - Sa 23.05.09 20:42
Stread hat folgendes geschrieben : |
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 - 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:
Delphi-Quelltext
1: 2: 3:
| private var score:Integer; zeit1: Integer; |
und dann
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm12.Timer1Timer(Sender: TObject); begin zeit1:=zeit1-1; if zeit1=0 then begin zeit1:=3; 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
Delphi-Quelltext
1: 2:
| Timer1.enabled:=false 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.
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!