![]() |
Panel Spiel => Panel automatisch erzeugen?
Hallo,
wir haben als Hausaufgabe aufbekommen ein Spiel zu erstellen. Bei dem Spiel sollen in einem Shape-Fenster fünf gleichgroße Panel an einer zufälligen Position erzeugt werden, wenn man auf den Button Start klickt. Wenn man dann auf eines der Panel klickt, soll dieser verschwinden, und man bekommt einen Punkt. Ich hab ein Shape-Fenster mit dem Namen "ShSpiel" erstellt, dardrauf einen Panel mit dem Namen "Panel" und folgendes eingegeben:
Delphi-Quellcode:
Wenn ich nun aber auf den Button Start klicke, werden keine neuen Panel erzeugt. Weiss jemand was ich falsch eingegeben habe?
procedure TForm1.BStartClick(Sender: TObject);
var i: integer; begin for i:= 0 to 4 do begin Panel:= TPanel.Create (ShSpiel); Panel.AutoSize:= True; Panel.Left:=Random (ShSpiel.Width); Panel.Top:= Random(ShSpiel.Height); Panel.Parent:= Form1; Weiterhin sollen bei dem Spiel alle 2 Sekunden die Panel neu positioniert werden und ein weiteres Panel soll immer dazukommen. Hierzu hab ich den Timer genommen, auf True gesetzt und als Intervall 2000 eingegeben. Aber auch hier tut sich nichts, die Panels bewegen sich einfach nicht. Und wie kann ich das eingeben, dass in Verbindung mit dem Timer immer ein neues Panel dazukommt? Jemand einen Vorschlag dazu? Hoffe ihr könnt mir helfen, vielen Dank schonmal im Vorraus. |
Re: Panel Spiel => Panel automatisch erzeugen?
Nur Dunkel aus meiner Erinnerung: Muss das Panel nicht auch noch sichtbar gemacht werden? Hast du mal im Debugger geschaut, ob wirklich keine Panels erzeugt wurden oder diese nur nicht sichtbar sind?
|
Re: Panel Spiel => Panel automatisch erzeugen?
Wo muss ich denn im Debug nachgucken? Ansicht --> Debug-Fenster --> Und dann?
|
Re: Panel Spiel => Panel automatisch erzeugen?
Lass mal AutoSize weg.
|
Re: Panel Spiel => Panel automatisch erzeugen?
Danke dir vielmals, jetzt werden schonmal 5 Panels erstellt. Ich hab
Delphi-Quellcode:
eingegeben, nun stehen die Panels auf der rechten und unteren Seite nich mehr über, aber oben und links ragen sie noch aus dem Weissen Feld hinaus. Wie krieg ich hin, dass sie da nicht mehr rausragen?
Panel.Left:= Random(ShSpiel.Width)-25;
Panel.Top:= Random(ShSpiel.Height)-25; |
Re: Panel Spiel => Panel automatisch erzeugen?
Okay, ich bin mit dem Programm schon etwas weiter. Obiges Problem besteht aber immer noch :?
Ich hab nun nen Timer eingefügt, und möchte, dass alle vorhandenen Panels neu positioniert werden (Sprich, die sollen gemischt werden). Ich hab folgendes eingegeben, bewegen tut sich aber leider nur ein Panel (ich nehme an der letzte):
Delphi-Quellcode:
Habs auch mit ner FOR-Schleife versucht und dann "ComponentCount-1 downto 0", dies hat aber auch nur Auswirkungen auf den einen Panel.
procedure TFPanel1.Timer1Timer(Sender: TObject);
begin Panel.Left:= Random(ShSpiel.Width)-25; Panel.Top:= Random(ShSpiel.Height)-25; end; Jemand nen Vorschlag? |
Re: Panel Spiel => Panel automatisch erzeugen?
du musst auch innerhalb der schleife auf Components[i] zugreifen ;)
Delphi-Quellcode:
HTH Frank
for i:=components.count-1 downto 0 do
begin Panel:=Components[i] as TPanel; panel.left:=... panel.top:=... end; |
Re: Panel Spiel => Panel automatisch erzeugen?
Wenn ich das so mache, wie du es angegeben hast, dann kommt nach dem man auf Start klickt folgender Fehler:
Im Projekt Fang1 ist eine Exception der Klasse EInvalidCast aufgetreten. Meldung: Ungültige 'Typumwandlung'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen. Ich habs dann auch mal so probiert, geht aber auch nicht, bzw. nur ein Panel wird umpositioniert.
Delphi-Quellcode:
procedure TFPanel1.Timer3Timer(Sender: TObject);
var I: integer; begin for i:= ComponentCount-1 downto 0 do begin if Components[i] is TFPanel1 then Panel.Left:= Random(ShSpiel.Width)-25; Panel.Top:= Random(ShSpiel.Height)-25; |
Re: Panel Spiel => Panel automatisch erzeugen?
ja, habe die Abfrage vergessen...habs net getested, sollte eigentlich nur verdeutlichen, dass du die variable panel setzen sollst auf die aktuelle Komponente...
Delphi-Quellcode:
ggf. TPanel durch deinen Typ ersetzen, aber wenn du von TPanel abgeleitet hast, müsste das auch ohne die Änderung gehen.
for i:=components.count-1 downto 0 do
begin if Components[i] is TPanel then begin Panel:=Components[i] as TPanel; panel.left:=... panel.top:=... end; end; HTH |
Re: Panel Spiel => Panel automatisch erzeugen?
Hmm... leider bewegt sich da dann nix :(
EDIT: Habs jetzt mal so gemacht, eigentlich müsste das doch gehen, dass jetzt für alle Panels die Position geändert wird?
Delphi-Quellcode:
Bei mir kommt aber auch da ne Fehlermeldung... Ich bin langsam am verzweifeln.
procedure TFPanel1.Timer1Timer(Sender: TObject);
var i: integer; begin for i:=0 to ComponentCount-1 do begin if Components[i] is TFPanel1 then TFPanel1(Components[i]).Left:= Random(ShSpiel.Width)-25; TFPanel1(Components[i]).Top:= Random(ShSpiel.Height)-25; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:39 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz