FILTER KEYSTROKE

4D - Documentation   Français   English   German   Spanish   Japanese   4D Programmiersprache, Befehle nach Themen   4D Programmiersprache, Befehle alphabetisch   4D Programmiersprache, Konstanten nach Themen   Back   Previous   Next

Version 6.0


FILTER KEYSTROKE (Zeichen)

ParameterTypBeschreibung
ZeichenStringGefilterte Zeichen oder Leerer String,
um Anschlag zu annullieren

Beschreibung

Mit dem Befehl FILTER KEYSTROKE können Sie das Zeichen, das der Benutzer in ein Datenfeld oder einen eingebbaren Bereich getippt hat durch das erste Zeichen des übergebenen String Zeichen ersetzen.

Ü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.

Beispiele

1. 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.2. 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.

3. 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 muß 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
      ` 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 

Referenz

Form event, Get edited text, Keystroke.

Anwendung des Befehls

Filter Keystroke


4D - Documentation   Français   English   German   Spanish   Japanese   4D Programmiersprache, Befehle nach Themen   4D Programmiersprache, Befehle alphabetisch   4D Programmiersprache, Konstanten nach Themen   Back   Previous   Next