Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Spiel programmieren, ( Form1 soll Form2 neu erstellen) (https://www.delphipraxis.net/160855-spiel-programmieren-form1-soll-form2-neu-erstellen.html)

Bosgu 4. Jun 2011 12:12

Delphi-Version: 5

Spiel programmieren, ( Form1 soll Form2 neu erstellen)
 
Hallo ich bins wieder;

hab wieder ein einfaches Problem.

Habe Form1 und Form2.

Form1 fungiert als Hauptmenü was dann From2 öffnet, dies funtioniert auch richtig.

Das Problem ist nach dem man Form2 gewonnen/verloren hat soll man wieder zum Menü und dort neu starten können. Ich kann zwar Form2 visible/enabled false machen aber das löscht sie nicht und wenn der button des menüs aktiviert wird geht schon das durchlaufene programm auf.

Kurz gefasst brauche ich ein Befehl der Form2 erstellt und das alter löscht durch einen button klick.

MfG

stahli 4. Jun 2011 13:33

AW: Spiel programmieren, ( Form1 soll Form2 neu erstellen)
 
Du kannst das Formular auch auflösen mit Form2.Free;
Dann musst Du es beim nächsten Öffnen vorher wieder erzeugen: Form2 := TForm2.Create(Application);

Hilft das?

Bosgu 4. Jun 2011 13:53

AW: Spiel programmieren, ( Form1 soll Form2 neu erstellen)
 
Vielen Dank hat geklappt wie du es gesagt hast

Code:
procedure TForm1.Button1Click(Sender: TObject);
begin
Form1. Visible := true;
Form2 := TForm2.Create(Application);
Form2. Visible := true;
Form2. enabled := true;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Form2.Free;
end;

end.
MfG

stahli 4. Jun 2011 14:08

AW: Spiel programmieren, ( Form1 soll Form2 neu erstellen)
 
Noch eine Kleinigkeit dazu:

Du kannst in den Projektoptionen einstellen, dass Form2 nicht automatisch erzeugt wird.
Dann kannst Du das Auflösen in Form1.OnCreate weglassen.

Statt Form.Visible := True/False kann man auch Show bzw. Hide aufrufen. Das ist üblicher und übersichtlicher, macht aber letztlich das selbe.

Form2.Enabled musst Du nicht setzen, da das standardmäßig nach dem Erzeugen true ist.

Sir Rufo 4. Jun 2011 15:20

AW: Spiel programmieren, ( Form1 soll Form2 neu erstellen)
 
In den Projekt-Optionen - Formulare die Form2 aus der Liste nehmen, damit dieses nicht automatisch bei Programmstart erzeugt wird.
Denn hierbei passiert nix
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  // Form2 ist noch gar nicht erzeugt, darum ist das für die Katz
  Form2.Free;
end;
Generell ist es geschickter folgendermassen vorzugehen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if Assigned( Form2 ) then
    Form2.Free;
  Form2 := TForm2.Create( Application );
  Form2.Show;
end;
Damit das Assigned auch immer korrekt funktioniert, sollte folgender Code in Form2.OnDestroy aufgerufen werden
Delphi-Quellcode:
procedure TForm2.OnDestroy( Sender : TObject );
begin
  if Form2 = Self then
    Form2 := nil;
end;
Dann könnte man sich auch zwei Methoden schreiben
Delphi-Quellcode:
procedure TForm1.ZeigeForm2;
begin
  if not Assigned( Form2 ) then
    Form2 := TForm2.Create( Application );
  Form2.Show;
end;

procedure TForm1.EntferneForm2;
begin
  if Assigned( Form2 ) then
    Form2.Free;
end;
Der Button zum Resetten bekommt dann folgendes:
Delphi-Quellcode:
procedure TForm1.Button1Click( Sender : TObject );
begin
  EntferneForm2;
  ZeigeForm2;
end;

stahli 4. Jun 2011 15:28

AW: Spiel programmieren, ( Form1 soll Form2 neu erstellen)
 
Ja klar, das stimmt - soweit hatte ich nicht überlegt.

Form2 wird erst automatisch erzeugt, nachdem Form1 automatisch erzeugt wurde.
Dann erzeugst Du durch Deinen Button Form2 nochmal neu. Die Variable Form2 zeigt dann auf das neue Formular.
Das automatisch erzeugte Form2 hängt dann in der Luft (also liegt unaufgelöst im Speicher).
Normalerweise merkt man das nicht, aber man sollte so etwas von vorn herein vermeiden.

Entferne Form2 einfach aus den automatisch zu erzeugenden Projektformularen, dann passt das.

Bosgu 4. Jun 2011 22:27

AW: Spiel programmieren, ( Form1 soll Form2 neu erstellen)
 
Danke für die vielen antworten,

aber ich glaube ich bleibe bei dem was ich habe, bevor ich was kaputt mache und alles in einem Feuer aufgeht.

MfG

PS: hab wieder ein neues Problem^^

Luckie 5. Jun 2011 05:25

AW: Spiel programmieren, ( Form1 soll Form2 neu erstellen)
 
[QUOTE=Sir Rufo;1104585]
procedure TForm2.OnDestroy( Sender : TObject );
begin
if Form2 = Self then
Form2 := nil;
end;
[/DELPHI]

Delphi-Quellcode:
procedure TForm1.EntferneForm2;
begin
  if Assigned( Form2 ) then
    Form2.Free;
end;
Und wozu gibt es FreeAndNil?


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:51 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