Seite 1 von 1

Anweisung direkt ausführen

Verfasst: Mo, 27. Nov 2017 8:53
von vorti
Hallo,
wenn ich mit substr() in einem SLE eine bestimmte Anzahl an Zeichen am Ende des Strings nicht möchte, wird es ja immer erst ausgeführt, wenn die bufferlength erreicht ist. Gibt es eine Möglichkeit, die Anweisung direkt zu triggern.

Re: Anweisung direkt ausführen

Verfasst: Mo, 27. Nov 2017 9:05
von Martin Altmann
Moin,
da müsstest Du in dem entsprechenden :keyboard()-slot (re)agieren.

Viele Grüße,
Martin

Re: Anweisung direkt ausführen

Verfasst: Mo, 27. Nov 2017 9:25
von brandelh
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 !

Re: Anweisung direkt ausführen

Verfasst: Mo, 27. Nov 2017 9:55
von vorti
Ich möchte ab einen bestimmten Zeichen nur noch eine gewisse Anzahl anderer Zeichen zulassen.
Beispiel: Mein String ist "Inoffizielles ". Ab dem ersten "f" sollen nur noch 3 Zeichen folgen, also "Inoffiz". Bei "Forum" dann "Foru".

Re: Anweisung direkt ausführen

Verfasst: Mo, 27. Nov 2017 10:15
von brandelh
innerhalb des Keyboardslots kannst du sowas steuern, meine Beispiele z.B. verwalten Zahlen, Bankleitzahlen, Datum etc.
Wenn es so ist, dass du insgesamt nur 7 Zeichen zulassen willst, könntest du natürlich auch die Eingabe auf 7 Zeichen begrenzen, wenn es nach Schlüsselwörtern begrenzt werden soll, dann wie beschrieben.