SendMessage verdreht MemberVariable!



  • Nimm ein Blatt Papier und einen roten dicken Stift. Jetzt schreib:
    "Einen Zeiger auf den Mainframe (Hauptfenster der SDI) bekommt man mit:

    CMainFrame* pFrame = dynamic_cast<CMainFrame*>(AfxGetMainWnd());
    ASSERT(pFrame);
    

    Und das häng dir so hin, dass du es oft siehst. 😉

    Muss ich jetzt ne Member in mein Mainframe packen auf die View und über den Mainframe auf die View zugreifen?

    Fast. Member in Mainframe: Ja.
    Mainframe auf View zugreifen - umgekehrt.
    Du hast es im Quellcode doch schon richtig gemacht. 😕

    Außer den Zeilen

    CMainFrame m_set;
    

    ist es schon genau so, wie es sein muss. 👍

    Hmm, fast:

    void COverviewView::OnBtnStandardOperations()
    {
        CMainFrame m_set;
        m_set.SetElement(STANDARD_OPERATIONS);
        Element = STANDARD_OPERATIONS; // Wozu ist diese Zeile? Die dadrüber ersetzt die doch, oder?
        AfxGetMainWnd()->SendMessage(WM_COMMAND, IDM_MAIN);
    }
    

    Na? Kronleuchter? 😉



  • Hey vielen Dank aber wo muss ich das was auf meinem roten Zettel steht jetzt in meinem Source unterbringen?

    Weil ich hab ja z.B. im Set kein OnInit kein Create ...
    Wenn ich das in meine get default SQL rein packe, in der ich nachher auch auf den Mainfrm zu greifen will, dann mault er!

    warning C4541: 'dynamic_cast' used on polymorphic type 'class CWnd' with /GR-; unpredictable behavior may result

    daraus ergibt sich dann natürlich noch:

    left of '.GetElement' must have class/struct/union type

    EDIT: ich greif doch dann über pFrame drauf zu oder?



  • Polofreak schrieb:

    Hey vielen Dank aber wo muss ich das was auf meinem roten Zettel steht jetzt in meinem Source unterbringen?

    Na, welche Zeile hab ich gesagt, stimmt noch nicht? 🙄

    Weil ich hab ja z.B. im Set kein OnInit kein Create ...

    Dann bau dir eins. 😉
    Ehrlich, bei solchen Klassen wie CRecordset kann und sollte man das machen, wenn es akut fehlt. Ich würde die Variable über eine einfache Set-Funktion reingeben.

    Wenn ich das in meine get default SQL rein packe, in der ich nachher auch auf den Mainfrm zu greifen will, dann mault er!

    warning C4541: 'dynamic_cast' used on polymorphic type 'class CWnd' with /GR-; unpredictable behavior may result

    daraus ergibt sich dann natürlich noch:

    left of '.GetElement' must have class/struct/union type

    Hast du schon nachgeschaut, was die MSDN dazu sagt?

    Compiler Warning (level 1) C4541
    'identifier' used on polymorphic type 'type' with /GR-; unpredictable behavior may result
    You did not enable run-time type information and tried to use a feature that requires run-time type information support. Recompile with the /GR switch.

    Du musst RTTI noch einschalten - das geht in den Projekteinstellungen.

    EDIT: ich greif doch dann über pFrame drauf zu oder?

    Genau. 🙂



  • OK ich hab mir vorgenommen letzter Post in diesem Thread in dem ich eine Frage stelle! (damit ich dich nicht weiter nerv!)

    Also:

    estartu_de schrieb:

    Polofreak schrieb:

    Hey vielen Dank aber wo muss ich das was auf meinem roten Zettel steht jetzt in meinem Source unterbringen?

    Na, welche Zeile hab ich gesagt, stimmt noch nicht? 🙄

    würde bedeuten:

    void COverviewView::OnBtnStandardOperations() 
    {
    	CMainFrame* pFrame = dynamic_cast<CMainFrame*>(AfxGetMainWnd()); 
    	ASSERT(pFrame);	
    	pFrame->SetElement(STANDARD_OPERATIONS);
    	AfxGetMainWnd()->SendMessage(WM_COMMAND, IDM_MAIN);
    }
    

    Aber ich hab da 11 Buttons die das alle machen sollen! Also wäre es doch sinniger das

    CMainFrame* pFrame = dynamic_cast<CMainFrame*>(AfxGetMainWnd()); 
    	ASSERT(pFrame);
    

    woanders rein zu packen, oder? Wenn ich das aber z.B. in die OnCreate packe, dann sagt er mir beim aufruf pFrame: undeclared identifyer. Wenn du grad weißt warum, sehr gut wenn nicht, scheiß egal mach ich das halt bei jedem Button dann geht es auf jeden Fall!

    Dann hätte ich nochmal kurz ne Frage:
    Was ist der Unterschied (für Dummies) zwischen

    CMainFrame* pFrame = dynamic_cast<CMainFrame*>(AfxGetMainWnd());
    

    und

    CMainFrame* pFrame;
    

    Es sind beides Referenzen bei der ersten schaut er wer hat hier alles erschaffen, ist also Godfather vom Programm
    und beim zweiten ist es nur ne Referenz auf den Mainframe.
    Stimmt das?
    Und last but not least

    estartu_de schrieb:

    Polofreak schrieb:

    Weil ich hab ja z.B. im Set kein OnInit kein Create ...

    Dann bau dir eins. 😉
    Ehrlich, bei solchen Klassen wie CRecordset kann und sollte man das machen, wenn es akut fehlt. Ich würde die Variable über eine einfache Set-Funktion reingeben.

    Aber der Klassenassi bietet mir für mein Set keinerlei solcher FKTs an, das wird doch seine Gründe haben, oder?

    So und jetzt noch ein riesen dickes fettes DANKESCHÖN für deine Geduld und deine hilfreichen Tips, was würde ich nur ohne dich machen!
    Und jetzt hör ich auf die zu quälen. (Für heute 😉 )



  • Polofreak schrieb:

    estartu_de schrieb:

    Polofreak schrieb:

    Hey vielen Dank aber wo muss ich das was auf meinem roten Zettel steht jetzt in meinem Source unterbringen?

    Na, welche Zeile hab ich gesagt, stimmt noch nicht? 🙄

    würde bedeuten:

    void COverviewView::OnBtnStandardOperations() 
    {
    	CMainFrame* pFrame = dynamic_cast<CMainFrame*>(AfxGetMainWnd()); 
    	ASSERT(pFrame);	
    	pFrame->SetElement(STANDARD_OPERATIONS);
    	AfxGetMainWnd()->SendMessage(WM_COMMAND, IDM_MAIN);
    }
    

    Aber ich hab da 11 Buttons die das alle machen sollen! Also wäre es doch sinniger das

    CMainFrame* pFrame = dynamic_cast<CMainFrame*>(AfxGetMainWnd()); 
    	ASSERT(pFrame);
    

    woanders rein zu packen, oder? Wenn ich das aber z.B. in die OnCreate packe, dann sagt er mir beim aufruf pFrame: undeclared identifyer. Wenn du grad weißt warum, sehr gut wenn nicht, scheiß egal mach ich das halt bei jedem Button dann geht es auf jeden Fall!

    Sauberer isses, das bei jedem Button zu machen.
    Du kannst aber pFrame als Member in den View packen, dann sollte das gehen. Aber ob es in OnCreate funktioniert? 😕

    Dann hätte ich nochmal kurz ne Frage:
    Was ist der Unterschied (für Dummies) zwischen

    CMainFrame* pFrame = dynamic_cast<CMainFrame*>(AfxGetMainWnd());
    

    und

    CMainFrame* pFrame;
    

    Es sind beides Referenzen bei der ersten schaut er wer hat hier alles erschaffen, ist also Godfather vom Programm
    und beim zweiten ist es nur ne Referenz auf den Mainframe.
    Stimmt das?

    Das sind keine Referenzen, das sind Zeiger. Referenz wäre ein CMainFrame& und nicht *. 😉
    Und das zweite ist ein Zeiger, der auf einen Mainframe zeigen kann.
    Er ist aber nicht initialisiert, also zeigt er ins Nirvana und wenn du ihn nutzt, knallts. ⚠
    (Haste das mit den Autos und dem Zettel damals doch nicht verstanden?)

    Und last but not least

    estartu_de schrieb:

    Polofreak schrieb:

    Weil ich hab ja z.B. im Set kein OnInit kein Create ...

    Dann bau dir eins. 😉
    Ehrlich, bei solchen Klassen wie CRecordset kann und sollte man das machen, wenn es akut fehlt. Ich würde die Variable über eine einfache Set-Funktion reingeben.

    Aber der Klassenassi bietet mir für mein Set keinerlei solcher FKTs an, das wird doch seine Gründe haben, oder?

    Naja, der Assi ist nicht allwissend und daher muss man hin und wieder was selber machen. Der soll dich ja nur bei Routineaufgaben unterstützen - das hier scheint nicht mehr unter Routine zu fallen.

    So und jetzt noch ein riesen dickes fettes DANKESCHÖN für deine Geduld und deine hilfreichen Tips, was würde ich nur ohne dich machen!
    Und jetzt hör ich auf die zu quälen. (Für heute 😉 )

    Och, der einzige, der hier gequält wird bist du - von nem schlechten Gewissen und mit Lernstoff. 🤡



  • Joa das schlechte Gewissen quält mich schon, weil ich dich hier schon sehr einspanne. Das mit den AUtos und Zetteln dachte ich damals eingentlich verstanden zu haben, aber ich denke ich werde mir das jetzt nochmal durchlesen. Ich werde auch versuchen dem Set ein OnInit zu geben, denn ich bin ja einer der nicht nur Routine-Funktionen nutzt 😉 .
    Also vielen lieben Dank nochmal für deine Geduld!
    *Backenschmatzsmily*



  • Kein Problem. 🙂
    Ich finds blos lustig, dass man Threads mit uns zweien am leichtesten an der Seitenanzahl erkennt. 😃

    PS: Mail angekommen? Revanche? Bin ja nicht neugierig... 😉



  • das mit der Seitenzahl stimmt wohl, vor allem wenn man sich die Zeit vom ersten bis zum letzen Post anschaut! 😃
    Kriegst leider erst morgen ne Mail, da ich online nichts gefunden hab!



  • Macht ja nix, ich hab das blos online, weil wir in nem anderen Forum eine Galerie mit Userbildern haben. 😃



  • Auf diversen Partybilder-Seiten sollte ich eigentlich auch welche von mir finden aber die die ich auswendig weiß, auf denen find ich grad keine. Und auf den HPs die ich gemacht hab sind nie Bilder von mir *gg* also ich bin sicher wenn ich noch ein wenig suchen würde, würde ich mit Sicherheit irgendwo eins finden nur wo anfangen suchen??? 😕


Anmelden zum Antworten