Edit-Control Eingaben filtern...



  • Folgendes :
    Ich progge eine simple Win32-App, hab 4 Standard-Edit-Controls, von denen ich will, das sie nur bestimmte Zeichen als Eingabe zulassen.
    Ich probier jetzt schon bestimmt 2 Stunden herum, mit EN_UPDATE/CHANGE ists scheisse, weil ich ja den Text nach der Eingabe säubern muss und nicht schon bevor der Text im Control landet blockieren kann.
    Dann hab ich von "Subclassing" gehört und rumprobiert, aber ich scheitere schon daran den Window-Handle des Controls herauszufinden, und ein Funktionerendes Beispiel fand ich auch nicht.

    Hat nicht jemand nen Code-Schnipsel für dieses Problem?

    Thanks in advance...



  • Hi,

    vielleicht reicht ja schon die Behandlug der Notifikation EN_KILLFOCUS.
    Das heisst nachdem das Edit-Control den Eingabefocus verloren kannst
    Du die Eingabe checken.
    Ein Subclassing wäre dann nicht notwendig.

    Gruss d_A



  • Tutorial zu Subclassing: http://www.winapi.net/index.php?inhalt=s27

    Aber kannst du mit EN_UPDATE das nicht auch machen?

    This notification message is sent after the control has formatted the text, but before it displays the text.

    Es sollte doch möglich sein, den Text auszulesen (oder bekommt man da noch den alten Text?), ggf. zu ändern und dann neu zu setzen



  • Das Prob das ich hab ist ja, das es so sein soll:

    User soll eine Kennziffer in Texfeld eingeben, Format "RG####-??", d.h. die Kennziffern sehen immer so aus "RG1234-XY" oder "RG5555-AA". (# bedeutet Zahl und ? Buchstabe. )
    D.h wiederrum: gibt de User an Position 3 etwas anderes als eine Zahl ein, so soll die Engabe geblockt werden und ne MsgBox als "Sie haben sich vertippt" angezeigt werden. 😞 so wirds von mir verlangt, leider....



  • Und wo ist das Problem? Wobei es mich immer nervt, wenn das Format nach jedem Tastendruck geprüft wird, da man dann z.B. nicht einfach die Ziffern markieren und übertippen kann, da ja sonst zwischendurch ein ungültiges Format entsteht 😞



  • so, ich habs jetzt erstmal testweise so gemacht, tut auch. Was halt nur blöde ist, ist das ich jetzt noch den Cursor auf die alte Position zurücksetzen muss...

    case WM_COMMAND:
    
    			if (HIWORD(wParam) == EN_UPDATE)
    			{
    				switch (LOWORD(wParam))
    				{
    					case IDC_BC1:
    						if  (CancelUpdate)
    						{
    							CancelUpdate = 0;
    							SetDlgItemText(hDlg,(int)IDC_BC1,"test");
    
    						}
    						else
    						{
    							CancelUpdate = 1;
    						}
    						break;
    					case IDC_BC2:
    						break;
    					case IDC_BC3:
    						break;
    					case IDC_BC4:
    						break;
    				}
    			}
    

    hm, mit tastencodes blocken würds mir besser gefallen... so ists doch arg improvisiert 😞

    PS: @flenders, unsere Postings haben sich wohl im Zeitpunkt überschnitten...



  • Falls es jemanden interessieren sollte: so siehts jetzt aus. In ValidateInput kann ich jetzt jeweils das zuletzt eingegebene Zeichen überprüfen und gegebenenfalls löschen.

    case WM_COMMAND:
    	if (HIWORD(wParam) == EN_UPDATE)
    	{
    		if  (CancelUpdate && (LOWORD(wParam) == IDC_BC1  || LOWORD(wParam) == IDC_BC2  || LOWORD(wParam) == IDC_BC3  || LOWORD(wParam) == IDC_BC4 ) )
    		{
    
     			CancelUpdate = 0;
    			SendDlgItemMessage( hDlg, (int)(LOWORD(wParam)),EM_GETSEL,(unsigned int)&oldCursorPos, NULL);
    			GetDlgItemText( hDlg,int(LOWORD(wParam)), tmpString, 80);
    			ValidateInput(tmpString);
    
    			SetDlgItemText(hDlg,(int)(LOWORD(wParam)), tmpString);
    			SendDlgItemMessage( hDlg, (int)(LOWORD(wParam)),EM_SETSEL,oldCursorPos, oldCursorPos);
    
    		}
    		else
    		{
       			CancelUpdate = 1;
    		}
    	}
    


  • Nur als Hinweiß: über copy & paste kann auch mehr als ein Zeichen auf einmal eingefügt werden!
    Außerdem muss das zuletzt eingefügte Zeichen ja nicht unbedingt das letzte im String sein 😉



  • genaus das mein ich: die Lösung ist ziemlich...unbefriedigend. Trotzdem gehts indem ich einfach bei jeder Eingabe den kompletten String auf Gültigkeit überprüfe und lösche was nicht hingehört.


Anmelden zum Antworten