double Wert in Eingabefelder / Dialogfelder schreiben



  • Hallo,

    ich möchte in einzelne Eingabefelder double-Werte schreiben. Kenne leider nur die Befehle SetDlgItemInt, SetDlgItemText und UpdateData. Die Suche habe ich schon bemüht, es werden aber keine brauchbaren Ergebnisse angezeigt. Muss ich die double-Werte erst in Strings konvertieren und dann eintragen? Das wäre sehr lästig, da es mehrere Felder sind und die meisten auch wieder ausgelesen werden müssen und wieder als double weiter verarbeitet werden.
    Danke für eure Hilfe.



  • Wenn du UpdateData benutzt, dann ist das nicht nötig.
    Lege dir einfach eine Variable des entsprechenden Typs zu dem Editfeld an.
    Mit UpdateData(true) geht nun der Editfeld-Inhalt in die Variable, mit UpdateData(false) geht der Variableninhalt in das Editfeld.
    Anlegen tust die Variable im Ressourceneditor. Rechtsklick auf das Editfeld und dann Variable hinzufügen.
    Ansonsten kannst du auch beim CString mit Format Zahlen in Text umwandeln.



  • erstell im klassenassi membervariablen für die Eingabefelder.
    den typ der variable legst du mit double fest.

    danach sollte es mit dem zuweisen einer kommazahl (2.01) klappen
    m_dEdit1 = 2.01;

    mit SetDlgItemInt wirst du nie doublewerte angezeigt bekommen, da die MSDN folgendes dazu sagt.

    BOOL SetDlgItemInt(int nID,
        UINT uValue,// hier willst du double in unsigned int wandeln
        BOOL bSigned
    );
    

    und der double wert wirt dir verkürzt, alles was nach dem punkt kommt wird abgeschnitten. 😉

    LowFly



  • Mit UpdataData(FALSE) werden, aber doch alle Eingabefelder aktualisiert? Kann man nicht ein bestimmtes Feld ansprechen und es mit einem double-Wert füllen?

    Wie kann man eigentlich die angezeigten Stellen des double-Wertes im Eingabefeld begrenzen?



  • mach es über SetDlgItemText,
    schreib dir ne extra funktion an die du die doublewerte übergibst und dir diese in einen String wandelt & umgekehrt, diese kannst du via SetDlgItemText bzw GetDlgItemText anzeigen & auslesen.

    oder du must halt darauf achten das nur an das eine specielle Editfeld ein neuer wert übergeben wird.

    ne andere idee wäre noch die Editfelder in ne double array zu fassen
    double m_dEdit[10];
    & weist dann jedem Editfeld einen bestimmten platz in der Array zu
    DDX_Text(pDX, IDC_EDIT1, m_double[0]);
    ...
    m_double[0] = 1.01;
    UpdateData(FALSE);

    werden zwar alle adnere editfelder mit aktualisiert aber sie behalten den alten wert.



  • Gelegenheitsprogrammierer schrieb:

    Wie kann man eigentlich die angezeigten Stellen des double-Wertes im Eingabefeld begrenzen?

    also wenn du dem eingabefeld eine double-variable zuweist, wird das nicht zu begrenzen gehen.
    wenn du es als textfeld machst, kannst du damit

    CString tmp;
    double dVar = 1.234556;
    tmp.Format("%.3f", dVar); // 3 nachkomma-stellen
    

    formatieren. den wert dann nur noch zuweisen wie es LowFly gesagt hat (SetDlgItemText)



  • Mit UpdataData(FALSE) werden, aber doch alle Eingabefelder aktualisiert? Kann man nicht ein bestimmtes Feld ansprechen und es mit einem double-Wert füllen?

    Mann kann!. Du kannst statt UpdateData(...) auch einen einzelnen Wert holen/ zurückschreiben:

    double m_doublevariable	
    
    	CDataExchange exchange(this,FALSE);//bzw. TRUE
    	DDX_Text(&exchange,IDC_EDITFELD,m_doublevariable);
    

    Wie kann man eigentlich die angezeigten Stellen des double-Wertes im Eingabefeld begrenzen?

    Begrenzung der Anzeige eines double kenne ich auch nur über den „Umweg“ mit CString.

    Ich habe bisher höchstens mal:
    1. den Wertebereich begrenzt im DoDataExchange-Block:

    DDV_MinMaxDouble(pDX, m_doublevariable, 10, 999999);
    

    2. Anzahl aller Zeichen (inclusive Komma) begrenzt :

    //im DoDataExchange:
    DDX_Control(pDX, IDC_ EDITFELD, m_ editcontrol);
    //im InitDialog
    m_ editcontrol ->LimitText(anzahl_zeichen);
    

    Für den Rest hilft wohl nur Handarbeit z.B. im EnChange(...)

    Tester2


Log in to reply