Dafür musst du eine eigene SLE Klasse bauen, die die Anzahl der enthaltenen Zeichen (EditBuffer()) überwacht.
Ich habe Beispiele in der Wissensbasis für abgeleitete Klassen, die verschiedene Aktionen machen:
viewtopic.php?f=16&t=499&p=57935
häufig sieht man Code bei der eine Funktion dem Keyboard-Slot zugewiesen wird.
Dieser Codeblock wird erst nach der Standard Verarbeitung ausgeführt, somit häufig zu spät.
Volle Eingabe Kontrolle geht nur in abgeleiteten Klassen !
Wenn man z.B. die Eingabe von einzelnen Zeichen verhindert will, geht das nur über eine abgeleitete Klasse:
Code: Alles auswählen
METHOD MySLE:keyboard( nKey )
// alle Keys die "normal" verarbeitet werden sollen, müssen an die SUPER Klasse (XbpSLE) weitergegeben werden.
// aber wenn man einzelne Tasten blockieren will, kann man die einfach nicht weitergeben ebenso ab einer gewissen Länge:
if nKey = 32 // Blanks immer blocken
* einfach nicht weitergeben, blockiert die Taste
else
// weitergeben für Standardverhalten
::xbpSLE:keyboard( nKey )
endif
RETURN self
wenn man nach der Eingabe den String umwandeln will (z.B. Upper oder sonstige Formatierung) ist
KillInputFocus sowohl als Methode als auch als Codeblock möglich, da die Standardbehandlung schon vorbei ist.
ABER Achtung, man hat das SLE schon verlassen, eine Validierung ist zwar möglich, und man kann auch mit
SetInputFocus die Eingabe auf ein anderes Control umsetzen, aber hierbei ist die Gefahr dass sich zwei mit dauernden Fehlermeldungen immer gegenseitig aufrufen. Daher Validierung besser Seitenweise durchführen.
Hier ein Beispiel meiner HB_SLE_Zahl Klasse, die die Eingabe mit der vorgegebenen Transform() Maske formatiert und im SLE so dann auch anzeigt.
Code: Alles auswählen
METHOD HB_SLE_Zahl:KillInputFocus()
local nZahl, cZahl
if ! empty(::maske)
nZahl := ::getValue()
cZahl := alltrim(transform(nZahl,::maske))
::setData( cZahl ,.t.) // ::changed setzen
endif
::XbpSLE:KillInputFocus()
RETURN SELF
Wenn du genauer erklären kannst, wie sich die Eingabe verhalten soll, könnte man besser helfen.
Wichtig, SetData() kann man verwenden um die interne Variable zu ändern, aber den Inhalt abfragen nur mit :editBuffer(),
:GetData() könnte schon zu einer Speicherung führen !