4D v14.3

FILTER KEYSTROKE

Home

 
4D v14.3
FILTER KEYSTROKE

FILTER KEYSTROKE 


 

FILTER KEYSTROKE ( Zeichen ) 
Parameter Typ   Beschreibung
Zeichen  String in Gefilterte Zeichen oder Leerer String, um Anschlag zu annullieren

Der Befehl FILTER KEYSTROKE ersetzt das Zeichen, das der Benutzer in ein Datenfeld oder einen eingebbaren Bereich getippt hat, durch das erste Zeichen des übergebenen String Zeichen.

Übergeben Sie einen leeren String, wird der Anschlag annulliert und nicht berücksichtigt.

Sie rufen FILTER KEYSTROKE im allgemeinen bei einem Formularereignis On Before Keystroke in einem Formular oder einer Objektmethode auf. Mit der Funktion Form event finden Sie solche Ereignisse. Mit der Funktion Keystroke finden Sie den aktuellen Tastaturanschlag.

WICHTIGER HINWEIS: Mit dem Befehl FILTER KEYSTROKE können Sie das vom Benutzer eingetippte Zeichen annullieren oder durch ein anderes ersetzen. Wollen Sie für einen bestimmten Tastaturanschlag mehr als ein Zeichen eingeben, beachten Sie, dass der Text auf dem Bildschirm NOCH NICHT der Wert des Quelldatenfeldes oder der Variablen für den Bereich in Bearbeitung ist. Der eingegebene Wert wird dem Quelldatenfeld oder der Variablen erst zugewiesen, wenn die Dateneingabe für den Bereich bestätigt wurde. Sie können zu diesem Zweck die Dateneingabe in einer Variablen spiegeln und mit diesem Wert arbeiten. Anschließend weisen Sie den eingebbaren Bereich erneut zu (Siehe Beispiel).

Sie verwenden den Befehl FILTER 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.

WARNUNG: Rufen Sie nach dem Befehl FILTER KEYSTROKE die Funktion Keystroke auf, wird das hier übergebene Zeichen und nicht das gerade eingegebene zurückgegeben.

Mit dem Code:

  ` Objektmethode Eingebbarer Bereich myObject
 Case of
    :(Form event=On Load)
       myObject:=""
    :(Form event=On Before Keystroke)
       If(Position(Keystroke;"0123456789")>0)
          FILTER KEYSTROKE("*")
       End if
 End case

werden alle im Bereich myObject eingetragenen Ziffern in Sternchen umgewandelt.

Der folgende Code integriert einen eingebbaren Bereich, in dem wie bei Kennwörtern alle eingegebenen Zeichen auf dem Bildschirm durch Blindzeichen ersetzt werden:

  ` Objektmethode Eingebbarer Bereich vsPassword
:(Form event=On Load)
 vsPassword:=""
 vsActualPassword:=""
:(Form event=On Before Keystroke)
 Handle keystroke(->vsPassword;->vsActualPassword)
 If(Position(Keystroke;Char(Backspace)+Char(Left arrow key)+Char(Right arrow key)+Char(Up arrow key)+Char(Down arrow key))=0)
    FILTER KEYSTROKE(Char(65+(Random%26)))
 End if
End case

Nach Bestätigen der Dateneingabe finden Sie das vom Benutzer eingetragene Kennwort in der Variablen vsActualPassword.

Hinweis: Die Methode Handle keystroke finden Sie im Beispiel zur Funktion Keystroke.

In Ihrer Anwendung gibt es Textbereiche für die Eingabe von mehreren Sätzen sowie ein Wörterbuch mit häufig vorkommenden Einträgen. Beim Eingeben von Text sollen nun anhand von markierten Zeichen schnell dazu passende Einträge aus dem Wörterbuch gefunden und integriert werden. Es gibt dafür zwei Lösungen:
- Sie legen einige Schaltflächen mit Tastaturkürzeln an oder
- Sie filtern während der Eingabe in den Textbereich spezifische Tastaturanschläge heraus.

Nachfolgendes Beispiel erläutert die zweite Lösung anhand der Taste Hilfe.

Wie Sie bereits wissen, wird beim Bearbeiten des Textbereichs der eingegebene Wert der Datenquelle erst nach Bestätigen der Dateneingabe zugewiesen. Damit Sie Einträge aus dem Wörterbuch während der Eingabe von Text in den Textbereich finden und einsetzen können, müssen Sie die Dateneingabe spiegeln. Sie übergeben als Parameter Zeiger auf den eingebbaren Bereich und die Spiegelvariable. Als dritten Parameter übergeben Sie einen String für die unzulässigen Zeichen. Es spielt nun keine Rolle, wie die Zeichen eingegeben werden, die Methode gibt immer die Originalschreibweise zurück. Die unzulässigen Zeichen sollen nicht in den eingebbaren Bereich integriert, sondern als spezielle Zeichen behandelt werden.

  ` Projektmethode Spiegelanschlag
  ` Spiegelanschlag ( Zeiger ; Zeiger ; String ) -> String
  ` Spiegelanschlag ( -> Quellbereich ; -> curWert ; Filter ) -> Alter Anschlag
 C_STRING(1;$0)
 C_POINTER($1;$2)
 C_TEXT($vtNewValue)
 C_STRING(255;$3)
  ` Gib Originalanschlag zurück
 $0:=Keystroke
  ` Hole ausgewählten Textbereich aus dem eingebbaren Bereich
 GET HIGHLIGHT($1->;$vlStart;$vlEnd)
  ` Beginne, mit dem aktuellen Wert zu arbeiten
 $vtNewValue:=$2->
  ` Führe je nach gedrückter Taste oder eingegebenem Zeichen geeignete Aktionen aus
 Case of
  ` Die Rückschrittaste (Löschen) wurde gedrückt
    :(ASCII($0)=Backspace)
  ` Lösche die ausgewählten Zeichen oder die Zeichen links vom Cursor
       $vtNewValue:=Delete text($vtNewValue;$vlStart;$vlEnd)
  ` Eine Pfeiltaste wurde gedrückt
  ` Tue nichts, aber akzeptiere den Anschlag
    :(ASCII($0)=Left arrow key)
    :(ASCII($0)=Right arrow key)
    :(ASCII($0)=Up arrow key)
    :(ASCII($0)=Down arrow key)
 
  ` Ein zulässiges Zeichen wurde eingegeben
    :(Position($0;$3)=0)
       $vtNewValue:=Insert text($vtNewValue;$vlStart;$vlEnd;$0)
    Else
  ` Das Zeichen wird nicht angenommen
       FILTER KEYSTROKE("")
 End case
  ` Gib Wert für die Bearbeitung des nächsten Anschlags zurück
 $2->:=$vtNewValue

Diese Methode arbeitet mit folgenden beiden Untermethoden:

  ` Projektmethode Text löschen
  ` Lösche Text ( String ; Lang ; Lang ) -> String
  ` Lösche Text ( -> Text ; AuswStart ; AuswEnde ) -> Neuer Text
 C_TEXT($0;$1)
 C_LONGINT($2;$3)
 $0:=Substring($1;1;$2-1-Num($2=$3))+Substring($1;$3)
 
  ` Projektmethode Text einfügen
  ` Text einfügen ( String ; Lang ; Lang ; String ) -> String
  ` Text einfügen ( -> Quelltext ; AuswStart ; AuswEnde ; einzufügender Text ) -> Neuer Text
 C_TEXT($0;$1;$4)
 C_LONGINT($2;$3)
 $0:=$1
 If($2#$3)
    $0:=Substring($0;1;$2-1)+$4+Substring($0;$3)
 Else
    Case of
       :($2<=1)
          $0:=$4+$0
       :($2>Length($0))
          $0:=$0+$4
       Else
          $0:=Substring($0;1;$2-1)+$4+Substring($0;$2)
    End case
 End if

Sie können diese Projektmethoden folgendermaßen einsetzen:

  ` Objektmethode Eingebbarer Bereich vsDescription
 Case of
    :(Form event=On Load)
       vsDescription:=""
       vsShadowDescription:=""
  ` Erstelle Liste der unzulässigen Zeichen, die als spezielle Tasten zu behandeln sind (Hier wird nur die Taste Hilfe gefiltert)
       vsSpecialKeys:=Char(HelpKey)
    :(Form event=On Before Keystroke)
       $vsKey:=Shadow keystroke(->vsDescription;->vsShadowDescription;vsSpecialKeys)
       Case of
          :(ASCII($vsKey)=Help key)
  ` Tue etwas, wenn die Taste Hilfe gedrückt wird
  ` Hier muss ein Eintrag aus dem Wörterbuch gesucht und eingesetzt werden
             LOOKUP DICTIONARY(->vsDescription;->vsShadowDescription)
       End case
 End case

Die Projektmethode LOOKUP DICTIONARY sehen Sie im Folgenden. Damit soll die Spiegelvariable verwendet werden, um den eingebbaren Bereich in Bearbeitung neu zuzuweisen:

  ` Projektmethode LOOKUP DICTIONARY
  ` LOOKUP DICTIONARY ( Zeiger ; Zeiger )
  ` LOOKUP DICTIONARY ( -> Eingebbarer Bereich ; ->Spiegelvariable )
 
 C_POINTER($1;$2)
 C_LONGINT($vlStart;$vlEnd)
 
  ` Hole ausgewählten Textbereich aus dem eingebbaren Bereich
 GET HIGHLIGHT($1->;$vlStart;$vlEnd)
  ` Hole ausgewählten Text oder Wort links vom Cursor
 $vtHighlightedText:=Get highlighted text($2->;$vlStart;$vlEnd)
  ` Gibt es etwas, wonach gesucht werden soll?
 If($vtHighlightedText#"")
  ` War der ausgewählte Text der Cursor, startet die Auswahl jetzt mit dem vor dem Cursor liegenden Wort.
    If($vlStart=$vlEnd)
       $vlStart:=$vlStart-Length($vtHighlightedText)
    End if
  ` Suche nach dem ersten möglichen Eintrag im Wörterbuch
    QUERY([Dictionary];[Dictionary]Entry=$vtHighlightedText+"@")
  ` Ist einer vorhanden?
    If(Records in selection([Dictionary])>0)
  ` Wenn ja, füge ihn in den Spiegeltext ein
       $2->:=Insert text($2->;$vlStart;$vlEnd;[Dictionary]Entry)
  ` Kopiere Spiegeltext in den eingebbaren Bereich in Bearbeitung
       $1->:=$2->
  ` Setze Auswahl direkt hinter die Eingabe aus dem Wörterbuch
       $vlEnd:=$vlStart+Length([Dictionary]Entry)
       HIGHLIGHT TEXT(vsComments;$vlEnd;$vlEnd)
    Else ` Es gibt keinen entsprechenden Eintrag im Wörterbuch
       BEEP
    End if
 Else ` Es gibt keinen markierten Text
    BEEP
 End if

Die Methode Hole markierten Text sieht folgendermaßen aus:

  ` Projektmethode Hole markierten Text
 <gen9> ` Hole markierten Text ( String ; Lang ; Lang ) -> String
  ` Hole markierten Text ( Text ; AuswStart ; AuswEnde ) -> markierter Text
 C_TEXT($0;$1)
 C_LONGINT($2;$3)
 If($2<$3)
    $0:=Substring($1;$2;$3-$2)
 Else
    $0:=""
    $2:=$2-1
    Repeat
       If($2>0)
          If(Position($1$2≥;"  ,.!?:;()-_–—")=0)
             $0:=$1$2≥+$0
             $2:=$2-1
          Else
             $2:=0
          End if
       End if
    Until($2=0)
 End if</gen9>

 
EIGENSCHAFTEN 

Produkt: 4D
Thema: Eingabekontrolle
Nummer: 389

 
GESCHICHTE 

Erstellt: 4D v6

 
SIEHE AUCH 

Form event
Get edited text
Keystroke

 
ARTIKELVERWENDUNG

4D Programmiersprache ( 4D v11 SQL Release 6)
4D Programmiersprache ( 4D v14 R2)
4D Programmiersprache ( 4D v12.4)
4D Programmiersprache ( 4D v13.5)
4D Programmiersprache ( 4D v14 R3)
4D Programmiersprache ( 4D v14.3)
4D Programmiersprache ( 4D v14 R4)