Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Prism Panel Spiel => Panel automatisch erzeugen? (https://www.delphipraxis.net/101819-panel-spiel-%3D-panel-automatisch-erzeugen.html)

Juggy D 18. Okt 2007 16:13


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:
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;
Wenn ich nun aber auf den Button Start klicke, werden keine neuen Panel erzeugt. Weiss jemand was ich falsch eingegeben habe?

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.

OregonGhost 18. Okt 2007 16:15

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?

Juggy D 18. Okt 2007 16:26

Re: Panel Spiel => Panel automatisch erzeugen?
 
Wo muss ich denn im Debug nachgucken? Ansicht --> Debug-Fenster --> Und dann?

Blackheart 18. Okt 2007 16:36

Re: Panel Spiel => Panel automatisch erzeugen?
 
Lass mal AutoSize weg.

Juggy D 18. Okt 2007 16:41

Re: Panel Spiel => Panel automatisch erzeugen?
 
Danke dir vielmals, jetzt werden schonmal 5 Panels erstellt. Ich hab
Delphi-Quellcode:
Panel.Left:= Random(ShSpiel.Width)-25;
Panel.Top:= Random(ShSpiel.Height)-25;
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?

Juggy D 18. Okt 2007 19:47

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:
procedure TFPanel1.Timer1Timer(Sender: TObject);
begin
Panel.Left:= Random(ShSpiel.Width)-25;
Panel.Top:= Random(ShSpiel.Height)-25;
end;
Habs auch mit ner FOR-Schleife versucht und dann "ComponentCount-1 downto 0", dies hat aber auch nur Auswirkungen auf den einen Panel.

Jemand nen Vorschlag?

_frank_ 18. Okt 2007 20:03

Re: Panel Spiel => Panel automatisch erzeugen?
 
du musst auch innerhalb der schleife auf Components[i] zugreifen ;)
Delphi-Quellcode:
for i:=components.count-1 downto 0 do
begin
  Panel:=Components[i] as TPanel;
  panel.left:=...
  panel.top:=...
end;
HTH Frank

Juggy D 18. Okt 2007 20:43

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;

_frank_ 18. Okt 2007 21:26

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:
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;
ggf. TPanel durch deinen Typ ersetzen, aber wenn du von TPanel abgeleitet hast, müsste das auch ohne die Änderung gehen.

HTH

Juggy D 18. Okt 2007 22:33

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:
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;
Bei mir kommt aber auch da ne Fehlermeldung... Ich bin langsam am verzweifeln.

nachti1505 19. Okt 2007 01:04

Re: Panel Spiel => Panel automatisch erzeugen?
 
Hinter der IF-Abfrage begin und end setzen...

Sonst wird der zweite TypCast nach TPanel für jede Komponente ausgeführt... müsste ne AV geben....

Delphi-Quellcode:
for i:=0 to ComponentCount-1 do begin
  if Components[i] is TPanel then begin
     TPanel(Components[i]).Left:= Random(ShSpiel.Width)-25;
     TPanel(Components[i]).Top:= Random(ShSpiel.Height)-25;
  end;
Für den Fall, dass deine lustigen Panels immer noch über den linken und oberen Rand gucken aus

Delphi-Quellcode:
TPanel(Components[i]).Left:= Random(ShSpiel.Width)-25;
wird

Delphi-Quellcode:
TPanel(Components[i]).Left:= Random(ShSpiel.Width - 25);
Müsste eigentlich nun gehen.... :gruebel:

Juggy D 19. Okt 2007 11:39

Re: Panel Spiel => Panel automatisch erzeugen?
 
Hi, erstmal danke für deine Hilfe. Die Panels gucken nun nicht mehr drüber, wie du sagtest, mussten die -25 in die Klammer mit rein und danach noch +30, damit die nun unten nicht mehr drüber stehen.

Das mit dem Timer läuft aber immer noch nicht.

Ich hab oben die Variable angegeben:
Delphi-Quellcode:
var
  FPanel1: TFPanel1;
dann kommt bei dem Timer nun folgender Code:
Delphi-Quellcode:
procedure TFPanel1.Timer1Timer(Sender: TObject);
var i: integer;
begin
for i:=0 to ComponentCount-1 do begin
  if Components[i] is TFPanel1 then begin
     TFPanel1(Components[i]).Left:= Random(ShSpiel.Width-25);
     TFPanel1(Components[i]).Top:= Random(ShSpiel.Height-25);
     end;
  end;
end;
bewegen tut sich aber immer noch nix :(

nachti1505 19. Okt 2007 12:24

Re: Panel Spiel => Panel automatisch erzeugen?
 
1.) ???
Delphi-Quellcode:
Timer.Enabled := true;
2.) ???
Im Form.Create Zufallsgenerator initialisiert?
Delphi-Quellcode:
  randomize;

Juggy D 19. Okt 2007 13:14

Re: Panel Spiel => Panel automatisch erzeugen?
 
Hi,

hab nun auch randomize eingegeben, es tut sich aber immer noch nichts... :wall: Es ist bestimmt nur irgendwo ein klitzekleiner Fehler.. Aber ich find ihn nicht..

Delphi-Quellcode:
procedure TFPanel1.FormCreate(Sender: TObject);
begin
randomize;
end;

procedure TFPanel1.Timer1Timer(Sender: TObject);
var i: integer;
begin
Timer1.Enabled:= True;
for i:=0 to ComponentCount-1 do begin
  if Components[i] is TFPanel1 then begin
     TFPanel1(Components[i]).Left:= Random(ShSpiel.Width-25);
     TFPanel1(Components[i]).Top:= Random(ShSpiel.Height-25);
     end;
  end;
end;

_frank_ 19. Okt 2007 13:18

Re: Panel Spiel => Panel automatisch erzeugen?
 
setz doch mal breakpoints auf die top/left-zeilen und ggf. weiter oben. so weist zumindest wie weit der code durchläuft...

Gruß Frank

nachti1505 19. Okt 2007 13:20

Re: Panel Spiel => Panel automatisch erzeugen?
 
Kann du evt. mal den ganzen Quellcode reinstellen... vllt. auch als Anhang...

Ach so, ich gehe mal davon dass dein Timer Enabled war....... (Schau mal im OI nach). Weil ein Enablen im Aufruf bringt gar nüscht. Ohne Enabled kein Aufruf und ohne Aufruf wird er nicht auf Enabled gesetzt --> ein Paradoxon...

Juggy D 19. Okt 2007 13:26

Re: Panel Spiel => Panel automatisch erzeugen?
 
break; hat auch nichts gebracht... Ich hab mal nen Screenshot gemacht, vllt gebe ich ja nur irgendwo das falsche Formular oder so an.. TFPanel1 ist schon richtig ind er IF Abfrage, oder?

http://img524.imageshack.us/img524/5229/screen1yb8.jpg

Juggy D 19. Okt 2007 13:28

Re: Panel Spiel => Panel automatisch erzeugen?
 
Ja Timer ist auch im OI enabled.

hier der Quelltext
Delphi-Quellcode:
unit UFang1;

interface

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

type
  TFPanel1 = class(TForm)
    BStart: TButton;
    ShSpiel: TShape;
    Panel: TPanel;
    Timer1: TTimer;
    procedure BStartClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure PanelWeg(Sender:TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  FPanel1: TFPanel1;

implementation

uses UPunkte;


{$R *.dfm}

procedure TFPanel1.BStartClick(Sender: TObject);
var i: integer;
begin
for i:= 0 to 4 do begin
  Panel:= TPanel.Create (ShSpiel);
  Panel.Color:= clYellow;
  Panel.Caption:= 'F';
  Panel.Width:= 49;
  Panel.Height:= 33;
  Panel.Left:= Random(ShSpiel.Width-60)+30;
  Panel.Top:= Random(ShSpiel.Height-50)+30;
  Panel.Parent:= FPanel1;
  Panel.OnClick:= PanelWeg;

end;


//FPunkte:=TFPunkte.Create(self);
//FPunkte.showModal;
end;

procedure TFPanel1.FormCreate(Sender: TObject);
begin
randomize;
end;

procedure TFPanel1.Timer1Timer(Sender: TObject);
var i: integer;
begin
Timer1.Enabled:= True;
for i:=0 to ComponentCount-1 do begin
  if Components[i] is TFPanel1 then begin
     TFPanel1(Components[i]).Left:= Random(ShSpiel.Width-25);
     TFPanel1(Components[i]).Top:= Random(ShSpiel.Height-25);
     end;
  end;
end;

procedure TFPanel1.PanelWeg(Sender:TObject);
begin
  TPanel(Sender).Hide;
end;

end.

nachti1505 19. Okt 2007 13:34

Re: Panel Spiel => Panel automatisch erzeugen?
 
Sieht doch gut aus....

Du erstellst hier
Delphi-Quellcode:
  Panel:= TPanel.Create (ShSpiel);
TPANEL und versuchst sie dann hier hier nach

Delphi-Quellcode:
Components[i] is TFPanel1
TFPanel1 zu casten.

Im Timer1Timer sämtliche Vorkommen von TFPanel1 durch TPanel ersetzen.

Juggy D 19. Okt 2007 13:39

Re: Panel Spiel => Panel automatisch erzeugen?
 
hab im Timer1Timer nun TPanel eingesetzt, es geht aber immer noch nicht. :cry:

nachti1505 19. Okt 2007 13:43

Re: Panel Spiel => Panel automatisch erzeugen?
 
Wo du die TPanel erstellst, muss deren Owner auch die Form sein

Delphi-Quellcode:
Panel:= TPanel.Create (FPanel1);
Ansonsten sind sie in Components[i] nicht drin....

Nu müsste es gehen!

Juggy D 19. Okt 2007 13:47

Re: Panel Spiel => Panel automatisch erzeugen?
 
Boahh es läuft... :hello: :corky: Ich danke dir tausendmal... :thumb: Jetzt bin ich schonmal nen ganzes Stückchen weiter, jetzt muss ich nur noch das mit dem Punktesystem hinkriegen. Falls ich wieder Hilfe brauche, poste ich hier.

Nochmals vielen dank..

_frank_ 19. Okt 2007 14:26

Re: Panel Spiel => Panel automatisch erzeugen?
 
irgendwie kommt mir das bekannt vor...
gibts da nen Zusammenhang?

Gruß Frank

Juggy D 19. Okt 2007 14:36

Re: Panel Spiel => Panel automatisch erzeugen?
 
@frank

Ich glaub im Grunde ist es fast dasselbe, nur bei ihm heißt das Spiel "Moorhuhn" und er hat noch ein paar Grafiken.
Meins dagegen basiert wirklich nur auf gelbe Panels und weißen Hintergrund. Wenn ich fertig bin stell ich mal rein.
Aber zu dem Problem mit dem Punktezählen komm ich auch noch gleich. Ich muss erstmal das ganze mit dem neuen Punktefenster und SetPunkte verstehen.

:hi:

Juggy D 19. Okt 2007 23:08

Re: Panel Spiel => Panel automatisch erzeugen?
 
Okay, brauche wieder eure Hilfe.

Bei dem Spiel sollen auch die Punkte gezählt werden und in einem seperaten Fenster angezeigt werden. Ich hab erstmal das mit dem seperaten fenster wegelassen. Also hab ich in das Hauptfrmular ein Edit Feld eingefügt. Dazu folgenden Code.
Wenn man verloren hat (= Null Punkte) soll die Message kommen "Verloren" und das Spiel soll aufhören neue Panels zu erstellen (break;), das funktioniert auch alles. Nun hab ich mit else if angegeben, dass wenn man 10 Punkte hat, die Message "Gewonnen" erscheinen soll und das Spiel aufhören soll (break;), da tut sich aber nix, auch wenn ich 10 Punkte habe kommt keine Message und das Spiel läuft weiter. Der letzte Teil ist glaub ich am wichtigsten:

Delphi-Quellcode:

procedure TFPanel1.Timer1Timer(Sender: TObject);
var i: integer;
begin
  Panel:= TPanel.Create (FPanel1);
  Panel.Color:= clYellow;
  Panel.Caption:= 'F';
  Panel.Width:= 49;
  Panel.Height:= 33;
  Panel.Left:= Random(ShSpiel.Width-60)+30;
  Panel.Top:= Random(ShSpiel.Height-50)+30;
  Panel.Parent:= FPanel1;
  Panel.OnClick:= PanelWeg;
  Zaehler:= Zaehler-1;


    for i:=ComponentCount-1 downto 0 do begin
       if Components[i] is TPanel then begin
          if Panel.Visible= True then begin
        TPanel(Components[i]).Left:= Random(ShSpiel.Width-60)+30;
        TPanel(Components[i]).Top:= Random(ShSpiel.Height-50)+30;
           Edit1.Text:=IntToStr(Zaehler)+' '+'Punkte';
        end
      else begin
        TPanel(Components[i]).Destroy;
      end;
    end;

if Zaehler = 0 then begin
   Timer1.Enabled:=False;
  ShowMessage('Verloren');
  break;
  end
  else
if Zaehler = 10 then begin
  Timer1.Enabled:=False;
  ShowMessage('Gewonnen');
  break;
  end;
end;


end;

Juggy D 20. Okt 2007 19:34

Re: Panel Spiel => Panel automatisch erzeugen?
 
Keiner nen Vorschlag? Irgendwie klappt das mit dem else Befehl im letzten teil zaehler=10 nicht. Für zaehler=0 funzt es.

_frank_ 20. Okt 2007 21:10

Re: Panel Spiel => Panel automatisch erzeugen?
 
bitte nur 1 Frage pro Thread... (stand das nicht mal in den Forenregeln?)

mal davon abgesehen, kann ich in dem Code-Snippet nicht erkennen, dass du jemals 10 Punkte hast...wo bzw. auf welchen Wert initialisierst du Zähler? Ich sehe nur, dass du bei jedem Timer-Event 1 abziehst (egal,ob ein panel getroffen wird oder nicht). d.h. du müsstest den Zähler auf min. 11 initialisieren, damit die Bedingung erfüllt (beim ersten timer-event) ist.
Inkrementierst du den Zähler auch irgendwo?

HTH Frank

Juggy D 20. Okt 2007 21:23

Re: Panel Spiel => Panel automatisch erzeugen?
 
Hi,

Stimmt schon, nach dem Intervall vom Timer wird immer ein neues Panel erstellt, daher dann ein Punkt Abzug.

Habe natürlich bei den Panels eingestellt, dass bei OnClick der zaehler Wert auf +1 erhöht wird.
Das funktioniert auch alles, wenn ich auf nen Panel klicke, bekomme ich auch ein Punkt.

Das Problem aber ist (glaub ich zumindest), dass er bei der if abfrage auf zaehler=0 wartet und nicht mit dem else if zaehler=10 weitermacht. Da ist irgendwas falsch bei den If/else Befehlen glaub ich.

_frank_ 21. Okt 2007 14:19

Re: Panel Spiel => Panel automatisch erzeugen?
 
hast du bemerkt, dass deine If-Abfrage in der For-Schleife steckt?
glaube das sollte nicht so sein, aber mit richtiger Einrückung würde man das sehen :) .
ansonsten 3 Fragen:
- wie wird Zaehler initialisiert
- werden vorher panels erstellt (außerhalb vom timer)
- hast du mit dem debugger schon 10 in der variable gesehen?

denn: mit jedem erstellten panel wird der Zähler dekrementiert (geht übrigends mit dec(zaehler) kürzer). selbst wenn du alle panels wegklickst wirst du so nie 10 Punkte erreichen, da diese 10 punkte vorher schon vom Zähler abgezogen wurden.

Delphi-Quellcode:
procedure TFPanel1.Timer1Timer(Sender: TObject);
var i: integer;
begin
  Panel:= TPanel.Create (FPanel1);
  Panel.Color:= clYellow;
  Panel.Caption:= 'F';
  Panel.Width:= 49;
  Panel.Height:= 33;
  Panel.Left:= Random(ShSpiel.Width-60)+30;
  Panel.Top:= Random(ShSpiel.Height-50)+30;
  Panel.Parent:= FPanel1;
  Panel.OnClick:= PanelWeg;
  Zaehler:= Zaehler-1;

  for i:=ComponentCount-1 downto 0 do
  begin
    if Components[i] is TPanel then
    begin
      if Panel.Visible= True then
      begin
        TPanel(Components[i]).Left:= Random(ShSpiel.Width-60)+30;
        TPanel(Components[i]).Top:= Random(ShSpiel.Height-50)+30;
        Edit1.Text:=IntToStr(Zaehler)+' '+'Punkte';
      end else
      begin
        TPanel(Components[i]).Destroy;
      end;
    end;

    if Zaehler = 0 then
    begin
      Timer1.Enabled:=False;
      ShowMessage('Verloren');
      break;
    end else if Zaehler = 10 then
    begin
      Timer1.Enabled:=False;
      ShowMessage('Gewonnen');
      break;
    end;
  end; //for
end;
HTH Frank

Juggy D 21. Okt 2007 15:08

Re: Panel Spiel => Panel automatisch erzeugen?
 
Hi,

hab die IF Abfrage aus der Schleife rasugenommen.
Der Zaehler wird bei FormCreate auf 5 gesetzt (da man am Anfang 5 Punkte haben soll).
Der Timer wird beim drücken des Start Buttons aktiviert und es werden 5 Panels erstellt (Bei StartClick).
Vom Debugger hab ich keine Ahnung. Wie guckt man da nach? 10 Punkte hatte ich aber auf jedenfall, da die Punkte in einem Seperaten Memofeld angezeigt werden. Es fehlt dann halt nur die Meldung "Gewonnen".

Hier mal der komplette Quellcode:

Delphi-Quellcode:
unit UFang1;

interface

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

type
  TFPanel1 = class(TForm)
    BStart: TButton;
    ShSpiel: TShape;
    Panel: TPanel;
    Timer1: TTimer;
    procedure BStartClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure PanelWeg(Sender:TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  FPanel1: TFPanel1;
  zaehler: integer;

implementation


{$R *.dfm}

procedure TFPanel1.BStartClick(Sender: TObject);
var i: integer;
begin
  Timer1.Enabled:= True ;
    for i:= 0 to 4 do begin
      Panel:= TPanel.Create (FPanel1);
      Panel.Color:= clYellow;
      Panel.Caption:= 'F';
      Panel.Width:= 49;
      Panel.Height:= 33;
      Panel.Left:= Random(ShSpiel.Width-60)+30;
      Panel.Top:= Random(ShSpiel.Height-50)+30;
      Panel.Parent:= FPanel1;
      Panel.OnClick:= PanelWeg;
    end;
  Punktefenster:=TPunktefenster.Create(self);
  Punktefenster.show;
  Punktefenster.MPktAnzeige.Lines.Add(IntToStr(Zaehler)+' '+'Punkte');
end;

procedure TFPanel1.FormCreate(Sender: TObject);
begin
  randomize;
  Zaehler:=5;
end;

procedure TFPanel1.Timer1Timer(Sender: TObject);
var i: integer;
begin
  Panel:= TPanel.Create (FPanel1);
  Panel.Color:= clYellow;
  Panel.Caption:= 'F';
  Panel.Width:= 49;
  Panel.Height:= 33;
  Panel.Left:= Random(ShSpiel.Width-60)+30;
  Panel.Top:= Random(ShSpiel.Height-50)+30;
  Panel.Parent:= FPanel1;
  Panel.OnClick:= PanelWeg;
  Zaehler:= Zaehler-1;

    for i:=ComponentCount-1 downto 0 do begin
       if Components[i] is TPanel then begin
          if Panel.Visible= True then begin
        TPanel(Components[i]).Left:= Random(ShSpiel.Width-60)+30;
        TPanel(Components[i]).Top:= Random(ShSpiel.Height-50)+30;
        Punktefenster.MPktAnzeige.Lines.Add(IntToStr(Zaehler)+' '+'Punkte');
        end
      else begin
        TPanel(Components[i]).Destroy;
      end;
    end;


  end;
if Zaehler = 0 then begin
   Timer1.Enabled:=False;
  ShowMessage('Verloren');
  //break;
  end
  else
if Zaehler = 10 then begin
  Timer1.Enabled:=False;
  ShowMessage('Gewonnen');
  //break;
  end;

end;


procedure TFPanel1.PanelWeg(Sender:TObject);
begin
  TPanel(Sender).Hide;
  Zaehler:= Zaehler+1;
  Punktefenster.MPktAnzeige.Lines.Add(IntToStr(Zaehler)+' '+'Punkte');
end;


end.

Juggy D 24. Okt 2007 15:42

Re: Panel Spiel => Panel automatisch erzeugen?
 
Keiner ne Vermutung, warum die Gewonnen Anzeige nicht kommt? Ich hab schon alles ausprobiert, aber es geht einfach nicht... Jungs brauche dringend eure hilfe...

Phoenix 24. Okt 2007 15:47

Re: Panel Spiel => Panel automatisch erzeugen?
 
Weil Du 11 Punkte brauchst. Keine 10.

Im Timer-Event wird zuerst 1 vom Zähler abgezogen und dann auf 10 verglichen.
Also musst Du 11 haben (11 -1 = 10, -> Vergleich Wahr).

Juggy D 24. Okt 2007 16:16

Re: Panel Spiel => Panel automatisch erzeugen?
 
Hi,

danke dir, jetzt läufts eigentlich schon. Ich hab den ganen IF zaehler= 0 ... Teil nach oben verschoben (vor das Panel.create).
Nun kommt auch die Anzeige, wenn man gewonnen hat. Kann man nun noch einstellen, dass wenn die Message "Gewonnen" kommt und man auf den OK Button der Message klickt, dass das ganze Programm dann anhält bzw. alle Vorgänge angehalten werden? Weil im Moment wird dann natürlich noch ein Panel erstellt und ein Punkt abgezogen, was ich aber eigentlich nicht möchte. Hier nochmal der neue Auszug:

Delphi-Quellcode:
procedure TFPanel1.Timer1Timer(Sender: TObject);
var i: integer;
begin
if Zaehler = 0 then begin
    Timer1.Enabled:=False;
    ShowMessage('Verloren');
    end else
    if Zaehler = 10 then begin
    Timer1.Enabled:=False;
    ShowMessage('Gewonnen');
    end;

  Panel:= TPanel.Create (FPanel1);
  Panel.Color:= clYellow;
  Panel.Caption:= 'F';
  Panel.Width:= 49;
  Panel.Height:= 33;
  Panel.Left:= Random(ShSpiel.Width-60)+30;
  Panel.Top:= Random(ShSpiel.Height-50)+30;
  Panel.Parent:= FPanel1;
  Panel.OnClick:= PanelWeg;
  Zaehler:= Zaehler-1;

Phoenix 24. Okt 2007 16:19

Re: Panel Spiel => Panel automatisch erzeugen?
 
Pack den Rest doch in noch einen Else-Zweig. Der wird dann eben abgeabreitet wenn es nicht 0 und nicht 10 ist. Ist am saubersten.

Juggy D 27. Okt 2007 19:39

Re: Panel Spiel => Panel automatisch erzeugen?
 
Hi, könntest du mir evtl. sagen wo ich dann das else / end etc.. hinsetzen muss. Habs versucht, hat aber nicht so ganz geklappt. Quellcode ist ja oben.
Wäre echt nett von dir... :-D

Gruß

Matze 27. Okt 2007 20:56

Re: Panel Spiel => Panel automatisch erzeugen?
 
Na um den "Rest":

Delphi-Quellcode:
if Zaehler = 0 then
begin
  // ...
end else
if Zaehler = 10 then
begin
  // ..
end else
begin
  Panel:= TPanel.Create (FPanel1);
  // ...
end;

Juggy D 27. Okt 2007 21:34

Re: Panel Spiel => Panel automatisch erzeugen?
 
Super! Vielen Dank, jetzt funktionierts... :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:07 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-2025 by Thomas Breitkreuz