kein Leerzeichen im Editfeld möglich

sTEk

Erfahrenes Mitglied
Ich erstelle Editfelder der Klasse CMyEdit (abgeleitet von CEdit), um bestimmte Felder einer Liste zu verändern.

Leider ist es mir nicht möglich, in das erstellte Editfeld Leerzeichen zu schreiben. Das Leerzeichen selbst (VK_SPACE) kommt an, das habe ich per PreTranslateMessage getestet - nur leider wird es nicht in das Geschriebene übernommen.
Das Editfeld selbst erstelle ich mit folgendermaßen:
C++:
        m_pedit = new CMyEdit;
        DWORD dwStyle = WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|
                            WS_TABSTOP|WS_BORDER|ES_LEFT|ES_AUTOHSCROLL; 
//Koordinaten des Listenfeldes. damit Editfeld genau dort erscheint
        CRect rect;
        GetSubItemRect(row,col,LVIR_LABEL,rect);
 
        m_pedit->Create(dwStyle,rect,this,IDC_Edit);
        m_pedit->ShowWindow(SW_SHOW);
//Text des Listenfeldes ins Editfeld setzen (klappt auch mit Leerzeichen!)
        m_pedit->SetWindowText(sztext);
        m_pedit->SetSel(0,-1);
        m_pedit->SetFocus();
Hat jemand eine Ahnung woran das liegen könnte?
 
Zuletzt bearbeitet von einem Moderator:
Keine Ahnung, aber ich weiss, wenn man den Typ des Editfeldes auf "Nummer" stellt kann man keine Leerzeichen eingeben. Vielleicht suchst du mal nach dem Parameter der es auf Text stellt oder "Nummer" ausstellt.

Ich hoffe das hilft Dir weiter.
 
Falls es das von SunnyBunny nicht ist, dann brauchen wir mehr Input.

Was genau überlädt die CMyEdit von CEdit? Die WindowProc?

Poste am besten den Inhalt falls vorhanden der OnKeyDown/OnKeyUp/PreTranslateMessage-Handler und der WindowProc von CMyEdit.
 
SunnyBunny's Tipp hatte ich erst auch in Verdacht, aber das sollte mit den Styles, die ich festlege ausgeklammert sein. ;)

Zum genauen Einsatz des Editfeldes:
Ich habe eine Liste, deren Inhalt ich mittels dieses Edit-Feldes verändere. Dazu wird das Edit-Feld jedes mal genau im zu bearbeitenden Feld erzeugt. Dabei sind verschiedene Eingabemöglichkeiten notwendig, bspw. Hexadezimal, nur int, nur real, Reihenfolgen mit bestimmten Trennzeichen oder Text allgemein. Deswegen habe ich auch die PreTranslateMessage, in der je nach erforderlichem Edit-Typ bestimmte Zeichen gecancelt oder gewandelt werden (zur benutzerfreundlicheren Eingabe, bspw. wird ein Komma automatisch zum Punkt) oder aber im Falle von RETURN bei Nichteinhaltung bestimmter Grenzen eine Fehlermeldung ausgegeben wird. Im Falle der Texteingabe wird jedoch direkt "durchgewunken", also die switch-Anweisungen reichen durch (m_Edittyp = 5).
Gut, hier mal meine Überladungen:
C++:
void CMyEdit::OnChange() 
{
//hier prüfe ich bestimmte Wertigkeiten des Eingabefeldes (wenn nur Nummern eigegeben werden dürfen)
// das ist aber Abhängig von dem Inhalt einer bestimmten Variable
    switch (m_Edittyp) {
    case 0:    ...
    case 1:    ...
    }
}

BOOL CMyEdit::PreTranslateMessage(MSG* pMsg) 
{
    CString        sztext,buffer;
    int            Rzahl;
    GetWindowText(sztext);

//Wandlung von , in .
switch(m_Edittyp)
{
     case 1:
        if (pMsg->wParam == ',')
            pMsg->wParam = '.';
        break;
    case 4:
        if (pMsg->wParam == ',' || pMsg->wParam == '.' || pMsg->wParam == '|' ||
            pMsg->wParam == '-' || pMsg->wParam == '_' || pMsg->wParam == '<' ||
            pMsg->wParam == '>' || pMsg->wParam == ';' || pMsg->wParam == '+' ||
            pMsg->wParam == '*' || pMsg->wParam == '^' || pMsg->wParam == ':' ||
            pMsg->wParam == '/' || pMsg->wParam == '#' || pMsg->wParam == ' ')
            pMsg->wParam = '/';
        break;

    case 3:
        if (pMsg->wParam == VK_RETURN) {
        Rzahl = atoi(sztext);
        if (Rzahl<m_MinWert1 || (Rzahl >m_MaxWert1 && Rzahl<m_MinWert2) ||                       Rzahl>m_MaxWert2) {
            sztext.LoadString(IDS_Fehlermeldung_2);
            buffer.Format(" %i ",m_MinWert1);
            sztext += buffer;
            buffer.LoadString(IDS_Fehlermeldung_3);
            sztext += buffer;
            buffer.Format(" %i ",m_MaxWert1);
            sztext += buffer;
            buffer.LoadString(IDS_Fehlermeldung_5);
            sztext += buffer;
            buffer.Format(" %i ",m_MinWert2);
            sztext += buffer;
            buffer.LoadString(IDS_Fehlermeldung_3);
            sztext += buffer;
            buffer.Format(" %i ",m_MaxWert2);
            sztext += buffer;
            buffer.LoadString(IDS_Fehlermeldung_4);
            sztext += buffer;
        
            AfxMessageBox(sztext);
            m_Fehler=TRUE;
            this->SetFocus();
            pMsg->wParam = NULL;
        }
        else
            m_Fehler = FALSE;
        }
    
    default:
    break;
}

//wenn eingegebene Zahl nicht den Spezifizierungen entspricht,
// wird RETURN nicht akzeptiert
    if (pMsg->wParam == VK_RETURN && m_Fehler == TRUE)
        pMsg->wParam = NULL;

    return CEdit::PreTranslateMessage(pMsg);
                
}

void CMyEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
    switch (m_Edittyp) {

        case 0:    //normales Zahlen-Edit int
        case 3:
            switch (nChar) {
                case '0':    case '1':    case '2':    case '3':
                case '4':    case '5':    case '6':    case '7':
                case '8':    case '9':    case VK_BACK:
                    break;
                default:
                    MessageBeep(0);
                    return;
                    }
        break;

        case 1:    //normales Zahlen-Edit float

            switch (nChar) {
                case '0':    case '1':    case '2':    case '3':
                case '4':    case '5':    case '6':    case '7':
                case '8':    case '9':    case VK_BACK:
                    break;
            
                case '.':
                    if (m_Punkt) {                                // wenn schon ein Punkt eingegeben wurde
                        MessageBeep(0);
                        return;
                    }
                    m_Punkt = TRUE;
                    LimitText(GetLimitText()+7);                // ein Zeichen mehr durch Punkt + 6 Nachkommastellen
                    break;
                case '-':
                    if (m_Minus) {                                // wenn schon ein Punkt eingegeben wurde
                        MessageBeep(0);
                        return;
                    }
                    LimitText(GetLimitText()+1);                // ein Zeichen mehr durch Minus
                    m_Minus = TRUE;
                    break;
               default:
                    MessageBeep(0);
                    return;
                    }
        break;

        case 2:    // Hex-Edit
            switch (nChar) {
            case 'a':    case 'A':    case 'b':    case 'B':
            case 'c':    case 'C':    case 'd':    case 'D':
            case 'e':    case 'E':    case 'f':    case 'F':
            case '0':    case '1':    case '2':    case '3':
            case '4':    case '5':    case '6':    case '7':
            case '8':    case '9':    case VK_BACK:
                break;
            default:
                MessageBeep(0);
                return;
                }
        
        case 4:
            switch(nChar) {
                case '0':    case '1':    case '2':    case '3':
                case '4':    case '5':    case '6':    case '7':
                case '8':    case '9':    case VK_BACK:
                    if (m_Punktzaehler<=m_MaxWert1) {
                        CString buffer;
                        buffer.Format("%c",nChar);
                        m_Text += buffer;
                    }
                    else {
                        MessageBeep(0);
                        return;
                    }
                    break;
                case '/':
                    if (m_Punktzaehler>=m_MaxWert1-1) {        // wenn schon ein Punkt eingegeben wurde
                        MessageBeep(0);
                        return;
                    }
                    m_Punktzaehler++;
                    m_Punkt = TRUE;
                    break;
                default:
                    break;
            }
    }
    CEdit::OnChar(nChar, nRepCnt, nFlags);
}
 
Zuletzt bearbeitet von einem Moderator:
Also Space wird wohl nicht direkt verhunzt, aber:

Dein PreTranslateMessage prüft überhaupt nicht den Typ der Nachricht? Da sollte ja doch wohl noch eine Prüfung auf WM_KEYDOWN rein? Sonst zerpflückst du ja den wParam von allen Nachrichten, die da durch kommen.

Aber bei edittyp = 5 sehe ich direkt auch kein Problem, dass da reinspielen könnte. Du sagst, in PreTranslateMessage wird das Space noch gesichtet. Hast du mit dem Debugger nachverfolgt, ob es auch bis zum CEdit::preTranslateMessage durchkommt?
Wenn ja, dann müsste es eigentlich auch bei OnChar wieder reinkommen.
Wenn nicht, dann gibt es da irgendwo noch ein PreTranslateMessage (vom Parent-Dialog?), das da evtl. das Space klaut.
 
Endurion, du bist ein Engel! :)
Als erstes hab ich mir den Tipp mit dem WM_KEYDOWN zu herzen genommen - ist ja auch wirklich günstiger.

Ins CMyEdit kam das VK_Space noch durch, aber icht mehr im OnChar an.
Dank Deiner Bemerkung
Wenn nicht, dann gibt es da irgendwo noch ein PreTranslateMessage (vom Parent-Dialog?), das da evtl. das Space klaut.
ist mir doch glatt eingefallen, dass ich für das Starten der Editierung der Felder in der Liste neben dem Mausklick auch Space eingebaut habe - und da hatte ich gestümpert und im Falle des offenen Editfeldes das VK_SPACE nicht mehr weitergegeben. Manchmal ist man halt einfach "betriebsblind"...
Danke noch mal!
 
Zurück