Wie kann ich eine Zahl einlesen ohne UpdateData() ?



  • Hallo

    ich habe ein Dialogfeld gebaut und über einen Timer wird nun die Uhrzeit
    eingeblendet.
    Es wird UpdateData (false) benutzt.
    Nun ist es so das ich aber auch ein Eingabefeld für den Benutzer habe.
    Wie kann ich verhindern, dass es ständig mit der Defaultanzeige aktualisiert wird, der Benutzer soll ja erst mal was eingeben und dann würde ein UpdateData(true) folgen (über einen Button) 🙂
    Wie löst ihr dieses Problem (vieleicht Control Variable ?..aber wie)

    Viele Grüße
    Sven



  • Du darfst den Machanismus von "UpdateData" dazu nicht verwenden! (Ich Rate eigentlich immer davon ab)...
    Weise Deinem TextBox/Label eine Control-Variable zu und setze hier direkt den Text mittels
    m_Uhrezeit.SetWindowText



  • und was muss ich nehmen wenn ich ein Kontrollkästchen setzen möchte
    (den Hacken setzen) m_checkbox.SetWindow(true) geht leider nicht 😞


  • Administrator

    @Jochen, UpdateData ist schon gut, man muss nur ein wenig vorsichtig damit umgehen, da es immer alles speichert, bzw. wieder rauflädt.

    @Sveniemenie, SetCheck(BST_CHECKED) oder SetCheck(BST_UNCHECKED).
    Aber am sinnvollsten wäre es wohl, dass bei der Nachricht WM_TIMER über SetWindowsText zu machen und der Rest immer noch mit UpdateData. Die Mischung machts ^^

    Grüssli



  • Danke schon mal bis hierher.
    Einen habe ich noch 🙂 :

    Wie kann ich eine Zahl anzeigen?


  • Administrator

    2 Möglichkeiten:

    - Du fügst deinem Control eine Membervarialbe des Typs int, float oder was für eine Zahl auch immer du willst, dazu. Per UpdateData kannst die Zahl dann raufladen, bzw. in die Variable speichern.

    - Du machst es per SetWindowText und zwar so:

    CString str;
    str.Format(_T("%d"), 30432452);
    m_DeinEditOderWasAuchImmer.SetWindowText(str);
    

    Problematisch wird es allerdings dann, wenn du die Zahl holen willst als Zahl. Gibt zwar funktionen wie atoi, welche String-Werte in Zahlen umwandeln, aber ich glaube da ist der andere Weg effektiver.

    zu CString::Format -> CStringT::Format in der MSDN schauen!

    Grüssli



  • Ich bezweifle das updatedata schnelloer ist als wenn man
    GetWindowText aufruft und den String in eine Zahl wandelt.

    Man braucht dafür nichtmal eine Controlvariable was ja bei vielen Controls aufwendig ist.
    Es reicht die ID zu wissen.

    GetDlgItem(ID_)->SetWindowText
    GetDlgItem(ID_)->GetWindowText


  • Administrator

    Was habt ihr bloss alle gegen UpdateData? Wenn man einzelne Werte verändert, ok, dann ist es vielleicht nicht sehr sinnvoll. Aber wenn man etwas durcharbeiten muss, z.b. wenn eine Selektion geändert wurde, man zig Edits updaten muss, dann ist wohl UpdateData wirklich angebracht. Zudem kann man in DoDataExchange ja auch noch eine Switch-Anweisung (oder if) einbauen. Dann kann man im voraus definieren, was geupdatet werden soll und dann UpdateData aufrufen. Und nicht zuletzt, ich glaube nicht, dass es im Sinne der MFC ist, UpdateData und die Membervariablen der Dialogklasse ganz zu umgehen.

    Grüssli


Anmelden zum Antworten