UpdateData Problem



  • 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 😉


Anmelden zum Antworten