afx_msg void Funktion zugreifen Fehlermeldung
-
Hallo,
ich hab folgende Fehlermeldung:
...\Visual Studio Projects\SensiCam\IRO_Setup.cpp(106): error C2248: 'CMainWindow::OnImageStartmeasurement' : cannot access protected member declared in class 'CMainWindow'der Code der es produziert ist:
mainwindow.OnImageStartmeasurement();wobei mainwindow in einem globalen Header(nicht schön, muss aber mal sein) deklariert ist:
PUBLIC CMainWindow mainwindow;Hintergrund ist folgender: Ich hab eine Anwendung mit Menüleiste und ein paar Dialoge, in die man Eingaben machen kann.
Wenn der Nutzer einen Menüpunkt aufruft und vorher keine Eingaben in einen bestimmten Dialog gemacht hat, soll dieser erst noch aufgehen und wenn ich mit okay aus dem Dialog gehe soll gleich die Aufrufende Funktion nochmal aufgerufen werden.
Damit der Nutzer nicht nochmal extra den Menüpunkt aufrufen muss.
Aber irgendiwe gelingt es mir nicht bzw. schein ich da falsch ranzugehen.Bin für jeden Tip dankbar.
Dies gesamte Funtrion für OnBnClickedOk() in dem Dialog:
void CIRO_Setup::OnBnClickedOk() { CString sendhelp; char chelp[17]; //Eingaben vom Dialog holen und an IRO senden // Abfragen zur Sicherung, das in den Eingaben auch was steht,mindestens in Basicdelay UpdateData(true); if(m_iIROdelay != 0 && m_iIROdelaySteps != 0 && m_iIROwidth !=0 && m_iIROgain !=0 && m_iIROAnzSpect !=0) { // ... fehlen ein paar Sachen, hab ich gelöscht damit es nicht zuviel wird if(bSTARTtoIROtoSTART == TRUE) { // zurücksetzen der Varibalen, die mir zeigt das ich aus dem Menü komme und nicht direkt den Dialog genutz habe bSTARTtoIROtoSTART == FALSE; // zurück in Menüfunktion mainwindow.OnImageStartmeasurement(); } else { OnOK(); } } else { AfxMessageBox("Die eingegeben Daten sind für eine Messung nicht ausreichend!"); }Menüfunktion:
void CMainWindow::OnImageStartmeasurement() { if(bSerie) { Cam->StopSeq(); // stop sequenz wenn eine laufen sollte bSerie = FALSE; bNewPic = FALSE; } if(iBasicDelay != 0 || iBasicDelaySteps != 0 || iAnzSpect != 0) { // fheleen ein paar Sachen wegen der Übersichtlichkeit Cam->SetForGet(); // prepare for getting one image Cam->GetPicture(); // get image from camera Cam->ResetForGet(); // reset csensi-object if(bChangeCam) bNewPic = TRUE; else bNewPic = FALSE; this->Invalidate(FALSE); // trigger the paint // Ausgabe der Einzelbilder // Speichern der Bilder als Ascii, Mittelwert bilden oder aufsummieren // Abspeichern der Gesamten Messung als Ascii } else { bSTARTtoIROtoSTART = TRUE; iro_setup.DoModal(); } }
-
Nachrichtenhandler sind in der Regel mit protected deklariert, andere Klassen haben darauf keinen Zugriff (es sei denn, sie sind als friend deklariert).
Alternativ kannst Du aber dem Hauptfenster die Nachricht schicken, die den Handler dann auslöst. Oder Du fügst dem Hauptfenster eine öffentliche Funktion hinzu, die dann selbst OnImageStartmeasurement(); aufruft.
-
Danke schon mal, wie macht man das mit dem friend deklarieren?
-
ela schrieb:
Danke schon mal, wie macht man das mit dem friend deklarieren?
Lass das sein.
Warum zeigst du in OnImageStartmeasurement nicht zuerst den Dialog (falls nötig), und machst dann einfach normal weiter?
-
Naja zum einen weil ich es dem Nutzer einfach machen wollte, weil der ja auch gern zur Faulheit neigt und zum anderen, weil ich gern gewusst hätte ob es geht und wenn ja wie?
-
ela schrieb:
Naja zum einen weil ich es dem Nutzer einfach machen wollte, weil der ja auch gern zur Faulheit neigt
Du hast meine Frage nicht verstanden.
Du brauchst die Funktion nicht nochmal aufzurufen, wenn du das, was die Funktion eigentlich tun soll, hinter den Code schreibst, der den Dialog anzeigt, anstatt nur entweder das eine oder das andere zu tun.
Deine Funktion sieht jetzt so aus:
Wenn (Dialog nicht angezeigt werden muss) Tu Was Sonst Zeig Dialog anDamit hast du das Wiederholungsproblem.
Mach es doch so:
Wenn (Dialog angezeigt werden muss) Zeig Dialog an Tu wasDann brauchst du gar keine Wiederholung.
-
Naja, ich weiss was du meinst,
aber ich will ja, das wenn der Dialog angezeigt wurde, gleich die aufrufende Funktion ausgeführt wird, weil wenn ich im Dialog okay klicke ich "nur" in das Hauptfenster zurückkomme. Oder?

-
okay, hat sich erledit, ich hab es gedreht wie MFK gesagt hat und ruf nach der Rückkehr einfach die Funktion nochmal auf.
Das funzt.
Vielen Dank

-
ela schrieb:
weil wenn ich im Dialog okay klicke ich "nur" in das Hauptfenster zurückkomme. Oder?
Nein. Wenn du OK (oder Abbrechen) klickst, geht es hinter DoModal weiter.
ela schrieb:
okay, hat sich erledit, ich hab es gedreht wie MFK gesagt hat und ruf nach der Rückkehr einfach die Funktion nochmal auf.
Ist - wie gesagt - nicht notwendig.