Fenster erstellen in Funktion packen



  • Hallo!

    In meiner MDI-Anwendung habe ich mehrmals den Code, der mir ein Fenster erstellt, z.B:

    if (!Form2)
        Form2 = new TForm2(Application);
      else
        Form2->BringToFront();
      LadeFensterGroesse(Form2);
    

    Beim "OnClose"-Ereignis des Forms rufe ich dann auf:

    Form1->SpeichereFensterGroesse(Form2);
      Action = caFree;
      Form2 = NULL;
    

    Soweit, so gut (hoffe ich)...
    Jetzt wollte ich den "Erstellen-Code" in ne Funktion packen, was allerdings nicht so richtig funktionieren will. Der Code auf Form1.h :

    template<class T>
      void __fastcall MDIFensterOeffnen(TForm*& Fenster)
      {
        if (!Fenster)
          Fenster = new T(Application);
        else
          Fenster->BringToFront();
        Form1->LadeFensterGroesse(Fenster);
      }
    
      //Aufruf erfolgt dann über:
      MDIFensterOeffnen<TForm2>(Form2);
    

    Das Erstellen des Fensters funktioniert auch prima. Allerdings kann ich das Fenster auch mehrmals öffnen (obwohl new nur aufgerufen wird, wenn !Fenster, also wenn Fenster noch nicht vorhanden) - und das noch größere Übel ist dass ich eine Zugriffsverletzung erhalte, wenn ich nun Form2 schließe.

    Wo ist der Hacken, habe ich was übersehen? Und vor allem, woher kommt die Zugriffsverletzung?

    tschüss
    Robert



  • wozu die template funktion? und wozu *&??



  • Hallo!

    Template deswegen, weil ich sonst nicht wüsste, was ich für "TForm2" einsetzen sollte... Das ist ja der Name der Klasse...
    Und Referenz auf Zeiger (*&), weil ich für den Operator new ja einen Zeiger auf Form2 brauche...
    Andere Ideen?

    tschüss
    Robert



  • Original erstellt von rowisoft:
    Andere Ideen?

    Debugger benutzen?!?

    -junix



  • ach herje hatte ich wohl tomaten auf den augen, hatte das new T(Application) völlig übersehen. dann machts natürlich sinn mit dem template.



  • Hallo!

    Bekomme das einfach nicht gebacken...
    Nach junix's Rat hab ich mal den Debugger benutzt 🙂 und siehe da: Form2 bleibt NULL. warum?

    Verstehe das nicht...

    tschüss
    Robert



  • Wo hast du denn "Form2" deklariert? bzw. Wo wirds auf NULL gesetzt?

    -junix



  • Hallo!

    Form2 ist von Anfang an NULL, weil ich das Form nicht automatisch mit erstellen lasse (Projekt, Optionen, Formulare - da stehts rechts unter "Verfügbare Formulare" und nicht unter "Automatisch erstellen")

    Form2 wird in Unit2 unter mittels TForm2 *Form2; deklariert - eben so, wie der Builder das automatisch macht...

    ...zum verzweifeln..

    tschüss
    Robert


Anmelden zum Antworten