Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Funktionen bei Textfeldern

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
16.01.2006, 22:12 Uhr
thomas67



Hi
Ich habe auf nem Formview ein Textfeld, in welches ich ein "Datum" eingeben will.
Für meinen eigenen Datums-Typ habe ich mir eine Funktion geschrieben, die beliebige Strings in ein Datum umwandelt (sofern möglich. Bsp. 23/3 macht es automatisch zum 23. März 06, genauso wie z.B. 230306)
Bei Focuserhalt merke ich mir die bisherige Variable zur Sicherheit in einer Extravariablen (evtl. unnötig).
Dann soll das Datum eingegeben werden, bzw. genauer: der String, der dann in ein Datum konvertiert wird.
Bei Drücken der Enter- oder der Tab- Taste soll der String in das Datum konvertiert und dieses dann im Textfeld wieder angezeigt werden.

Funktionen wie EnChange oder EnUpdate reagieren aber leider auf Tastendruck im Textfeld. Das ist Blödsinn, da das Datum ja z.B. nach dem ersten Zeichen noch nicht komplett ist

---> Wie mache ich das denn nun, den eingegeben String bei Enter oder Tab automatisch auszuwerten, ohne dabei auf KillFocus warten zu müssen?

Und Zusatz: Wie schaffe ich es, per Enter (und nicht nur per Tab) automatisch zum nächsten Control weiterzuspringen?

Dank im Voraus
Thomas
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.01.2006, 16:56 Uhr
mmc20
puss in boots


hi
da musst du dir selbst was basteln... ist aber nicht sooo schwer.

1. eigenes CEdit erstellen ( neue klasse von CEdit ableiten )
nennen wir es "XEdit"...
2. virtuelle funktion "PreTranslateMsg" hinzufügen
3. nachricht =EN_KILLFOCUS hinzufügen

in "PreTranslateMsg" reagierst du auf die tastendrücke/mausaktionen
und in "OnKillFocus" bearbeitest du deinen string.

ich hab das mal für nen zahlenfeld gebraucht, wo zb. doppelte minus gefiltert und kommas in punkte umgewandelt wurden.


C++:
/////////////////////////////////////////////////////////////////////////////
// Behandlungsroutinen für Nachrichten XEdit

BOOL XEdit::PreTranslateMessage(MSG* pMsg)
{
    if ( pMsg->message == WM_KEYDOWN ){
        switch ( pMsg->wParam ) {
        case VK_RETURN:
        case VK_DOWN:
            ((CDialog*)GetParent())->NextDlgCtrl();
            break;
        case VK_UP:
            ((CDialog*)GetParent())->PrevDlgCtrl();
            break;
        }
    }
    return CEdit::PreTranslateMessage(pMsg);
}

void XEdit::OnKillfocus()
{
    CString tmp = "";
    GetLine( 0, tmp.GetBuffer(16), 15);
    tmp.ReleaseBuffer();

    if ( tmp.IsEmpty() ) return;

    tmp.Replace(",",".");
    for ( int i = 0; i < tmp.GetLength(); i++ ) {
        if ( !IsDigit(tmp.GetAt(i)) ) {
            tmp.Delete( i, 1);
            i--;
        }
    }
    if ( tmp.Find( "-", 0) > 0 ) {
        tmp.Delete( tmp.Find( "-", 0), 1);
        tmp.Insert( 0, "-");
    }
    this->SetWindowText( tmp );
}

BOOL XEdit::IsDigit(char c)
{
    const CString digits = "0123456789.-";
    return (digits.Find( c, 0) >= 0);
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
17.01.2006, 22:46 Uhr
thomas67



Hmmmm
schon fast befürchtet....
Danke trotzdem

gibts ne Möglichkeit, das auch allein durch die Entertaste anzustossen, ohne den Focus zu verlassen, also ohne Killfocus?

und kann ich die Enter so verwenden, daß das zum nächsten Control springt?

Thomas

ach,... und OT: wie macht das eigentlich Java? Genauso umständlich?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.01.2006, 16:10 Uhr
mmc20
puss in boots


?... sorry, hätte meinen code wohl dokumentieren sollen...

"gibts ne Möglichkeit, das auch allein durch die Entertaste anzustossen, ohne den Focus zu verlassen, also ohne Killfocus?"

IMHO nicht

"und kann ich die Enter so verwenden, daß das zum nächsten Control springt?"


C++:
...
        case VK_RETURN: // <-- ENTER-Taste
        case VK_DOWN: // <-- Cursor-Runter-Taste
            ((CDialog*)GetParent())->NextDlgCtrl();
...


"...wie macht das eigentlich Java? Genauso umständlich?"

mit java arbeite ich nicht,... und was ist daran umständlich ? ok, wenn man das ganze nur für ein einziges feld bräuchte, dann ist es etwas viel code für eine so "simple" function.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: