MFC mit einer anderen Klasse verknüpfen



  • Erstmal wünsche ich euch ein frohes neues Jahr,

    Ich bin neu im Forum, also daher entschuldige ich schon ma voraus, falls ich was falsches mache. Ich muss für mein Studium ein MFC projekt (.exe, SDI, CView Klasse) schreiben, komme aber beim letzten schritt nicht mehr klar. Ich suche seit einer Woche schon nach Lösungen. Also das programm soll folgender maßen funktionieren:

    1. mit einem Dialog sollen erst Die Eingaben eingegeben werden (mit einem Button im Dialog), die dann in die CView Klasse "kopiert" und von dort in die Klasse CDoc "weiterkopiert" werden.

    2. Eine allgemeine Klasse soll dann mit den Eingaben eine 2x2 Matrix berechnen (was aber im Endeffekt nicht das Problem ist) und schließlich in CDoc bzw CView durch OnDraw ausgegeben werden.

    Nun zu meinem Problem: Wie verknüpfe ich CDoc mit der allgemeinen Klasse.
    Die Eingaben konnte ich schon erfolgreich in CDoc kopieren
    (pDoc->m_...=dlg.m_...). Aber wie gehe ich weiter vorran. Ich habe schon versucht, in die allgemeine Klasse eine funktion mithilfe meiner unterlagen zu schreiben, welche ich dann durch den Button verknüpft werden (sollte).Habe auch #include "(allgemeineKlasse).h" gemacht. Jedoch kommt die meldung:

    C:\Users\Sinan\Desktop\Neuer Ordner (3)\PR11View.cpp(207) : error C2228: Der linke Teil von '.up' muss eine Klasse/Struktur/Union sein
    C:\Users\Sinan\Desktop\Neuer Ordner (3)\PR11View.cpp(208) : error C2228: Der linke Teil von '.stand' muss eine Klasse/Struktur/Union sein

    Mein text für den Button-klick sieht folgendermaßen aus:

    void CPR11View::Oneingabe() //menübefehl
    {
    Cdialog dlg;
    int iresult=dlg.DoModal();
    if(iresult==IDOK)
    {
    CPR11Doc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);

    pDoc->m_zahl=dlg.m_z1; //alle variablen sind vom typ double
    pDoc->m_zahl2=dlg.m_z2;
    pDoc->m_zahl12=dlg.m_z1z2;
    pDoc->m_zahl13=dlg.m_z1z3;
    pDoc->m_zahl23=dlg.m_z2z3;
    pDoc->m_Docnennwert=dlg.m_nennwert;

    pDoc->m_DocSS1.up(); //.up() ist eine funktion in der allg. Klasse
    pDoc->m_DocSS1.stand(); //.sand() "" ""

    pDoc->SetModifiedFlag();
    Invalidate();
    }
    }

    Die allgemeine Klasse soll nicht abhängig von Cview sein, d.h. wenn man eine neue Klasse wählt, den Klassentypen "allgemeine Klasse" sein (aber evt wisst ihr das ja besser als ich:D).Ich danke euch im voraus und hoffe ihr könnt mir helfen.


  • Mod

    Was ist denn m_DocSS1? Du hast doch scheinbar hier schon einen Member.
    Warum baust Du nciht einfach eine Methode in das Dokument ein, dass die entsprechende Operation ausführt?

    Ich würde entsprechende Getter/Setter in die Dokumentklasse einbauen und Methoden, die das ausführen, was Du kalkulieren willst.
    Wenn die Daten fertig berechnet sind, kannst Du ja UpdateAllViews ausführen was dann die Views benachrichtigt.

    Bei der Konstruktion, die Du hier hast, verstehe ich aber nicht, warum Du den Dialog für die ATeneingabe nicht im Dokument verankerst. Der View wird doch gar nicht benötigt, wie ich das hier sehe.



  • Sorry, m_DocSS1 sollte die alte variabelbezeichnung für pDoc->m_zahl sein, habe nämlich so einiges probiert. pDoc->m_zahl.up() sollte nur zum Testen der kommunikation der beiden Klassen dienen, da ich, bevor ich anfange was zu programmieren, testen wollte, ob die daten überhaupt bei der allgemeinen klasse ankommen.

    Ich würde entsprechende Getter/Setter in die Dokumentklasse einbauen und Methoden, die das ausführen, was Du kalkulieren willst.
    Wenn die Daten fertig berechnet sind, kannst Du ja UpdateAllViews ausführen was dann die Views benachrichtigt.

    Genau sowas ist mein Problem, wir haben noch nie mit CDoc Klasse bearbeitet, deshalb weiss ich nicht wie dein Vorschlag gehen soll. Könntet ihr mir evt. dabei helfen?

    Bei der allgemeinen Klasse stehen:

    class CAll
    {
    public:
    CAll();
    virtual ~CAll();

    public:
    void up();
    double stand();
    void reset();

    private:
    double wert;

    };

    und im Konstruktor:

    CAll::CAll(){
    wert=0;}

    void CAll::up(){
    wert++;}

    double CAll::stand()
    {
    return wert;}

    void CAll::reset()
    {
    wert=0;}
    CAll::~CAll()
    {

    }

    PS:Ich habe dies von meinen Unterlagen abgeschrieben


  • Mod

    Dann platziere doch eine Instanz Deine Klasse in Deiner CDocument Klasse.

    Ein CDocument ist auch nichts anderes als einfach ein Container.
    Wo hast Du denn Probleme.

    Hast Du Dir schon mal das Scribble Sample angesehen?
    Wenn nicht tu das.


Anmelden zum Antworten