UpdateData Problem
-
Btw, bevor du irgendwelche Daten updaten kannst, mußt du den Dialog erstmal anstarten (entweder per doModal() oder per Create(), je nachdem ob du einen modalen oder nichtmodalen Dialog brauchst.
-
Die Funktion "SetWindowText" oder "SetDlgItemText" sind aber richtig.
Du brauchst nur die ID der entsprechenden Textelemente, die Du aus der Ressourcendatei bekommst, dann schreibst Du z.B.:dlg.SetDlgItemText(IDC_MYRESID,dlg.m_Message);
-
also der dialog wird schon früher aufgerufen mit DoModal() und die funktion mit der ich probleme habe wird über eine andere funktion, die ich über einen button aufrufen...mehrmals aufgerufen um die Werte die angezeigt werden sollen zu aktualisieren
und joah ich brauche jetzt irgendein update und dann versuche ich das einfach mal mit
dlg.SetDlgItemText(IDC_MYRESID,dlg.m_Message);
Vllt. ist das ja jetzt ein bisschen verständlicher !!
-
Ellinas schrieb:
Also ich habe ein problem und zwar will ich in dieser funktion ein UpdateData drin haben:
void PrintCPS(LPCSTR Tag, float& CPS) { clientclass dlg; wsprintf(szTemp,"%sCPS %12.02f KPS: %8.02f MPS: %4.02f ", Tag, CPS, CPS / 1024, (CPS / 1024) / 1024); dlg.m_Message = szTemp; //Hier soll UpdateData stehen ... }
Dir ist klar, daß du hier eine lokale Variable namens 'dlg' hast? Und die wurde (wenn sich dahinter überhaupt ein Dialog versteckt) nicht per DoModal() gestartet.
-
Wenn der Code-Schnippsel der ganze Code ist, dann hat "CStoll (off)" recht.
-
sorry jetzt weiß ich wirklich nicht was du meinst
also falls du denkst das das der gesamte quelltext ist liegst du falsch...ich habe lediglich die klasse eine variable zugewiesen...und joah ich weiß nicht vllt. hast du ja mein post der davor kam nicht gelesen....!!!
Aufjedenfall denke ich das ich vor dem name der Funktion die Classenbezeichnung reinbringen muss...muss mich nur noch schlau machen wie !!!
-
Der Dialog muß aber mit dlg.DoModal() angezeigt werden. Diese Code-Zeile ist nicht im Code-Schnippsel vorhanden, ist sie im Original-Code vorhanden?
-
OK, dann nochmal langsam: Du hast eine Dialog-Klasse (nennen wir sie mal CMyDlg) und ein Objekt CMyDlg dlg, richtig?
Dieses Objekt wurde per dlg.DoModal() gestartet und ruft jetzt aus einer Methode OnButton1() die globale Funktion PrintCPS() auf, immer noch richtig?Jetzt kommt das Verständnisproblem: PrintCPS() hat keinen Zugriff auf die Variablen einer anderen Funktion, also kennt sie pauschal das obige Objekt 'dlg' überhaupt nicht. Aber PrintCPS() hat eine lokale Variable namens dlg, die außer dem Namen überhapt nicht mit deinem Dialog zu tun hat - und an diese Variable werden alle deine Aufrufe wie dlg.UpdateData() oder dlg.SetItemText() geschickt.
-
Also gut ich habe es versucht zu verhindern aber ich komm nicht einfach drüber weg :
also es beginnt mit einem Willkommensdialog...ganz am anfang !!!So in dieser klasse (vom willkommensbildschirm) gibt es ein button mit folgender funktion !:
void CWillkommenclassDlg::OnButtonclient() { // TODO: Add your control notification handler code here clientclass dlg; dlg.DoModal(); }
Dann kommt ein neuer Dialog...auf diesem Dialog gibt es ein button bei betätigung des buttons...wird eine funktion aufgerufen....diese funktion läuft bis zu einem bestimmt prozess...und während diesem prozess ruft er öfters diese funktion auf !!:
void PrintCPS(LPCSTR Tag, float& CPS) { clientclass dlg; wsprintf(szTemp,"%sCPS %12.02f KPS: %8.02f MPS: %4.02f ", Tag, CPS, CPS / 1024, (CPS / 1024) / 1024); dlg.m_Message = szTemp; //fehlt IRGENDEIN Update while (PeekMessage(&msg,m_hWnd,0,0,PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } }
-
Noch ein letztes Mal: Du hast hier ZWEI verschiedene Objekte mit dem Namen 'dlg' - das erste wurde in der Methode CWillkomensdialog::OnButtonclient() angelegt und ordnungsgemäß gestartet, das zweite wird in der Funktion PrintCPS() angelegt und nicht initialisiert.
Du müsstest deiner Funktion einen Pointer oder eine Referenz auf den aktiven Dialog mitgeben, damit du dorthin etwas zurückgeben kannst:
void PrintCPS(clientclass& dlg,LPCSTR Tag,float CPS) { //hier KEIN lokales clientclass-Objekt dlg.m_Message=Tag; dld.UpdateData(); } void clientclass::OnButton1() { PrintCPS(&this,"Dies ist eine Test",0.1); }
(oder du packst die Funktion IN deine clientclass)
-
also die funktion ist IN meiner Clientclass...
und joah die buttonfunktion OnButtonClient...ist in einer anderen klasse
-
dlg müsste global sein..
-
also dlg...habe ich in der clientclass ...nur ein mal deklariert...und auch nur in der funktion...
und einmal in der anderen klasse von der aus der dialog aufgerufen wurde... !
-
Ellinas schrieb:
also die funktion ist IN meiner Clientclass...
Wenn das eine Member-Funktion des Dialogs ist, geht das sogar noch einfacher - dann hat die nämlich vollen und direkten Zugang zu dessen anderen Membern:
void clientclass::PrintCPS(LPCSTR Tag,float CPS) { m_Message = Tag; UpdateData(); ... }
(wenn du es unbedingt explizit aufschreiben willst, "this->UpdateData();" bringt das selbe Ergebnis)
-
oh dann habe ich dich falsch verstanden...und ich habe mich falsch ausgedrückt diese funktion ist keine member funktion !!
-
clientclass dlg erzeugt nicht den selben Dialog, es muß entweder ein Verweis mitgegeben werden oder dlg global gehalten werden (finde ich am besten, auch wenn es nicht ganz C++ konform ist)
-
Ja, was denn nun, entscheide dich mal
(und das beste wäre es wirklich, die Funktion zu einem Member der Klasse zu machen - oder willst du sie auch noch in einem anderen Zusammenhang verwenden?Wenn du wirklich eine globale Funktion brauchst, mußt du ihr auf irgendeinem Weg die Adresse des existierenden clientclass-Objektes übergeben, damit sie darauf zugreifen kann. Das geht entweder per Parameter (siehe mein Beispiel etwas weiter oben) oder indem du dieses Objekt global anlegst:
clientclass theDlg; void CWillkommensdialog::OnButtonclient() { theDlg.DoModal(); } void PrintCPS(... { theDlg.m_Member="Test"; theDlg.IpdateData(); ... }
(ich bevorzuge die Version als Member-Funktion (und im Notfall die Übergabe als Parameter))
-
Eine Member-Variable ist doch auch "global", im Sinne der Speicherverwaltung. Natürlich ist es besser eine Member-Variable zu erstellen als ein globales Objekt. Aber es ging hierbei das Problem, daß gedacht wurde das Objekt "clientclass" würde immer das selbe Objekt erstellen; also man könnte durch einen neuen Dialog auf den anderen Dialog der "clientclass"-Klasse zugreifen. So habe ich das Problem verstanden.
-
also aber wie mache ich denn daraus eine member funktion ???
Wenn ich das gemacht habe dann ist das überhaupt kein problem mehr !!
-
Ellinas schrieb:
also aber wie mache ich denn daraus eine member funktion ???
Schritt 1: Du ergänzt in der Definition der Klasse "clientclass" (btw. ein *** Name) die Zeile "void PrintCPS(LPCSTR,float);"
Schritt 2: Du änderst das "void PrintCPS(...)" bei deiner Funktionsdefinition um in "void clientclass::PrintCPS(...)"PS @RR: Nein, eine Membervariable ist nicht global, sondern immer lokal bezüglich des enthaltenen Objektes