Zugriff auf Doc-Klasse aus CMyApp::InitInstance()



  • Hallo.

    Ich möchte direkt nachdem das Hauptrahmenfenster sich erstellt hat einen Dialog anzeigen, der Login-Daten entgegennimmt (Benutzername, Passwort). Nur wenn beide den Vorgaben entsprechen soll der Benutzer das Programm nutzen dürfen, ansonsten soll die Anwendung geschlossen werden.
    Ich habe zunächst eine Dialogressource erstellt. Den Dialog rufen ich in der CMyApp::InitInstance() direkt nach

    m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);
    m_pMainWnd->UpdateWindow();
    //Aufruf des Dialogs (so oder ähnlich)
    CMyDialog   Logindialog;
    Logindialog.DoModal();
    return TRUE;
    

    auf. Die Überprüfung der Eingaben bzw. das Übernehmen der Werte hab ich hier zunächst noch nicht dargestellt. Soweit funktioniert das ja genau so wie ich das will.
    Mein Problem ist jetzt der Zugriff auf meine Doc-Klasse. Dort sollen die Eingaben in Memvervariablen abgelegt werden, da ich auch später die Möglichkeit des Benutzerwechsels brauche. Laut den Aufrufen sollte man doch drauf zugreifen können, da sie ja schon existiert. Das View erstellt ja auch eine Verbindung mittels GetDocument().
    Wie kann ich an dieser Stelle das Doc ansprechen, oder ist das vielleicht sogar günstiger, den Logindialog aus einer anderen Klasse oder Methode aufzurufen?



  • Das hier ist schon die beste Stelle.
    Mach den Dialog VOR dem Erstellen des Fensters und bei einer Fehleingabe "return FALSE;"
    Und die Variablen pack in die App-Klasse - da kommst du ja von überall her mit AfxGetApp dran. 🙂



  • Wenn der Dialog vor der Erstellung des Hauptfensters aufgerufen wird startet das Progamm nur mit dem Fenster. Finde ich optisch nicht so gut. So wie es das jetzt tut ist es schon ok, wenn es zum Abweisen des Benutzers kommen sollte will ich dann eine Message zum Beenden der Applikation senden.
    Das mit der quasi globalen Variablen im App selbst hab ich schon ausprobiert und das funktioniert ja auch. Ich wollte die nur direkt in das Doc schreiben. Was ich nicht verstehe: ich bekomm irgendwie keinen Zeiger auf mein Doc. Aber die View-Klasse wird doch viel eher erstellt und die kann das doch auch. Allerdings hat die ja eine Memberfunktion die dies erledigt....
    Wie kann man denn allgemein einen Zeiger auf das Doc bekommen? Wenn ich einen Zeiger auf die Doc-Klasse erstelle kann ich auf deren Member nicht zugreifen.



  • GetActiveDocument? 🙂
    Oder GetActiveView und dann kennst du es ja. 😉



  • Das Dokument liegt ja nicht im Hauptfenster, sondern im View, deshalb ist es dem Hauptfenster herzlich egal. Aber du kannst dir mit "GetActiveView()" (oder so ähnlich) das aktuelle View holen und dann nach seinem Dokument fragen.



  • Das Problem ist, dass ich nicht im Hauptfenster bin sondern in der Instanz der Applikationsklasse. GetActiveView() und GetActivDocument() sind doch Methoden der Klasse CFrameWnd.
    Oder seh ich da was falsch? Ich bekomms so jedenfalls nicht hin.



  • *grübelt* Was für einen Typ hat denn dein m_pMainWnd? Ich vermute mal, es ist irgendwo von CFrameWnd abgeleitet 😉

    Oder anders: Die Applikation kennt das Hauptfenster (m_pMainWnd), dieses kennt den View (GetActiveView()) und das Dokument (GetActiveDoc()) - damit kannst du mit einem "m_pMainWnd->GetActiveDoc()" an dein Dokument rankommen.



  • Ich hab mal folgendes ausprobiert:

    CFrameWnd* pMain = (CFrameWnd*)AfxGetApp()->m_pMainWnd;
    CMyView* pView = (CMyView*) pMain->GetActiveView( );
    CMyDoc* pDoc = (CMyDoc*)pMain->GetActiveDocument( );
    

    Das wäre ja in etwa das, was Du vorgeschlagen hast. Das lässt sich auch ausführen, allerdings sind im pDoc nicht die Members meiner Docklasse sichtbar.
    m_pMainWnd ist vom Typ

    CWnd* m_pMainWnd;
    

    Ich schreibe das Ganze in einer SDI-Anwendung.



  • Ok, habs hinbekommen. Der Fehler lag direkt in der ersten Zeile. So funktionierts:

    CFrameWnd* pMain = (CFrameWnd*)AfxGetMainWnd();  //anstatt AfxGetApp()->m_pMainWnd
    CMyView* pView = (CMyView*) pMain->GetActiveView( );
    CMyDoc* pDoc = (CMyDoc*)pMain->GetActiveDocument( );
    

Anmelden zum Antworten