SendMessage verdreht MemberVariable!
-
estartu_de schrieb:
... Mach das mal, dann sehen wir weiter. ...
was? in nen String konvertieren? Glaub kaum das des was bringt
MSDN schrieb:
TRACE( "Integer = %d, String = %s\n", i, sz );
Falls du meintest ich soll das mit dem Trace einfach probieren, hab ich schon tut sich nichts
estartu_de schrieb:
... Kleiner Tip:
Breakpoint auf die Zeile setzen, mit F5 starten, drauflaufen, F10 drücken und in den Ausgabebereich im VC gucken.Kenn ich schon hab ich mir schon von dir sagen lassen!
Seit dem mach ich immer seltener strg + F10
-
Polofreak schrieb:
estartu_de schrieb:
... Mach das mal, dann sehen wir weiter. ...
was? in nen String konvertieren? Glaub kaum das des was bringt
MSDN schrieb:
TRACE( "Integer = %d, String = %s\n", i, sz );
Falls du meintest ich soll das mit dem Trace einfach probieren, hab ich schon tut sich nichts
Neee, du solltest blos in die MSDN gucken, was das macht.
Hast du denn im Ausgabebereich was gesehen? Oder was sagt der Debug zum Inhalt der Variablen?
Wenn der wirklich falsch ist:
Wo wird die überall verändert? Setz da Breakpoints drauf und guck, ob du drüberläufst.
-
mach einfach das Element als const
-
Im Ausgabebereich steht immer -80384336 oder eine ähnlich große negative Zahl. Ich hab die Membervariable vom Typ int gerade erst angelegt und will sie in nem anderen Dialog haben. Punkt ist der je nach dem welcher Button geclickt ist will ich in meinem Recset unterschiedliche Tabellen öffnen.
Und ich glaub ich weiß auch woran es liegt, ähnlich wie neulich aber ich weiß nicht wie ich es behebe.
Ich mach nämlich folgendes im Set:
COverviewView OV; int tst= OV.Element;
Nun legt er ja ne neue Referenz zu meiner Klasse COverviewView da kann die Variable ja nicht belegt sein und drum nimmt er da auch nen Scheiß!
Also sollte ich das andersrum machen, nicht von der Overview die Member holen sondern von der Overview an den Set übergeben oder?Bei Dialogen ging das, wenn ich sie dann mit dieser Referenz gemodalt hab, aber den RecSet kann ich ja nicht modalen!
Wat mach ich nu??
-
Nochmal langsam bitte:
Welche Klassen sind beteiligt? Wie kennen die sich? Welche Info willst du von wo nach wo haben?Kennt der View das Set? Dann mach einfach eine SetFunktion in das Set, mit der der View die Variable füllen kann.
-
Joa ne Set FKT sollte klappen, das versuch ich jetzt, falls dies nicht klappen sollte jammer ich hier nochmal!
-
AAAAAAAHHHH bin ich jetzt bescheuert??
RUHE BEWAHREN!
So jetzt!
Ich hab es mit einer Set mit einer get mit der direkten zuweisung der Variable aus beiden Richtungen probiert nichts klappt!
Also ich will folgendes machen:
Ich hab OverviewView, RecView und den RecsetOverView öffnet RecView und übergibt an Recset ne Variable, nach der entsprechend eine bestimmte Tabelle für den Recset geöffnet werden soll.
Wie stell ich das jetzt an?
-
Overview ist dein "Hauptmenü", richtig? Also ein View.
Das macht mit switchView einen zweiten auf.Zwei Views untereinander kennen sich nicht. Die können nix hin oder her geben.
Du musst also einen Umweg gehen.Mach doch eine Variable im Mainframe (oder in der App), wo du den Wert speicherst.
Der OverView packt den Wert rein und das RecSet holt ihn wieder raus und kann damit arbeiten.
Nicht schön, sollte aber funktionieren.
-
estartu_de schrieb:
... Zwei Views untereinander kennen sich nicht. Die können nix hin oder her geben. ...
Moment ich will die Variable doch von der View an den Set geben, ist das da gleiches Problem??
-
Polofreak schrieb:
estartu_de schrieb:
... Zwei Views untereinander kennen sich nicht. Die können nix hin oder her geben. ...
Moment ich will die Variable doch von der View an den Set geben, ist das da gleiches Problem??
Jetzt nochmal langsam für Blondinen bitte:
Von wo aus willst du das RecSet füllen? (Also welcher View?)
In welcher Klasse ist das RecSet ein Member?
-
Bist du blond? Würd gern mal ein Bild von dir sehen
öhm also:
View1 öffnet View2 und übergibt an Recset ne Variable
Naja wirklich füllen will ich das Recset eigentlich nicht ist ja nur eine Variable.Schau mal in deine Mails, hab dir ne Skizze gemalt
-
Von was ist Recset ein Member?
Die Info fehlt irgendwie immer noch, und ohne kann ich dir den "Pfad" nicht beschreiben.
Das geht leider auch nicht aus der Skizze hervor.
-
ja also im RecView ganz normal wie es der Wizard macht und in der Übersichtsview brauch ich es nur hierfür, dazu hab ich mir in der Übersich ne Member vom Set angelegt.
Jetzt?
-
Also doch über den Mainframe.
Die Member in den beiden Klassen haben nix miteinander zu tun. Die kennen sich untereinander nicht.
Also gib die Zahl an den Frame und lass den RecView (oder das Recset) das wieder abfragen und dann auswerten.
-
aaaaaaaahhhh jetzt öhm bin glaub aufm schlauch gestanden!
Probiers gleich morgen früh schau mal auf die Uhr, ich muss jetzt heim, bei dem Wetter!
-
Morgen tut mir echt leid dass ich hier jetzt schon wieder nerv weil ich es nicht hinbekomm! Aber ich hab mir das jetzt heute morgen mal in Ruhe durch gelesen und hab ja verstanden, dass die Instanzen der Views nichts mit den anderen zu tun haben. Aber was haben sie denn mit dem Mainframe gemeinsam?
Ich muss mir doch auch ne neue Instanz anlegen und wenn ich ne neue Instanz anlege, dann ist mein wert wieder flöten! (mir fällt grad was ein; könnte ich nicht onCreate getWert aus der View aus der ich ihn haben will, dann kann ich so viele Instanzen anlegen wie ich will, ich hab dann in ner Variable immer den Wert den ich haben will.)
Kannst du mir nochmal ganz in Ruhe wie nem blutigen Anfänger erklären wie ich das mache?
Also ich hab im Mainfrm zwei neue Funktionen ne get und ne Set die sehen so aus:
void CMainFrame::SetElement(int Nummer) { m_nElement = Nummer; } int CMainFrame::GetElement() { return m_nElement; }
So die Übersicht soll setten und der Recset getten. Also mach ich in der ÜbersichtsView:
void COverviewView::OnBtnStandardOperations() { CMainFrame m_set;// hier liegt ja der Fehler, wo leg ich das aber als member hin dass es für beide zugänglich ist m_set.SetElement(STANDARD_OPERATIONS); Element = STANDARD_OPERATIONS; AfxGetMainWnd()->SendMessage(WM_COMMAND, IDM_MAIN); }
Und im Set mach ich ja dann:
CString CDokumentenVerwaltungSet::GetDefaultSQL() { CMainFrame tst;//hier gleiches Problem wie oben! So können die sich ja nicht kennen!!! Element = tst.GetElement(); if(Element == 10) return _T(SQL_AAW); ...
Muss ich jetzt ne Member in mein Mainframe packen auf die View und über den Mainframe auf die View zugreifen?
Danke dass du mir hilfst!
-
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) zwischenCMainFrame* 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 leastestartu_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)