2. Formular erstellen lassen

Nobody24

Grünschnabel
Hallo,

folgendes Problem:

Beim Programmstart soll ein Formular erscheinen, nachdem man dort auf einen Button geklickt hat, wird die Funktion "starte" von meiner Klasse "Steuerung" aufgerufen und das 1. Formular zerstört. Soweit kein Problem... nun soll aber in dieser Funktion "starte" ein 2. Formular erstellt werden. Hier hab ich jedoch keine Ahnung wie das funktionieren soll :(

Ich weiß, dass man beide Formulare gleich beim Programmstart erstellen lassen kann und das 2. dann erst sichtbar machen kann, wen man es braucht. Jedoch ist das von der Aufgabenstellung her nicht erwünscht.

Ich verwende den Borland C Builder 5 und dementsprechend natürlich VCL...

Hoffe ihr könnt mir helfen. Danke schon mal im voraus.
 
solange die beiden Formulare nicht Modal sind, ist das kein Problem.

Form1->Show(); // das funktioniert ja schon

in der Funktion 'starte' dann:
Form2->Show();

Natürlich müssen beide Formulare davor erstellt sein, entw. mit new oder unter Projektoptionen -> Formulare - automatisch erzeugen.

Das wars


grüssle :)
 
Danke, habs jetzt hinbekommen :)

Hab nun aber ein neues Problem...

Wenn ich nun bei SpielSteuerung::spieleZug

" ShowMessage(dasSpielBlatt[0]->gibPunkte(0));"

aufrufe bekomm ich ne Fehlermeldung "Im Projekt... ist eine Exeception der Klasse EAccessViolation... aufgetreten." und das ganze Programm stürzt ab...

Führe ich genau die selbe Aktion allerdings in SpielSteuerung::starteSpiel aus, funktioniert es.

Und mir ist absolut schleierhaft, was da falsch läuft -.-

SpielSteuerung.cpp
Code:
void SpielSteuerung::starteSpiel(AnsiString pSpielerName1, AnsiString pSpielerName2)
{
  dieSpielOberFlaeche->Show();

  dasSpielBlatt[0] = new SpielBlatt(pSpielerName1);
  dasSpielBlatt[1] = new SpielBlatt(pSpielerName2);

  //Komischerweis funktioniert es hier...
  ShowMessage(dasSpielBlatt[0]->gibPunkte(0));

void SpielSteuerung::spieleZug(AnsiString pFigurName)
{
  ShowMessage(dasSpielBlatt[0]->gibPunkte(0));
}

SpielSteuerung.h
Code:
class TdieSpielOberFlaeche;
class SpielBlatt;

class SpielSteuerung
{
      private:
        TdieSpielOberFlaeche *dieSpielOberFlaeche;
        SpielBlatt *dasSpielBlatt[2];

      public:
        SpielSteuerung(TdieSpielOberFlaeche *of);
        void starteSpiel(AnsiString pSpielerName1, AnsiString pSpielerName2);
        void spieleZug(AnsiString pFigurName);
};

SpielBlatt.h
Code:
class SpielBlatt
{
      private:
        int punkteStand[13];

      public:
        int gibPunkte(int pNrSpiel);
};

SpielBlatt.cpp
Code:
int SpielBlatt::gibPunkte(int pNrSpiel)
{
  return punkteStand[pNrSpiel];
}
 
Danke, habs jetzt hinbekommen :)

Hab nun aber ein neues Problem...

Wenn ich nun bei SpielSteuerung::spieleZug

" ShowMessage(dasSpielBlatt[0]->gibPunkte(0));"

aufrufe bekomm ich ne Fehlermeldung "Im Projekt... ist eine Exeception der Klasse EAccessViolation... aufgetreten." und das ganze Programm stürzt ab...

Führe ich genau die selbe Aktion allerdings in SpielSteuerung::starteSpiel aus, funktioniert es.

Und mir ist absolut schleierhaft, was da falsch läuft -.-

Mir nicht :)

du erstellst 'dasSpielBlatt[...]' in der Funktion 'starteSpiel(...)'.
In der Funktion 'spieleZug(...)' ist das erstellte Objekt aber nicht bekannt, und schon wird eine Exception geschmissen :(

Erstelle mal die dasSpielBlatt Dinger global in der Klasse, dann klappts auch mit dem Zugriff.

grüssle :)
 
Ich habs jetzt denk ich selber hinbekommen. :)

Ich denke das Problem war, dass ich weil ich 2. Oberflächen habe, iwas bei den Assoziationen vermurkst habe.
Dann ist da iwas mit den Konstruktoren schiefe gelaufen und ich hatte wohl 2 Steuerungen, statt nur eine und dann hab ich immer auf die Steuerung zugegriffen, in der keine Spielblätter vorhanden waren, da sie nur in der 1. Steuerung erstellt wurden... naja, es funktioniert ja jetzt xD

Trozdem vielen Danke für deine Hilfe ;)

Noch rein interessehalber:
- Lieg ich da jetzt komplett falsch, aber da ich ja auf die Objekte, die ich mit new erstellt habe über einen Zeiger zugreife, ist es doch egal, wo die erstell worden sind?

- Wie hast du das gemeint mit "erstelle mal die dasSpielBlatt Dinger global in der Klasse"? Da steht mir iwie einer auf der Leitung, wie das gemeint war xD
 
Zurück