"-" im Eigabefeld nach UpdateData(TRUE) zulassen?



  • Hi Leute,

    habe folgendes Problem:

    Ich habe in einer Dialoganwendung ein Eingabefeld(Membervariable vom Type Double) in dem ich Doublewertzahlen eingeben kann. Nun fange ich mit der Abfrage,

    if (!UpdateData(TRUE))
    {
    return;
    }

    die Eingabe von Buchstaben ab.
    Mein Problem ist aber das er auch das Minuszeichen als Buchstabe erkennt.
    Wie kann ich das realisieren das ich alle Zahlen einschliesslich dem Minuszeichen eingeben kann(Mit der obigen abfrage)?

    Danke für eure Hilfe!



  • Wie sieht denn der entsprechende Code in DoDataExchange aus? Normalerweise sollte ein '-' am Anfang akzeptiert werden und in deine double Variable übernommen werden.
    Steht vielleicht ein DDV_xxx dahinter, das negative Zahlen verbietet?



  • Das ist richtig er akzeptiert ein "-" vor den Zahlen aber da ich auf ein OnChange Nachricht im Eingabefeld reagiere um die Daten sofort in eine .ini Datei zuschreiben meckert er wenn ich im Eingabefeld nichts stehen habe(also keine Zahl) und als erstes das "-" Zeichen eingebe?

    Genau diesen effekt will ich nicht!!!

    Thx



  • Hi ich bins nochmal...

    Kann ich nicht über DDV_ im Sagen das er das "-" zeichen zulassen soll?



  • Original erstellt von Iceman999:
    Das ist richtig er akzeptiert ein "-" vor den Zahlen aber da ich auf ein OnChange Nachricht im Eingabefeld reagiere um die Daten sofort in eine .ini Datei zuschreiben meckert er wenn ich im Eingabefeld nichts stehen habe(also keine Zahl) und als erstes das "-" Zeichen eingebe?

    Dann mach es besser ohne UpdateData und lies die Zahl direkt mit GetDlgItemText und strtod 😉
    Über die DDV Funktionen legst du eigentlich nur die Wertebereiche fest, sozusagen nur Abbruchbedingungen. Nachträglich etwas zu erlauben geht nicht.



  • Besteht da wirklich keine andere möglichkeit. Mein Proggy ist eigentlich schon fertig und nicht unbedigt klein und die änderungen wurden den rahmen spregen.

    Hat jemand viellciht eine Idee?

    C u

    Thx



  • Achsooo, er motzt, wenn nur ein '-' im Textfeld steht.... Jetzt verstehe ich.
    Dann schreib doch einfach ganz frech dein eigenes UpdateData (Das Original steht in mfc/src/Wincore.cpp). Ich habe noch einen weiteren Parameter eingefügt, mit dem Du festlegen kannst, ob Du eine Meldung sehen willst.

    //irgendwo in der *.h
    class CMeinDialog
    {
    //...
    BOOL UpdateData(BOOL bSaveAndValidate = TRUE, BOOL bReportError = TRUE);
    //...
    };
    
    // irgendwo in der *.cpp
    BOOL CMeinDialog::UpdateData(BOOL bSaveAndValidate, BOOL bReportError)
    {
        ASSERT(::IsWindow(m_hWnd)); // calling UpdateData before DoModal?
    
        CDataExchange dx(this, bSaveAndValidate);
    
        // prevent control notifications from being dispatched during UpdateData
        _AFX_THREAD_STATE* pThreadState = AfxGetThreadState();
        HWND hWndOldLockout = pThreadState->m_hLockoutNotifyWindow;
        ASSERT(hWndOldLockout != m_hWnd);   // must not recurse
        pThreadState->m_hLockoutNotifyWindow = m_hWnd;
    
        BOOL bOK = FALSE;       // assume failure
        TRY
        {
            DoDataExchange(&dx);
            bOK = TRUE;         // it worked
        }
        CATCH(CUserException, e)
        {
            // validation failed - user already alerted, fall through
            ASSERT(!bOK);
            // Note: DELETE_EXCEPTION_(e) not required
        }
        AND_CATCH_ALL(e)
        {
            if(bReportError)
            {
                // validation failed due to OOM or other resource failure
                e->ReportError(MB_ICONEXCLAMATION, AFX_IDP_INTERNAL_FAILURE);
            }
            ASSERT(!bOK);
            DELETE_EXCEPTION(e);
        }
        END_CATCH_ALL
    
        pThreadState->m_hLockoutNotifyWindow = hWndOldLockout;
        return bOK;
    }
    

    Eine Fehlermeldung gibt's dann nur, wenn bReportError auf TRUE gesetzt ist 😉
    (Du solltest in dem Fall vielleicht noch per SetDlgItemText o.Ä. dem Benutzer mitteilen, dass irgendwo ein falscher Wert steht, denn es gibt ja keine Meldung mehr)
    Wichtig: UpdateData ist nicht virtual, du musst die veränderte Version selber aufrufen (machst du ja eh, wie ich das verstanden habe 😉 ). Der Rest von MFC wird weiterhin das Original verwenden.


Anmelden zum Antworten