Dialogbasierte Anwendung + eigene Klasse



  • Dankeschön



  • Wennn du über mehrere Dialoge die Daten Sammelst, kannst du auch eine Klasse in der Applikaton-Klasse Sammeln, da Hast du von überall aus Zugriff. Wenn das eh nur ein Dialog ist, dann mach es Direkt in der Dialogklasse.



  • Es ist momentan nur ein Dialog. Das "Sammmelobjekt" in der application Klasse einzufügen klingt gut. Ich habe das mal folgendermaßen probiert, jedoch habe ich noch Probleme den Zugriff auf dieses Objekt im Dialog zu realisieren.

    Wie könnte ich diesen Zugriff realisieren? Ist eine der Beiden folgenden Varianten dafür zu gebrauchen?

    // MyApp.h
    #include "CSammel.h"
    
    class CMfcMyApp : public CWinApp
    {
    // Variante A
    public:
       // Direkter Zugriff ohne get und set Methoden. Ist das ok oder eher Mist ?
       CSammel   Sammelobjekt;
    
    // Variante B
    public:
       CSammel&  getSammelobjekt();
    private:
       // Zugriff über getSammelobjekt() Methode
       CSammel   Sammelobjekt;
       ...
    }
    
    // MyDlg.cpp
    #include "CSammel.h"
    #include "MyApp.h"
    
    void CMyDlg::OnFileOpen()
    {
       // Variante A
       MyApp::Sammelobjekt.setIrgendwas(const int zahl);
    
       // Variante B
       CSammel& Sammelobjekt = getSammelobjekt();
       Sammelobjekt.setIrgendwas(const int zahl);
    
    }
    


  • Habe die ganze Sache jetzt folgendermaßen realisiert. Ist die Art und Weise ok, oder hab ich irgendwo eine Fehlerquelle eingebaut?

    // MyApp.h ///////////////////////////////////////////
    #include "CSammel.h"
    
    class CMfcMyApp : public CWinApp
    {
    public:
       CSammel&  getSammelobjekt();
    private:
       // Zugriff über getSammelobjekt() Methode
       CSammel   Sammelobjekt;
       ...
    };
    // the App global verfügbar, damit Zugriff auf getSammelobjekt Methode möglich.
    extern CMfcguiApp theApp;
    
    // MyApp.cpp /////////////////////////////////////////
    #include "CSammel.h"
    ...
    CMfcMyApp theApp;
    
    // MyDlg.cpp ///////////////////////////////////////////
    #include "CSammel.h"
    #include "MyApp.h"
    
    void CMyDlg::OnFileOpen()
    {
         CSammel& Sammelobjekt = getSammelobjekt();
       Sammelobjekt.setIrgendwas(const int zahl);
    
    }
    


  • Also

    // the App global verfügbar, damit Zugriff auf getSammelobjekt Methode möglich.
    extern CMfcguiApp theApp;
    

    würde ich nicht machen sondern die entsprechende Funktion AfxGetApp() und entsprechenden casting auf die Application machen.

    und

    [cpp]
    void CMyDlg::OnFileOpen()
    {
    CSammel& Sammelobjekt = getSammelobjekt();
    Sammelobjekt.setIrgendwas(const int zahl);

    }
    getSammelobjekt() dürftest du so gar nicht aufrufen können weil es ein Member der Klasse CMfcMyApp ist, also wenn dann müsstest du schon über theApp zugreifen. An sonnsten würde ich das bei nem größeren Projekt auch so machen, vor allem weil man so das schreiben und lesen über die Klasse regeln kann und auch noch version von verschiedenen Setup-dateinen machen kann, ohne an vielen stellen im Programm achten zu müssen das alles auch noch geht.



  • Vielen Dank für die Hilfe!! Klingt sehr gut, weiß aber nicht so recht wie ich das umsetzen kann (blutiger Anfänger). Geht das folgende in die richtige Richtung??

    // MyApp.h ///////////////////////////////////////////
    #include "CSammel.h"
    
    class CMfcMyApp : public CWinApp
    {
    public:
    
       int getIrgendwas();
    
    private:
    
        CSammel   Sammelobjekt;
       ...
    };
    
    // MyDlg.cpp ///////////////////////////////////////////
    #include "CSammel.h"
    #include "MyApp.h"
    
    // Pointer zum CWinObjekt der Anwendung
    CWinApp* pApplication;
    pApplication = AfxGetApp(); //??
    
    // Casten
    CMfcMyApp* pApp;
    pApp = (CMfcMyApp*)pApplication; //??
    
    void CMyDlg::OnFileOpen()
    {
            // Zugriff im Dialog:
    	pApp->Sammelobjekt.getIrgendwas();
    }
    

    Der Compiler bringt mir folgende Fehler:

    pApplication: missing storage-class or type specifiers
    pApplication: 'int' differs in levels of indirection from 'class CWinApp*'
    initializing: cannot convert from 'class CWinApp *' to 'int'

    Nach MSDN ist die Definition von AfxGetApp() folgendermaßen:

    CWinApp* AFXAPI AfxGetApp( );
    

    Nach dem Compiler gibt AfxxGetApp() jedoch anscheinend einen int Wert zurück !?!

    Was mach ich falsch ? (😕 -> 😡)



  • #include "CSammel.h"
    
    class CMfcMyApp : public CWinApp
    {
    public:
    
       int getIrgendwas();
    
    private:
    
        CSammel   Sammelobjekt;
       ...
    };
    
    // MyDlg.cpp ///////////////////////////////////////////
    #include "CSammel.h"
    #include "MyApp.h"
    
    // Casten
    CMfcMyApp* pApp = (CMfcMyApp*)::AfxGetApp(); //??
    
    void CMyDlg::OnFileOpen()
    {
            // Zugriff im Dialog:
        pApp->Sammelobjekt.getIrgendwas();
    }
    

    Also so sollte das doch auch bei dir gehen, sonnst hast du irgendwo anders noch ein Problem, zumindest nutze ich das auch immer so 😕



  • 😃 !! Vielen Dank !! Es funktioniert.



  • Was sollte aber falsch daran sein direkt

    theApp.MyFunction()
    

    zu verwenden?



  • Nix du hast natürlich Recht, manchmal sieht man das einfachste net.


Anmelden zum Antworten