Autor Beitrag
Entactogen
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Do 18.10.07 15:20 
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:


ausblenden 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 user profile iconChristian S.: Delphi-Tags hinzugefügt
_frank_
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: 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 :)

ausblenden 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

_________________
EB FE (die wahrscheinlich kürzeste Endlosschleife der Welt :) )
BA 01 00 00 00 52 EB 09 BB 4D 11 86 7C FF D3 EB 0D E8 F2 FF FF FF 63 68 61 72 6D 61 70 00 C3
Entactogen Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Do 18.10.07 17:22 
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:
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
    { Private-Deklarationen }
    Mypanel:tmypanel;
    image3:timage;
     public
    { Public-Deklarationen }
       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 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Do 18.10.07 17:24 
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:
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.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 554

Windows 7 Ultimate
Visual Studio 2008 Pro, Visual Studion 2010 Ultimate
BeitragVerfasst: Do 18.10.07 17:46 
user profile iconEntactogen hat folgendes geschrieben:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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_
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: 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...
ausblenden 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:
ausblenden 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

_________________
EB FE (die wahrscheinlich kürzeste Endlosschleife der Welt :) )
BA 01 00 00 00 52 EB 09 BB 4D 11 86 7C FF D3 EB 0D E8 F2 FF FF FF 63 68 61 72 6D 61 70 00 C3
Entactogen Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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_
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: 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

_________________
EB FE (die wahrscheinlich kürzeste Endlosschleife der Welt :) )
BA 01 00 00 00 52 EB 09 BB 4D 11 86 7C FF D3 EB 0D E8 F2 FF FF FF 63 68 61 72 6D 61 70 00 C3