methode ueberschreiben



  • Heiho

    folgendes

    ich hab ein fenster mit den ganzen buttons, checkboxen - listen - menue usw erstellt - alles in der ChildView

    nu hab ich eine neue klasse dazu gepackt und diese ChildView als basisklasse

    nu geht es darum, wenn ich auf etwas klick {button oder menu item} springt das programm in die funktion in den childview, aber ich moechte das die funktion in der neuen klasse angesprochen wird

    ueberschreiben bringt nix /=

    jemand ne loesungsidee fuer mich ?

    class CChildView : public CWnd
    {
    private:
        DECLARE_MESSAGE_MAP()
    public:
        virtual afx_msg void OnFunction();
    };
    
    BEGIN_MESSAGE_MAP(CChildView,CWnd )
        ON_COMMAND(ID_MENUITEM, OnFunction)
    END_MESSAGE_MAP()
    
    void CChildView::OnFunction()
    {
        int Hier_Springts_Hin = 0;
    }
    
    class CMainClass : public CChildView
    {
    public:
        afx_msg void OnFunction();
    };
    
    void CMainClass::OnFunction()
    {
        int Hier_Solls_Hin = 0;
    }
    

    // dazuedit - verschrieben {o;



  • Löse mal in der CMainClass.cpp die OnFunction() auf. dann sollte es eigendlich gehn. Dort wo es hinsoll heist die funktion völlig anderst als sie in der CMainClass.h deklariert wurde. Somit kann es dort nicht hin, weil du die funktion nämlich NICHT überschrieben hast, bzw. diese gar nicht angesprochen wird.

    und wenn ich das richtig versteh, fehlt dir auch in der CMainClass die BEGIN_MESSAGE_MAP mit dem verweis auf die OnFunction. Wenn die nämlich nicht da ist kann es nur in die CChildView::OnFunction() springen.

    LowFly



  • ups - habs editiert, hatte das falsche kopiert #gg

    auf jeden fall, die funktion "OnFunction" hab ich ueberschrieben

    das mit der messagemap leuchtet mir ein, hatte ich auch {kurz} probiert

    mein problem ist:

    CMainClass.cpp

    BEGIN_MESSAGE_MAP(CMainClass, CChildView)
        ON_COMMAND(ID_MENUITEM, OnFunction) // error, because unknown ID
    END_MESSAGE_MAP()
    

    mein problem ist, das CMainClass die ID's irgendwie nicht kennt /=

    mein gedanke ist das ich die childview klasse als schnittstelle zur gui benutz, durch das erben bekomm ich ja direkten zugriff auf listen, editboxen, checkboxen usw

    mein letzter gedanke war, das ich irgendwie in der OnFunction bei childview eine message an CMainClass sende - da weiss ich aber auch nicht wie /=



  • Die ID's stehen normalerweise in deiner "ressource.h" - hast du eventuell einen #include vergessen?

    PS: Wie legst du eigentlich dein Fenster letztendlich an? Eventuell hast du ja wirklich nur ein CChildView.



  • Ressource includen bringt nix

    Ich habs automatisch erstellen lassen am anfang
    als erstes

    AppName.h/.cpp = class CAppName : public CWinApp
    MainFrm.h/.cpp = class CMainFrame : public CFrameWnd
    ChildView.h/.cpp = class CChildView : public CWnd

    und in CChildView hab ich dann die ganzen creates gemacht - also listen, buttons, texte usw erstellt und anzeigen lassen

    ich nahm an, da ich CMainClass von CChildView erbe, mach ich der klasse auch die buttons usw bekannt und kann deren messages abfangen bzw ueberschreiben /=

    //dazuedit

    mit buttons gehts auch nicht:

    BEGIN_MESSAGE_MAP(CMainClass, CChildView)
    	ON_BN_CLICKED(ID_BUTTON, OnButtonClick)
    	ON_COMMAND(ID_MENUITEM, OnFuncion)
    END_MESSAGE_MAP()
    
    void CMainClass::OnButtonClick()
    {
        int HIer_Komm_ich_auch_nicht_hin = 0;
    }
    

    includiert hab ich die ressource.h und die header mit meinen ids vom create



  • Nur weil du in deinem Projekt eine Klasse "CMainClass" definierst, wird die noch lange nicht als Hauptfenster verwendet 😉 Dazu mußt du in der Initialisierung noch festlegen, daß du ein CMainClass-Fenster verwenden willst.

    (bin mir nicht ganz sicher, wo das geht - warte mal auf die Experten)



  • wer sagt das ich die neue klasse als hauptfenster verwenden will - ich will lediglich das buttonklicks usw in dieser klasse fliegen
    und ich in der klasse direkten zugriff auf listen usw hab

    also childview nur fuer die grafikelemente und MainClass dann fuer das eigentliche "leben"

    zb, in ChildView erstelle ich eine liste
    klick auf ein knopf und daraufhin soll sich die liste fuellen

    und das fuellen soll in der mainclass stattfinden
    direkten zugriff auf die liste hab ich ja durch das erben - nur - woher weiss mainclass das etwas angeklickt wurde

    wenn ich mainclass nicht ableite von childview sondern als element von childview mach, kann ich zwar die button klicks zu childview schicken {funktion aufrufen} aber ich hab dann kein direkten zugriff mehr auf die elemente - muesste ich jedesmal ein pointer mitgeben



  • Da mußt du aber einiges an deinem Design umändern. Ableitung definiert eine "ist-ein" Beziehung - aber du benötigst eher eine "kennt" oder "verwendet" Beziehung zwischen deinen Klassen.

    PS: Irgendwo in der App findest du auch einen Pointer auf das aktive Fenster.



  • hmm - dann weiss ich nicht wie ich ansetzen soll

    mal simpel angefangen

    ich benutz CChildView zur erstellung von allen elementen die angezeigt werden
    CChildView ist demzufolge die gui

    nu moechte ich eine haupt klasse wo ich dem programm leben einhauche
    diese klasse muss natuerlich zugriff haben auf die elemente in der gui

    es ist kein problem eine methode in der childview zu machen {sowas wie OnBnClicked} und dann eine methode in der haupt klasse aufrufen

    wie implementier ich die klasse
    wenn ich die ableite von der gui klasse, hatt sie zwar vollen zugriff auf die elemente, aber ich kann keine methode aufrufen sobald was angeklickt wurde

    wenn ich die hauptklasse direkt in der gui klasse deklariere - kann ich die methoden aufrufen, aber die klasse hat keinen zugriff auf die elemente

    /=

    ich moechte halt gui und verarbeitung voneinander trennen



  • Mr Evil schrieb:

    ich moechte halt gui und verarbeitung voneinander trennen

    Genau das macht doch das Doc-View-Modell.
    Hast du keine Doc Klasse?
    🙂



  • noe ?

    wie gesagt, ich hab das projekt vom wizard erstellen lassen und dann die gui in der ChildView gebastelt

    Doc sagt mir gar nichts - wie implementier ich das ?



  • Der Wizard erstellt das Doc mit, wenn man ihm das sagt. Das wirst du wohl nicht getan haben und daher fehlt es. 😞

    Welches VC hast du?
    Ist das eine MDI-Anwendung?



  • ich hab mal geschaut - stimmt - das docview architecture hatte ich deaktiviert

    benutz VS 2005 Prof

    ist ein Single document und da hatte ich
    "Document/View architecture support" deaktiviert

    ich dacht das ist irgendwas wegen dateien schreiben / lesen bla, weil ich da staenig was von print gelesen hab #gg

    mal so gefragt
    wenn ich das so erstelle

    kann ich alles was ich jetzt in der childview erstellt hab dort in der "View" erstellen und klicks darauf in der doc abfangen ?

    View -> erstellen eines buttons und einer liste
    Doc -> message bekommen von den BnClicked und zugriff auf die liste

    ??

    waere ideal {=



  • Das geht ein wenig anders:
    Der Klick kommt im View an.

    Im View hast du mit Hilfe von GetDocument Zugriff auf das Doc und kannst dort dann Funktionen aufrufen wie du magst.
    Schau mal da: http://www.c-plusplus.net/forum/viewtopic-var-t-is-125623.html (Kapitel 4)

    Der View sollte dann Anzeigekram machen und das Doc sowas wie laden und speichern.



  • HA - funzt {=

    in hab in View ein button erstellt und in Doc dann das ON_BN_CLICKED

    und es funktioniert {=

    muss nu "nur" noch alles von meiner alten app nach der neuen app uebertragen

    vielen dank dir {=



  • Kein Problem 🙂



  • etwas versteh ich grad nicht

    also

    ich hab ein button in View erzeugt, und fange den klick in Doc ab
    nu moechte ich eintraege in eine liste setzen die ich auhc in view erzeugt hab

    da stellt sich mir die frage

    wie kann ich von Doc aus auf die Liste von View zugreifen /=

    ach ok - vergiss es #gg

    =

    void CFR2Doc::OnFunction()
    {
    	COwnView* pView = dynamic_cast<CFR2View*>(((CMainFrame*)AfxGetMainWnd())->GetActiveView());
    	pView->i = 15;
    }
    


  • Da sieht man mal wieder, wie nützlich das Magazin ist: Zusammenhänger der SDI-Klassen


Anmelden zum Antworten