dialog für dateningabe in tabellarischer form



  • Hallo zusammen,

    welcher dialog in visual ist geeignet um mehrere Daten gleichzeitig einzulesen?
    Die Anzahl der Daten wird vorher in einem Eingabefeld abgefragt, ist also bekannt.

    Beispielsweise soll der Dialog folgende Form haben wenn man 4 Daten eingeben soll:
    1 1.23
    2 1.56
    3 0.95
    4 1.56

    Die fettgedruckten Zahlen sollen eingelesen werden. Ich will nicht für jeden eingegebenen Wert ein CEdit Element erzeugen da die Anzahl der Werte beliebig sein soll.
    Kennt jemand einen geeigneten Dialog? Mir ist zuerst CComboBox eingefallen. Da ich aber den Dialog selber erzeuge über Create sind mir die Stile nicht ganz bekannt für diesen Dialogtypen.

    Vielen Dank



  • Mit einer ComboBox kannst du einen Wert selektieren/eingeben, aber nicht 4. Was spricht denn gegen 4 Edits? Ist doch keine große Sache.

    P.S.: Übrigens suchst du ein Control, keinen Dialog... 😉



  • Hi Matze,

    kann man denn in eine CComBoBox auch mehrere Daten eingeben?Die Zahlen müssen ja nicht gleichzeitig eingegeben werden. Man kann sie auch hintereinander eingeben. Nur müsste sich die ComboBox mit den bereits eingetragenen Werten auffüllen.

    Ein CEdit ist ziemlich ungeeignet da die Anzahl der eingegebenen Zeilen variieren kann. Bei 20 Zahlen habe ich 20 Edits was relativ unübersichtlich wird.



  • Mach doch ein Edit, in das mehrere Zeilen eingegeben werden. Die kannst du ja später trennen.



  • hi Matze

    das habe ich jetzt auch gemacht. Jedoch stellt sich jetzt die Frage: Wie lese ich die Zahlen aus den verschiedenen Zeilen des CEdits aus? Ein erster Versuch von mir lautete:

    GetDlgItem(IDC_EDT_INT)->GetWindowText(m_strInt);
            int iLength = m_strInt.GetLength();
            ...
            if ((m_strInt[i] != _T(' ')) || (m_strInt[i] != ('\r\n')))
            {
                temp += m_strInt[i];
            }
            else
            {
                zahl[j] = wcstod(temp, NULL);
                temp = _T(" "); 
                j++;
            }
    
        i++;
        }while(i<iLength);
    

    Der Algorithmus überprüft also immer ob ein Leerzeichen oder ein Zeilenwechsel anwesend ist. i ist dabei der Laufindex des Strings. j soll die Zahlen in den unterschiedlichen zeilen des CEdits abspeichern. Jedoch erkennt dieser Algorithmus den Zeilensprung nicht. Hat jemand eine Idee woran das liegen kann.



  • ok hat gefunzt. Wenn jemand mal das gleiche problem hat, kann sich bei mir melden so dass ich dann den Code hier eintragen kann.



  • kayserili80 schrieb:

    ok hat gefunzt. Wenn jemand mal das gleiche problem hat, kann sich bei mir melden so dass ich dann den Code hier eintragen kann.

    Mach's doch, ohne das einer fragt. Hier landen sicher einige über die Suche, aber kaum jemand wird sich die Mühe machen, dich zu fragen. Ein Thread ist immer am Schönsten, wenn er mit einer Lösung abschließt. 🙂


  • Mod

    Die schwergewichtigere Alternative wäre natürlich ein Grid-Control gewesen...
    Vom UI Feeling ist das sicherlich schöner.



  • _matze schrieb:

    kayserili80 schrieb:

    ok hat gefunzt. Wenn jemand mal das gleiche problem hat, kann sich bei mir melden so dass ich dann den Code hier eintragen kann.

    Mach's doch, ohne das einer fragt. Hier landen sicher einige über die Suche, aber kaum jemand wird sich die Mühe machen, dich zu fragen. Ein Thread ist immer am Schönsten, wenn er mit einer Lösung abschließt. 🙂

    nur weil du es bist:-) also hier der Code:

    CString temp = _T(" ");
        GetDlgItem(IDC_EDT_INT)->GetWindowText(m_strInt);
        int iLength = m_strInt.GetLength();
        i = 0;
        int j = 0;
        do
        {   
            if (m_strInt[i] == _T('\r\n'))
            {
                m_strIntLine[j] = temp;
                temp = _T(" "); 
                AfxMessageBox(_T("NEUE ZAHL"));
                j++;
            }       
            else if((isdigit(m_strInt[i])) || (m_strInt[i] == _T('.')))
            {
                temp += m_strInt[i];
            } 
            else
            {
                AfxMessageBox(_T("Ohhhh Falsche Eingabe"));
                return;    
            }
            i++;
        }while(i<iLength);
    

    Die einzelnen Zeilen des CStrings m_strInt werden zeilenweise in der Variablen
    m_strIntPart abgespeichert, welche wiederum ein CStringarray sind .zur sicherheit wird abgefragt ob es sich bei jedem einzelnen Zeichen um eine Zahl oder ein Punkt handelt damit man sichergeht dass keine Buchstaben eingelesen werden. Später im Programm wandele ich dann diese m_strIntLine[j] in einzelne Zahlen um. Das geht mit der Funktion _wtof().


Anmelden zum Antworten