4D v16.3

Keystroke

Home

 
4D v16.3
Keystroke

Keystroke 


 

Keystroke -> Funktionsergebnis 
Parameter Typ   Beschreibung
Funktionsergebnis  String in Vom Benutzer eingegebene Zeichen

Die Funktion Keystroke gibt das Zeichen zurück, das der Benutzer in ein Datenfeld oder einen eingebbaren Bereich eingetippt hat.

Sie rufen Keystroke im allgemeinen bei einem Formularereignis On Before Keystroke in einem Formular oder einer Objektmethode auf. Mit der Funktion Form event können Sie Tastaturanschläge finden.

Mit dem Befehl CHANGE CURRENT USER können Sie soeben vom Benutzer eingegebene Anschläge durch andere ersetzen.

WICHTIGER HINWEIS: Wollen Sie einige Operationen “on the fly” ausführen, beachten Sie, dass der Text auf dem Bildschirm NOCH NICHT der Wert des Quelldatenfeldes oder der Variablen für den zu bearbeitenden Bereich ist. Der eingegebene Wert, sei es der aktuelle Wert des bearbeiteten eingebbaren Bereichs oder ein neu eingetragenes Zeichen, wird dem Quelldatenfeld oder der Variablen erst zugewiesen, wenn die Dateneingabe für den Bereich bestätigt wurde. Das kann ein Tab in einen anderen Bereich, das Anklicken einer Schaltfläche uvm. sein. Sie können zu diesem Zweck die Dateneingabe in einer Variablen spiegeln und mit diesem Wert arbeiten. Diese Vorgehensweise ist erforderlich, wenn Sie zum Ausführen spezifischer Aktionen den aktuellen Textwert wissen müssen.

Sie verwenden die Funktion Keystroke, um:

  • Zeichen auf eigene Weise zu filtern
  • Die Dateneingabe zu filtern, die Sie nicht über Dateneingabefilter ausführen können.
  • Dynamische Nachschlag- oder Fortschreibbereiche (lookup oder type-ahead) zu integrieren

Siehe Beispiele für den Befehl FILTER KEYSTROKE.

Beim Durchführen eines Ereignisses On Before Keystroke arbeiten Sie mit dem aktuellen Textbereich, d.h. wo der Cursor steht und nicht mit “dem zukünftigen Wert” der Datenquelle (Datenfeld oder Variable) für diesen Bereich. Mit der Projektmethode Handle keystroke können Sie jede Eingabe in den Textbereich in eine zweite Variable spiegeln. Damit können Sie dann die Aktionen während der Eingabe von Zeichen in den Bereich ausführen. Sie übergeben als ersten Parameter einen Zeiger auf die Datenquelle für den Bereich und als zweiten Parameter einen Zeiger auf die Spiegelvariable. Die Methode gibt den neuen Wert des Textbereichs in der Spiegelvariablen zurück und meldet True, wenn sich der Wert von dem unterscheidet, was vor dem zuletzt eingegebenen Zeichen eingefügt wurde.

  ` Verwalte Projektmethode Tastaturanschlag
  ` Verwalte Tastaturanschlag ( Zeiger ; Zeiger ) -> Boolean
  ` Verwalte Tastaturanschlag ( -> srcArea ; -> curValue ) -> Ist neuer Wert
 
 C_POINTER($1;$2)
 C_TEXT($vtNewValue)
 
  ` Hole Textauswahl innerhalb des eingebbaren Bereichs
 GET HIGHLIGHT($1->;$vlStart;$vlEnd)
  ` Beginne mit dem aktuellen Wert zu arbeiten
 $vtNewValue:=$2->
  ` Führe nach gedrückter Taste oder eingegebenem Zeichen,
  ` die entsprechenden Aktionen aus
 Case of
 
  ` Die Rückschrittaste (Löschen) wurde gedrückt
    :(Character code(Keystroke)=Backspace)
  ` Lösche die oder das links vom Cursor ausgewählte Zeichen
       $vtNewValue:=Substring($vtNewValue;1;$vlStart-1-Num($vlStart=$vlEnd))+Substring($vtNewValue;$vlEnd)
 
  ` Ein zulässiges Zeichen wurde eingegeben.
    :(Position(Keystroke;"abcdefghjiklmnopqrstuvwxyz -0123456789")>0)
       If($vlStart#$vlEnd)
  ` Ein oder mehrere Zeichen wurden ausgewählt, der Tastaturanschlag wird sie überspringen
          $vtNewValue:=Substring($vtNewValue;1;$vlStart-1)+Keystroke+Substring($vtNewValue;$vlEnd)
       Else
  ` Die Textauswahl ist der Cursor
          Case of
  ` Der Cursor ist derzeit am Textbeginn
             :($vlStart<=1)
  ` Füge Zeichen am Textbeginn ein
                $vtNewValue:=Keystroke+$vtNewValue
  ` Der Cursor ist derzeit am Textende
             :($vlStart>=Length($vtNewValue))
  ` Hänge Zeichen an Textende an
                $vtNewValue:=$vtNewValue+Keystroke
             Else
  ` Der Cursor steht mitten im Text, füge hier neues Zeichen ein
                $vtNewValue:=Substring($vtNewValue;1;$vlStart-1)+Keystroke
                +Substring($vtNewValue;$vlStart)
          End case
       End if
 
  ` Eine Pfeiltaste wurde gedrückt
  ` Tue nichts, nimm jedoch den Tastaturanschlag an
    :(Character code(Keystroke)=Left arrow key)
    :(Character code(Keystroke)=Right arrow key)
    :(Character code(Keystroke)=Up arrow key)
    :(Character code(Keystroke)=Down arrow key)
 
    Else
  ` Akzeptiere als Zeichen nur Buchstaben, Ziffern, Leerzeichen und Bindestrich
       FILTER KEYSTROKE("")
 End case
  ` Unterscheidet sich der Wert vom vorigen?
 $0:=($vtNewValue#$2->)
  ` Gib den Wert für die Bearbeitung des nächsten Tastaturanschlags zurück
 $2->:=$vtNewValue

Sie können diese Projektmethode folgendermaßen einsetzen:

  ` Objektmethode Eingebbarer Bereich MyObject
 Case of
    :(Form event=On Load)
       MyObject:=""
       MyShadowObject:=""
    :(Form event=On Before Keystroke)
       If(Handle keystroke(->MyObject;->MyShadowObject))
  ` Führe die entsprechenden Aktionen mit dem in MyShadowObject gespeicherten Wert aus
       End if
 End case

Wir überprüfen nun folgenden Teil eines Formulars:

Es besteht aus einem eingebbaren Bereich vsLookup, einem nicht eingebbaren Bereich vsMessage und einem rollbaren Bereich asLookup. Beim Eingeben von Zeichen in vsLookup startet die Methode für dieses Objekt eine Suche auf die Tabelle [PLZ]. Der Benutzer muss nur die ersten Buchstaben eintippen, um eine bestimmte Stadt in Deutschland zu finden.

Die Objektmethode vsLookup lautet folgendermaßen:

  ` Objektmethode Eingebbarer Bereich vsLookup
 Case of
    :(Form event=On Load)
       vsLookup:=""
       vsResult:=""
       vsMessage:="Gib die ersten Buchstaben der gesuchten Stadt ein."
       CLEAR VARIABLE(asLookup)
    :(Form event=On Before Keystroke)
       If(Handle keystroke(->vsLookup;->vsResult))
          If(vsResult#"")
             QUERY([PLZ];[PLZ]Stadt=vsResult+"@")
             MESSAGES OFF
             DISTINCT VALUES([PLZ]Stadt;asLookup)
             MESSAGES ON
             $vlResult:=Size of array(asLookup)
             Case of
                :($vlResult=0)
                   vsMessage:="Es wurde keine Stadt gefunden."
                :($vlResult=1)
                   vsMessage:="Es wurde eine Stadt gefunden."
                Else
                   vsMessage:=String($vlResult)+" gefundene Städte."
             End case
          Else
             DELETE FROM ARRAY(asLookup;1;Size of array(asLookup))
             vsMessage:="Gib die ersten Buchstaben der gesuchten Stadt ein."
          End if
       End if
 End case

Hier ist das Formular in der Anwendungsumgebung:

Mit den Funktionalitäten der Interprozesskommunikation von 4D können Sie ähnliche Benutzeroberflächen gestalten, die in Palettenfenstern Features zum Nachschlagen anzeigen, mit Prozessen kommunizieren, Datensätze auflisten oder bearbeiten.



Siehe auch 

FILTER KEYSTROKE
Form event
Get edited text

 
EIGENSCHAFTEN 

Produkt: 4D
Thema: Eingabekontrolle
Nummer: 390

 
GESCHICHTE 

Erstellt: 4D v6

 
ARTIKELVERWENDUNG

4D Programmiersprache ( 4D v16)
4D Programmiersprache ( 4D v16.1)
4D Programmiersprache ( 4D v16.2)
4D Programmiersprache ( 4D v16.3)