Version 6.0
FILTER KEYSTROKE (Zeichen)
Parameter | Typ | Beschreibung | |
Zeichen | String | Gefilterte 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.