Entwickler-Ecke
Sonstiges (Delphi) - Zähler
Entactogen - Do 18.10.07 15:20
Titel: Zähler
Hallo.
In der Schule programmieren wir sowas wie ein Moorhuhnspiel.
Im Zuge dessen habe ich leider ein Problem, und zwar mit den Zähler der "abgeschossenen" Panels.
Ich habe mal versucht das so zu programmieren:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| for i:=componentcount-1 downto 0 do begin if components[i] is tmypanel then begin if mypanel.visible=False then begin tmypanel(components[i]).destroy; zaehler:= zaehler+1; end; end; end;
edit1.text:=inttostr(zaehler)+ ' Punkte';
end; |
Das hatte ich unter den Timer und unter den Stopbutton programmiert. Im Editfeld erscheint auch was, aber leider steht da immer "O Punkte", das heißt es wird etwas reingeschrieben, aber es wird nichts gezählt bzw gefunden. Kann mir da vielleicht jemand helfen?
Moderiert von
Christian S.: Delphi-Tags hinzugefügt
_frank_ - Do 18.10.07 15:56
ich würde den panels beim Erzeugen alle die selbe OnClick-Methode verpassen, welche dann die Zählervariable erhöht. Dann halt immer nur ein und ausblenden. Da brauchste dann nicht 100 stück :)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TForm1.PanelClick(Sender:TObject); begin (sender as TPanel).hide; inc(zaehler); end;
procedure TForm1.FormCreate(sender:TObject); var i:integer; begin for i:=0 to 10 do begin p:=TPanel.create(self); p.parent:=self; p.OnClick:=PanelClick; p.width:=50; p.height:=50; .... end; end; |
so brauchst den timer nur für die bewegung der panels....
HTH Frank
Entactogen - Do 18.10.07 17:22
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: 101:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, jpeg, MPlayer,unit2;
type TForm1 = class(TForm) Image1: TImage; start: TButton; stop: TButton; Timer1: TTimer; Label1: TLabel; MediaPlayer1: TMediaPlayer; Edit1: TEdit; procedure stopClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure startClick(Sender: TObject);
private Mypanel:tmypanel; image3:timage; public zaehler:integer; end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.startClick(Sender: TObject); var i:integer ; begin timer1.enabled:=true;
Mediaplayer1.FileName:='H:\Musik\Zeugs\Texas- summer son.mp3';
mediaplayer1.Open; mediaplayer1.Play;
end;
procedure TForm1.Timer1Timer(Sender: TObject); var i:integer; begin mypanel:=tmypanel.Create(Form1); mypanel.parent:=Form1;
mypanel.Left:=random (image1.Width-50)+image1.left; mypanel.top:=random (image1.Height-50) +image1.top;
for i:=componentcount-1 downto 0 do begin if components[i] is tmypanel then begin if mypanel.visible=False then begin tmypanel(components[i]).destroy; zaehler:= zaehler+1; end; end; end; end;
procedure TForm1.FormCreate(Sender: TObject);
begin randomize;
end;
procedure TForm1.stopClick(Sender: TObject); var i:integer; begin timer1.enabled:=false; mediaplayer1.close;
for i:=componentcount-1 downto 0 do begin if components[i] is tmypanel then begin if mypanel.visible=False then begin tmypanel(components[i]).destroy; zaehler:= zaehler+1; end; end; end;
edit1.text:=inttostr(zaehler)+ ' Punkte';
end;
end. |
Entactogen - Do 18.10.07 17:24
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:
| unit Unit2;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
type TMypanel= class(Tpanel)
private image3:Timage; procedure Mausgedrueckt (Sender: TObject); public constructor create (aOwner:TComponent); override ; end;
implementation
constructor TMypanel.Create(aOwner:TComponent); begin inherited create(aOwner) ; top:= 52; left:= 48; height:=48; width:=52;
image3:=timage.create (self); image3.Picture.LoadFromFile('C:\Dokumente und Einstellungen\ME\Eigene Dateien\Eigene Bilder\delphi\biene.bmp'); image3.parent:=self; image3.Stretch:=true; image3.Width:=self.Width; image3.Height:=self.Height; image3.onclick:=Mausgedrueckt; end;
procedure TMypanel.Mausgedrueckt(Sender: TObject); begin visible:=false; beep; end; end. |
Fabian E. - Do 18.10.07 17:46
Entactogen hat folgendes geschrieben: |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.Timer1Timer(Sender: TObject); var i:integer; begin mypanel:=tmypanel.Create(Form1); mypanel.parent:=Form1;
mypanel.Left:=random (image1.Width-50)+image1.left; mypanel.top:=random (image1.Height-50) +image1.top;
for i:=componentcount-1 downto 0 do begin if components[i] is tmypanel then begin if mypanel.visible=False then begin tmypanel(components[i]).destroy; zaehler:= zaehler+1; end; end; end; end; | |
Wieso erstellst du deine Panels im Timer?! :shock:
mach das doch im FormCreate. :idea:
gruß
Entactogen - Do 18.10.07 17:57
weil die ja erst erstellt werden sollen, wenn man den startbutton gedrückt hat.
oder ist das nicht sinnvoll wenn ich die durchzählen lassen will?
_frank_ - Do 18.10.07 18:05
ich würde (in unit2) beim Mausgedrueckt; den clickhandler vom Panel aufrufen. dann kannst du diesen ohne probleme in der Haupunit zum Zählen verwenden...
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure TMypanel.Mausgedrueckt(Sender: TObject); begin if assigned(onClick) then OnClick(self); visible:=false; beep; end; |
den rest kannst du so machen, wie ichs oben geschrieben hatte. Also Panels im Formcreate einmal erzeugen (im Destroy freigeben).
wenn ich den code richtig interpretiere, sollen die panels nur irgendwo auftauchen (ohne bewegung). Jedoch bleiben die wohl ewig stehen, bis man sie anklickt...
im timer könntest du schauen, welche Panels nicht visible sind, denen eine neue Position geben und wieder sichtbar machen...
hast du mal versucht den code zu debuggen? Wie weit geht denn deine components-schleife? werden die Panels dort überhaupt gefunden?
einen fehler hab ich noch gefunden:
Delphi-Quelltext
1: 2:
| if components[i] is tmypanel then begin if mypanel.visible=False then begin |
sollte es bei der unteren Zeile nicht heisen "TMypanel(components[i]).visible=False"?
//kannst den code vom formcreate auch in das OnClick des Startbuttons legen. zum freigeben dann halt die des stop-button nehmen.
HTH Frank
Entactogen - Do 18.10.07 18:45
hm...also es geht ja darum, die panels anzuklicken und am ende zusehen, wieviele panels man angeklickt hat. demnach wäre es vielleicht nicht sinnvoll, die wieder neu erscheinen zu lassen, weil die dann ja nicht neu zählen oder ?`das würde doch den punktestand verfälschen
Entactogen - Do 18.10.07 19:07
haha
so ein stress und in wirklichkeit war dein dezenter hinweis auf
TMypanel(components[i]).visible=False
ausschlaggebend, dass die Zählung jetzt funktioniert :D
Vielen Dank dafür ^^
:party: :party: :party:
Aber wo wir jetzt schon mal dabei sind, hab ich noch ne Frage zum gleichen Programm^^
Ist es möglich, das man so eine art schußgeräusch abspielt, sobald eine biene getroffen ist?
bist jetzt hab ich da einfach beep; hingeschrieben, aber so richtig zufrieden bin ich damit nicht. ich hatte schon überlegt, ob ich nicht an der gleichen stelle auf den mediaplayer zurückgreifen kann, aber ich kenn mich mit dem mp kaum aus.
hast du da ne idee??
_frank_ - Do 18.10.07 19:18
eigentlich nur eine Frage pro Thread....aber such mal nach PlaySound :)
solltest damit Probleme haben, mache bitte einen neuen Thread auf...
Gruß Frank
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!