Recordview Problem
-
ICh kann die Anwendung starten und ich hab ja auf nen Buton diese Funktion SwitchView, und sobald ich auf diesen Button clicke steigt er aus. Was kann ich da jetzt tun?
Geht das vielleicht gar nicht so mit Recordviews? Geht das nur mit Formviews oder mit allen?? Eigentlich dohc mit allen Views, oder?
-
Eigentlich sollte das mit allen Views gehen.
Ich mache das mit Formviews.
Wenn du gar keine Idee mehr hast gibt es zwei Möglichkeiten.
1. Du machst ein leeres Projekt, wo du das nochmal versuchst. Manchmal baut man Fehler ein, die man später nicht mehr findet.
2. Du bereinigst das Projekt, packst es als zip (!!!) und schickst es an estartu_de@yahoo.com. Ich gucke drauf, wenn ich Zeit habe und finde vielleicht den Fehler.
-
Wow zwei Möglichkeiten sind immer gut, ich hab die erste Möglichkeit gemacht und wie ich feststellen musste ist das immernoch genau das gleiche Problem, ich hab wirklich nur noch die View-Geschichte drin sonst nichts. Jetzt werde ich zur zweiten übergehen.
-
Ich habe den Fehler!
void CMy11View::OnBtnView2() { CMainFrame switchto; switchto.SwitchView(IDD_BOUNDARY); }
Denk bitte mal über diese Zeilen nach, vielleicht kommst du drauf - sonst muss ich mich mal als Erklärbär üben.
-
Nanu? Was ist los?
Keine Idee?
-
Sorry bei uns war das I-Net gestern mittag tot. Ich hab mir die Zeilen angeschaut und bin bis jetzt noch nicht auf die Lösung des Problems gekommen,ich rufe die Funktion OnBTNView2 auf. Und in der Funktion rufe ich dann doch meine Funktion SwitchView auf. Da bin ich mir eigentlich recht sicher. Jetzt kann der Fehler eigentlich nur noch in der Zeile
CMainframe switchto;
liegen, in der ich eine Instanz vom Mainframe anlege.
glaube ich. Aber von was muss ich denn vor dem aufruf dann eine Instanz anlegen? ( Muss ich doch oder?) Weil ich kann ja die FKT nicht einfach mit
CMainframe::SwitchView(IDD_BOUNDARY);
aufrufen. Aber ich hab da noch was vielleicht sein könnte und zwar übergebe ich doch eigentlihc ein unsigned int muss ich dann erst noch meine IDD an eine int Variable übergeben? Ich dachte da stünde schon ein int drin.
So das war mein Gedankengang im kurzen zusammengefasst, aber die Lösung habe ich immer noch nicht.
Please tell me.
-
Ah, dann ist ja gut, ich dachte schon, ich habe dich verärgert.
Ich hab neulich mal Zeiger anhand von Autos erklärt. ( http://www.c-plusplus.net/forum/viewtopic-var-t-is-103523.html )
In dem Stil mach ich jetzt einfach weiter, okay?Du hast ein Auto, das steht zu Hause in der Garage. (Das ist der MainFrame, den das Framework für dich anlegt.)
Bei dem Auto hast du deine Lieblingscd im Radio. (Die CD macht mal den Platzhalter für alle Membervariablen, die initialisiert wurden. Der aktuelle View gehört auch dazu.)
**
So, jetzt bist du aber auf Arbeit und willst deine Lieblingscd hören.** Dazu brauchst du ja ein Auto mit Radio.Du gehst also zum nächsten Autohaus und kaufst dir ein Auto.
CMainframe switchto;
Dann machst du das Radio an und wunderst dich, dass da gar nicht deine CD drin ist.
Dämmert es?
Der MainFrame, den du da anlegst hat NICHTS mit dem zu tun, dem der aktuelle View bekannt ist.Nur mit der Lösung des Problems wirds etwas schwieriger. Vom View aus kommt man irgendwie nicht so einfach an den MainFrame.
Möglichkeit 1: Du machst das nicht per Knopf, sondern per Menübefehl (der im Frame behandelt wird), so war es ja auch in der FAQ, Reste davon hab ich noch in deinem Quelltext gefunden.
Möglichkeit 2: Du holst dir in der OnBtnView2 einen Zeiger auf das Hauptfenster (AfxGetMainWnd) und schickst dem eine Nachricht.
Im MainFrame muss dann ein MessageHandler sein, der dann den Viewtausch macht.
Möglichkeit 3: Du kombinierst beides.So, du bist.
-
OK hört sich doch schon mal gut an ich hatte in der Zeit in der zwischen unseren Posts probiert im MainFrame eine Membervariable anzulegen, aber bin damit auch nicht weiter gekommen. Das mit den Überresten stimmt. Das habe ich gestern so aus meiner Verzweiflung raus noch unten aus der FAQ kopiert und einfach mal rein geschmissen, in der Hoffnung dass sich der Fehler an ner ganz anderen Stelle von selbst löst.
Naja jetzt hab ich es übers Menü versucht ich hab einen Menüeintrag gemacht der Switch heißt und dann
void CMainFrame::OnSwitch(UINT f_nID) { SwitchView(IDD_BOUNDARY); }
So ich bin danach aber immnoch gleich weit wie bisher. Der steigt mit dem gleichen Fehler an der gleichen Stelle aus.
Soviel zu Möglichkeit 1. Zu 2versteh ich net, daraus folgt dass aus drei bei mir nichts werden kann.
Kannst du mir das mal Sourcen??
-
Kannst du mir die aktuelle Version mal schicken?
Dann weiß ich, wodrauf ich aufbauen kann.Dann sehen wir weiter. Fertig einbauen werde ich es dir jedenfalls nicht, dann lernst du ja nix.
Ich schubs dich weiter in die richtige Richtung, das wird schon noch.
-
Polofreak schrieb:
So ich bin danach aber immnoch gleich weit wie bisher. Der steigt mit dem gleichen Fehler an der gleichen Stelle aus.
Falsch.
Drück mal wiederholen. Der steigt ganz woanders aus und hilft dir sogar beim Fehlersuchen.
// dialog template must exist and be invisible with WS_CHILD set if (!_AfxCheckDialogTemplate(m_lpszTemplateName, TRUE)) { ASSERT(FALSE); // invalid dialog template name PostNcDestroy(); // cleanup if Create fails too soon return FALSE; }
Man landet in der Zeile mit ASSERT(FALSE); (wie sollte es anders sein...)
Du hast die Resource falsch erstellt.
Du hast einen Dialog erstellt - du brauchst aber einen View.Das versteckt sich ein wenig:
Rechte Maustaste auf den Resourceordner "Dialog" -> Einfügen.
In dem Fenster auf das kleine Plus vor Dialog klicken und dann IDD_FORMVIEW wählen.
Fertig. Nun noch den Namen richtig machen und das funktioniert.PS: Wenn du Möglichkeit 3 noch machen möchtest, die geht jetzt ganz einfach.
Eine Funktion erstellen und eine Zeile schreiben.
-
Jain,
Ja du hast recht er steigt bei dem ASSERT aus
Nein es ist kein CDialog IDD_MY11_FORM und IDD_BOUNDARY sind beides Recordviews, und ich will es mit Recordviews machen und nicht mit Formviews drum auch die Frage weiter vorne in diesem Thread geht das nur mit Formviews oder geht das mit allen! Sonst kann ich auch wenn ich im Klassenassi new class wähle sagen Formview das ist mir schon klar aber ich brauch zugriff auf die Datenbank und somit auf den Recordset. (andere Frage kann ich die Klasse zu nem bestehenden Dialog ändern? Weil du beschreibst wie man neuen anlegt, das weiß ich aber)
Möglichkeit 3 wäre schon am schänsten aber über die FKT und die eine Zeile mach ich mir Gedanken wenn das andere Problem gelöst ist
-
Halt, ganz langsam - du schmeißt da Resourcentypen und Klassennamen durcheinander.
Hast du nur gelesen oder auch ausprobiert?
-
Boa scheiße übers Menü geht es jetzt wie gut! Ich hatte es probiert hab aber in meiner Eifer als ich schon Dialog gehört habe gleich gedacht awa ne niemals aber Tatsache hab ich da was durcheinander geworfen, genau wie du gesagt hast. Jetzt verrätst du mir doch bestimmt auch noch die 3. Möglichkeit
Ach wie ich mich jetzt freu
-
Na logisch.
Also, kleine Hintergrunderklärung, damit du auch weißt, was du da machst:
Wenn du im Menü einen Befehl auswählst, bekommt dein Hauptfenster die Nachricht, dass der Befehl gewählt wurde und reagiert darauf.
Das hast du schon eingebaut.Nun musst du, wenn der Knopf gedrückt wird dem Hauptfenster sagen, dass es den Menübefehl ausführen soll. Also schickst du ihm eine Nachricht:
AfxGetMainWnd()->SendMessage(WM_COMMAND, IDM_SWITCH);
AfxGetMainWnd: Zeiger auf Hauptfenster holen
SendMessage: Nachricht schicken
WM_COMMAND: Menübefehl "vorgaukeln"
IDM_SWITCH: Welcher MenüpunktMöglichkeit 2 wäre so ähnlich, aber ohne Menübefehl geht es etwas anders. Naja, brauchst du ja nicht mehr.
(Wenn doch, such nach ON_MESSAGE...)
-
WOW ich bin überwältigt, das klappt ja jetzt wie geschmiert! Das fasziniert mich jetzt brutal! Das werd ich mir jetzt gleich mal als Musterprojekt in nen Ordner packen vielen Dank für deine Klasse Hilfe!!!
DANKE DANKE DANKE
-
Schön, dass es jetzt geht.
Viel Spaß noch!