Anweisung direkt ausführen

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
vorti
UDF-Programmierer
UDF-Programmierer
Beiträge: 61
Registriert: Mo, 25. Sep 2017 12:21

Anweisung direkt ausführen

Beitrag 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.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Anweisung direkt ausführen

Beitrag von Martin Altmann »

Moin,
da müsstest Du in dem entsprechenden :keyboard()-slot (re)agieren.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Anweisung direkt ausführen

Beitrag 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 !
Gruß
Hubert
vorti
UDF-Programmierer
UDF-Programmierer
Beiträge: 61
Registriert: Mo, 25. Sep 2017 12:21

Re: Anweisung direkt ausführen

Beitrag 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".
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Anweisung direkt ausführen

Beitrag 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.
Gruß
Hubert
Antworten