Variablenwerte zwischen Fenstern tauschen
-
Hallo,
wahrscheinlich kommt dem einen oder anderen mein Problem bekannt vor und glaubt, es hier schonmal gelesen zu haben. Seit 2 Abenden suche ich wie wild hier im Forum nach einer Lösung meines Problems.
Ich arbeite mit einer Autorenversion von VC++6 und habe dazu noch MS SQL 2005 Express installiert.
Die Anwendung wird mit einem Hauptfenster (MAINFRAME) gestartet, die wiederum in der OnDraw-Methode ein modales Fenster aufruft. In diesem modalen Fenster sollen Login und Passwort eingegeben werden. Im Hauptfenster sollen diese Daten dann überprüft werden mittels Datenbank-Abfrage. Aber wie bekomme ich diese Daten aus dem modalen Fenster in das MAINFRAME??? Ich habe hier noch nichts gefunden, mit dem ich weiterkommen könnte. Das Schlimme dabei ist, dass ich mich so gut noch nicht mit C++ und insbesondere der MFC auskenne.
Ein Hinweis noch: Die Verbindung zur Datenbank funktioniert, d. h. im Hauptfenster werden die Daten korrekt angezeigt, die ich über TextOut ausgebe.
Hier mal der Code der OnDraw-Methode:
void CDBprojectView::OnDraw(CDC* pDC) { CDBprojectDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDoc->SetTitle("Hauptfenster"); // ZU ERLEDIGEN: Hier Code zum Zeichnen der ursprünglichen Daten hinzufügen CLoginDlg LogDlg; LogDlg.DoModal(); //MessageBox(m_strLogin, "TEST MIT NEUEN DATEN", MB_OK); m_pSet = &GetDocument()->m_RSet1; if(!m_pSet->IsOpen()) { m_pSet->Open(CRecordset::dynaset, _T("select id, login_name, login_pw from t_user where login_name like '%i%'"), CRecordset::readOnly); } pDC->TextOut(10, 10, "Datenbankverbindung geöffnet!"); int j = 30; if(m_pSet->IsOpen()) { //Zuerst Anzahl der Datensätze ermitteln int i = 0; CString AnzRS; m_pSet->MoveFirst(); while(!m_pSet->IsEOF()) { i++; m_pSet->MoveNext(); } AnzRS.Format("%d", i); AnzRS = AnzRS + " Datensätze selektiert!"; pDC->TextOut(300, 300, AnzRS); m_pSet->MoveFirst(); while(!m_pSet->IsEOF()) { pDC->TextOut(10, j, m_pSet->m_login_name); pDC->TextOut(250, j, m_pSet->m_login_pw); j = j + 20; m_pSet->MoveNext(); } } else { pDC->TextOut(10, 30, "Datenbankverbindung konnte nicht geöffnet werden!"); } m_pSet->Close(); pDC->TextOut(10, j, "Datenbankverbindung geschlossen!"); }Und jetzt noch der Code des Anmeldefensters:
void CLoginDlg::OnOK() { // TODO: Zusätzliche Prüfung hier einfügen char Log[30]; char LogTemp[30]; char LogPW[30]; char LogPWTemp[30]; GetDlgItemText(IDC_EDIT1, Log, 30); GetDlgItemText(IDC_EDIT2, LogPW, 30); strcpy(LogTemp, Log); strcpy(LogPWTemp, LogPW); m_strLogin = LogTemp; m_strPasswort = LogPWTemp; MessageBox(m_strLogin, m_strLogin, MB_OK); MessageBox(m_strPasswort, m_strPasswort, MB_OK); CDialog::OnOK(); }Wäre super, wenn mir jemand auf die Sprünge helfen könnte.
Vielen Dank schon mal.
-
Hallo da!
Mir bereitet Dein Design zwar Kopfzerbrechen, aber an das Fensterobjekt kommst du relativ leicht ran!Dein Applikationsobjekt (von CWinApp abgeleitet, welches wiederum von CWinThread abgeleitet ist) hat einen public Member, der einen Zeiger auf das Hauptfenster der Applikation darstellt. Auf diesen kannst du aber auch mit der Memberfunktion GetMainWnd() zugreifen (Das Applikationsobjekt ist von dem Wizard als eine globale Variable mit dem Namen theApp definiert worden, wenn ich mich richtig entsinne). Und wenn das alles noch zu viel ist, so kannst du auch
CWnd* AFXAPI AfxGetMainWnd( );verwenden.
Mit dem entsprechenden Typcast zum CMainFrame (oder wie bei Dir die CMDIFrameWnd- oder CFrameWnd-abgeleitete Klasse heißt), hast du den vollen Zugriff darauf.Viele Grüße,
Michael
-
1. In OnDraw/OnPaint solltest Du niemals weitere Dialoge anzeigen, oder gar eine Messageloop initieren. Dein Programm Wird reentrant.
Test: Lass Deinen Login Dialog anzeigen. Dann Verdecke Deine Applikation mit einem anderen Programm.
Nun hast Du zwei Login Dialoge!
2. Du hast das Design der MFC noch nicht ganz verstanden. Die Daten (also auch die datenverbindung) gehört in das Document. Der View zeigt die Daten an.
Alles was notwendig ist um die Datenverbindung zu öffnen (Logon) gehört damit auch in die OnOpen... Handler des Documentes!
-
Martin Richter schrieb:
1. In OnDraw/OnPaint solltest Du niemals weitere Dialoge anzeigen, oder gar eine Messageloop initieren. Dein Programm Wird reentrant.
Test: Lass Deinen Login Dialog anzeigen. Dann Verdecke Deine Applikation mit einem anderen Programm.
Nun hast Du zwei Login Dialoge!
2. Du hast das Design der MFC noch nicht ganz verstanden. Die Daten (also auch die datenverbindung) gehört in das Document. Der View zeigt die Daten an.
Alles was notwendig ist um die Datenverbindung zu öffnen (Logon) gehört damit auch in die OnOpen... Handler des Documentes!Hallo Martin,
du hast recht, ich versuche noch, die MFC zu verstehen. Habe zu Hause das Buch Inside Visual C++ 6.0, mit dem ich halt eben einfach ein paar Beispiele durcharbeite und auch versuche, mit eigenen Ideen zu kombinieren.
Dass OnDraw immer wieder aufgerufen wird, sobald das Fenster den Focus wiedererlangt, weiß ich. Aber daran habe ich in dem Moment leider nicht gedacht. Das mit der Abgrenzung Document und View werde ich mir nochmal genauer durchlesen. Gibt es ein empfehlenswertes MFC-Buch, das ich ergänzend zu dem o. g. Buch nutzen sollte?
Besten Dank für eure Antworten.
-
Also ich muss sagen, dass die aktuelle MSDN-Library doch alles sehr schön erläutert (Früher war das mal sehr viel schlimmer), sogar mit vielen Beispielen und alles schön ins detailliertere verlinkt.