Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Alle Variablen in einem Programm auf Knopfdruck zurücksetzen (https://www.delphipraxis.net/2573-alle-variablen-einem-programm-auf-knopfdruck-zuruecksetzen.html)

Helmut 30. Jan 2003 08:01


Alle Variablen in einem Programm auf Knopfdruck zurücksetzen
 
Hallo,

ich beschäftige mich grad mit folgendem Problem:
Nachdem in meinem Programm (spiel) der spieler gewonnen oder verloren hat kann er das spiel neustarten (oder auch mitten im spiel über die menüleiste).
Also wird auf knopfdruck wieder die form sichtbar wo man die spieleinstellungen angibt. Das Problem: ich hab so viele variablen, das ich immer wenn ich beim klick auf neustarten alle variablen auf die standartwerte manuell zurücksetze immer wleche vergesse. Ausserdem sind komponenten sichtbar die beim normalen start des programmes nicht sofort sichtbar sind (diese komponenten wurden erst im verlauf des spiels auf sichtbar gesetzt).

Gibt es eine Möglichkeit das "eleganter" zu machen? Vielleicht ein direkter befehl der alles auf originalstart zurücksetzt?

mfg
Helmut

Luckie 30. Jan 2003 08:10

Schreib dir eine Prozedur, in der du alles wieder zurücksetzt. Das mußt du dann zwar auch schreiben, aber nur einmal.

Helmut 30. Jan 2003 08:27

genau das wollte ich ja vermeiden :(

Ich hab das gemacht, allerdings ist da soviel zurückzusetzen das ich überhaupt nichtmehr durchblicke. Dauernd stürtzt mein programm nach dem neustart ab mitten im spiel und ich weiss nicht warum.
Hab auch schon bei application-methoden gesucht. Aber das einzige was mir hoffnung gab war application.restore und das macht ja nicht das was ich brauche...

Aber wenns nicht anders geht dann nehm ich den neustarten-knopf raus. Ist ja auchnicht so schlimm wenn der anwender das programm nochmal starten muss.

Luckie 30. Jan 2003 08:37

Bei mir wäre das Spiel im Starmenü hier: Start -> Programme -> Zubehör -> Spiele.

Wäre nicht so toll alle 2 Minuten diesen ganzen Weg machen zu müssen. :roll:

Helmut 30. Jan 2003 08:39

hm.... ja.. du hast ja recht, schön isses nicht grad :roll: :oops:

Hansa 30. Jan 2003 09:34

Es gibt noch eine weitere prinzipielle Möglichkeit : Du packst alle Variablen in EINEN Record:

Code:
TYPE SpielTyp =
  RECORD
    punkte : integer;
    gewonnen : boolean;
    ...
  END;

VAR SpielVar : SpielTyp;
Das hat aber wiederum Vor- und Nachteile.

Vorteil : mit
Code:
FillChar (Spielvar,0,sizeof (SpielVar));
kannst Du auf einen Schlag alles auf Null, Leerzeichen und boolean auf false setzen, Du kannst nichts vergessen.

Nachteil : 1. Alles was <> 0 ist, z.B. true muß trotzdem von Hand auf einen Wert gesetzt werden. 2. Statt
Code:
punkte := 0
mußt Du dann schreiben :
Code:
SpielVar.punkte := 0;
also mehr Schreibarbeit. Letzteres kannst Du dir aber durch WITH fast sparen.

Ich habe das so noch nicht selber gemacht, aber bei Deiner Sache könnte eine solche Vorgehensweise durchaus Sinn machen. Trotzdem würde auch ich das ganze trotzdem in eine Prozedur packen,z.B.:
Code:
PROCEDURE SpielNeu;
  BEGIN
    FillChar (Spielvar,0,sizeof (SpielVar));
    WITH Spielvar DO BEGIN  // von 0 abweichende Werte setzen
      Level1 := 500;
      Leveel2 := 1000;
....
    END;
  END;
Gruß
Hansa

Helmut 30. Jan 2003 09:53

Hi Hansa,

deine Idee klingt echt gut, aber das ist wie du schon sagst noch mehr Arbeit, alle variablen umzubenennen.
Mein Spiel ist nun schon fertig, und ich müsste dann ja dne kompletten quelltext neuschreiben (bzw. alle variablennamen ändern). Also komtm das nicht in frage :(

Wenn es keine möglichkeit gibt (und sos cheint es ja...) dann mach ich das halt mit der normalen < alle-variablen-und-einstellungen-zurücksetzen >-methode. Zumindest weiss ich jetzt das es wohl nix gibt was mir das erleichtert.

Danke für eure Hilfe! Noch ein Paar sachen und das programm ist endlich fertig :)

[edit]

achja, nur um das nochmal zu sagen:

die ganze sache dreht sich zwar hauptsächlich um variablen zurücksetzen, aber auch andere sachen. Zum beispiel werden komponenten verscjoben, sichtbar/unsichtbar gemacht, enabled/disabled. Bilder werdne in timages geladen. Naja, und die abstürtze kommen halt wenn zum beispiel irgendetwas geladen/angezeigt wird was in dem zustand der komponente nicht möglich ist. Zum beispiel eine Form in den vordergrund holen die im moment disabled ist.
Hört sich eigentlich ganz einfach an das alles wieder zurückzustellen... aber irgendwie ist es das ganz und garnicht :oops:
Ich hab mind. 120 variablen, 9 forms und hunderte komponenten auf diesen die fast alle während des spiels verändert werden... :lol:

[/edit]

e-dancer 21. Feb 2003 22:48

with spielvar do begin
.x
.y
.dsfdf
.dfdfdf
//und alle anderen variablen
end;

so ist es nicht mehr schreibarbeit!!

Haegar 21. Feb 2003 22:53

darf man fragen um was für ein spiel es sich denn handelt!? :D

gruß haegar

Luckie 21. Feb 2003 22:55

Zitat:

Zitat von Helmut
Ich hab mind. 120 variablen, 9 forms und hunderte komponenten auf diesen die fast alle während des spiels verändert werden... :lol:

Tja, da würde ich sagen schlecht geplant. Bist du gar nicht am Anfang auf die Idee gekommen, dass man auch mal wieder von vorne anfagen wollen könnte? :roll:

masters001 21. Mär 2003 13:52

Zu diesem Thema hab ich auch noch ein kleines Problem:
Ich habe ein zweites Form in meinem Programm was sich vom 'Hauptformular' öffnen lässt.
Wenn ich dieses Formular nun öffne, danach schliesse und wiederum öffne, hab ich das gefühl das die Variablen nicht wieder 'frei' sind sondern noch von den zuvor ausgeführten Aktionen (vor dem schliessen und danach erneutem öffnen )mit Werten belegt sind?
Wie kann ich es erreichen das alle Variablen wenn ein Form geöfnnet wird unbelegt sind? Oder wenn ein Form geschlossen wird gelöscht werden?
Vielen Dank
masters001

Touchdown 21. Mär 2003 14:21

Im OnCreate bzw. OnClose, oder noch besser Constructor bzw Destructor.

X-Dragon 21. Mär 2003 14:23

Um was für Variablen geht es denn? Normal sollte man alle Variablen beim Programmstart bzw öffnen des neues Fensters erstmal z.B. auf 0 setzen so das das nicht passieren kann.

Wenn eine Variable immer ein Wert zugewiesen bekommt bevor sie abgerufen wird, ist es ja kein Problem, aber wenn kein direkte Zuweisung vorher erfolgt ist, kann immer irgend ein Zufallswert drin stehen, natürlich je nach dem was für Variablen und wo sie definiert sind.

teebee 21. Mär 2003 14:25

Hi masters001,

Du hast prinzipiell zwei Möglichkeiten, ein zweites Formular zu öffnen:

1. Du kannst es von Delphi automatisch erzeugen lassen, und bei Bedarf mit MyForm.Show(Modal) anzeigen.

2. Du kannst es unmittelbar bevor Du es brauchst selbst erzeugen, anzeigen, und nach Gebrauch wieder zerstören.

Bei der ersten Version geht das Anzeigen schneller, aber der Speicher für das Formular ist während der gesamten Laufzeit der Applikation belegt. Resourcenschonender ist die zweite Version, dafür dauert das Anzeigen evtl. einen Tick länger, da erst alles erzeugt werden muss, und das jedesmal neu.

Wenn Du die erste Methode anwendest (ist die Standardeinstellung), kannst Du Deine Variablen im OnShow-Ereignis von MyForm initialisieren (nicht in OnCreate, das wird nur einmal zu Beginn des Programmes ausgelöst).

Bei der zweiten Methode kannst Du die Initialisierung ins OnCreate-Ereignis packen.

mfg, teebee

oki 21. Mär 2003 15:30

Hallo Helmut,

Dein Problem kennt jeder dessen Programme bei der Programmierung wachsen. Da gibt es nur eine Lösung, Planung oder "Prinzip"!

Ich habe mir angewöhnt alle Variablen in den entsprechenden Objekten zu kapseln. Normalerweise initialisiert Delphi beim Create eines Objektes die Propertys mit null. Trotzdem setze auch ich in der Create-Methode meine Variablen vor (Vertrauen ist gut, vorbauen besser).

Bei Deinem Zurücksetzen würde ich einfach alle Objekte zerstören und dann neu creieren. So werden automatisch alle Eigenschaften auf die Startwerte gesetzt.

So bleibt meistens kaum noch Handarbeit übrig.

Gruß oki

masters001 30. Mär 2003 17:04

@ teebee
hi ich rufe mein Formular nach der ersten Methode auf
Ich schließe es ganz normal mit close.
Kannst du mir ein beispiel für deine zwiete beschriebene Methode posten?
Vielen Dank

Gregor 30. Mär 2003 17:20

wie schon einige gesagt haben, stelle auch ich alle variabeln beim start auf 0 etc. wenns viele sind und ich im onload nix ausser die variabeln auf null habe dann mache ich einfach einen verweis auf diese procedure :)

X-Dragon 30. Mär 2003 19:35

Zitat:

Zitat von masters001
@ teebee
hi ich rufe mein Formular nach der ersten Methode auf
Ich schließe es ganz normal mit close.
Kannst du mir ein beispiel für deine zwiete beschriebene Methode posten?
Vielen Dank

Ich denke er meinte das z.B. so:

Delphi-Quellcode:
  FmTagesSetup := TFmTagesSetup.Create(Application);
  if FmTagesSetup.ShowModal = mrOK then
    FmTagesSetup.Release;
So mache ich es zumindest normal, weil damit der Programmstart um einiges beschleunigt wird, wenn man ein paar mehr Fenster hat. Es wird also immer nur das gerade benötigte Fenster geladen und anschliessend wieder entfernt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz