1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

2. Formular erstellen lassen

Dieses Thema im Forum "Borland CBuilder und VCL" wurde erstellt von Nobody24, 6. Oktober 2010.

  1. Nobody24

    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.
     
  2. GillBates

    GillBates Mitglied

    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 :)
     
  3. Nobody24

    Nobody24 Grünschnabel

    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 (Text):
    1. void SpielSteuerung::starteSpiel(AnsiString pSpielerName1, AnsiString pSpielerName2)
    2. {
    3.   dieSpielOberFlaeche->Show();
    4.  
    5.   dasSpielBlatt[0] = new SpielBlatt(pSpielerName1);
    6.   dasSpielBlatt[1] = new SpielBlatt(pSpielerName2);
    7.  
    8.   //Komischerweis funktioniert es hier...
    9.   ShowMessage(dasSpielBlatt[0]->gibPunkte(0));
    10.  
    11. void SpielSteuerung::spieleZug(AnsiString pFigurName)
    12. {
    13.   ShowMessage(dasSpielBlatt[0]->gibPunkte(0));
    14. }
    SpielSteuerung.h
    Code (Text):
    1. class TdieSpielOberFlaeche;
    2. class SpielBlatt;
    3.  
    4. class SpielSteuerung
    5. {
    6.       private:
    7.         TdieSpielOberFlaeche *dieSpielOberFlaeche;
    8.         SpielBlatt *dasSpielBlatt[2];
    9.  
    10.       public:
    11.         SpielSteuerung(TdieSpielOberFlaeche *of);
    12.         void starteSpiel(AnsiString pSpielerName1, AnsiString pSpielerName2);
    13.         void spieleZug(AnsiString pFigurName);
    14. };
    SpielBlatt.h
    Code (Text):
    1. class SpielBlatt
    2. {
    3.       private:
    4.         int punkteStand[13];
    5.  
    6.       public:
    7.         int gibPunkte(int pNrSpiel);
    8. };
    SpielBlatt.cpp
    Code (Text):
    1. int SpielBlatt::gibPunkte(int pNrSpiel)
    2. {
    3.   return punkteStand[pNrSpiel];
    4. }
     
  4. GillBates

    GillBates Mitglied

    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 :)
     
  5. Nobody24

    Nobody24 Grünschnabel

    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
     
  6. GillBates

    GillBates Mitglied

    global in der Klasse bedeutet z. B. im Konstruktor. Dann ist es in der ganzen Klasse sichtbar.


    grüssle :)
     
Die Seite wird geladen...