2008-08-20 15 views

Antwort

5

Ich konnte es bei der Verwendung von KeyPress-Ereignis tun. Hier ist das Codebeispiel:

Private Sub SingleLineTextBox_ KeyPress(ByRef KeyAscii As Integer) 
    If KeyAscii = 10 _ 
     or KeyAscii = 13 Then 
      '10 -> Ctrl-Enter. AKA ^J or ctrl-j 
      '13 -> Enter.  AKA ^M or ctrl-m 
     KeyAscii = 0 'clear the the KeyPress 
    End If 
End Sub 
+0

Dies ist keineswegs die beste Lösung, da es das falsche Ereignis verwendet und mit jedem Tastendruck ausgelöst wird. Das AfterUpdate-Ereignis des Steuerelements ist viel geeigneter und wird nur einmal ausgelöst. –

+1

Es funktioniert für mich. Kein Bildschirmflackern. Und in diesem Fall möchte ich die schlechte Eingabe zunächst RATHER verhindern, als es versuchen und später heraussieben und entweder dem Benutzer einen stumpfen Fehler geben oder ihre Eingabe ändern. – BIBD

+0

Ich verwende diese Lösung in Kombination mit der [AfterUpdate-Lösung] (https://StackOverflow.com/a/67730/360480), da diese auch Zeilenumbrüche betrifft, die per Copy & Paste eingefügt werden. –

0

nicht ganz sicher über das, sollten Sie in der Lage sein, die Zeilenumbrüche zu entfernen, wenn Sie den Inhalt rendern, oder sogar ein VBScript ausführen, um es zu löschen, müssen Sie nur für CHR (13) oder VbCrLf überprüfen.

+0

Nicht ganz was ich wollte. Es bedeutet, dass ich mit den Daten des Benutzers im Hintergrund (nicht WYSIWYG) verarschen muss oder Fehler werfe, dass ich eine Menge Erklärung hinter sich gelassen hätte. Trotzdem danke. – BIBD

3

Die Art und Weise, wie ich es zuvor gemacht habe (und das letzte Mal, dass ich in Access gearbeitet habe um 97 herum, so dass mein Speicher nicht so heiß ist) war ein Key-Up-Ereignis und führte eine VBA-Funktion aus. Es ist eine ähnliche Methode wie bei einem AJAX-Vorschlagsfeld in einer modernen Webformular-Anwendung, aber wenn ich mich recht erinnere, könnte es zu Problemen kommen, wenn Ihr Access-Formular andere Ereignisse hat, die häufig vorkommen, so eine onMouseMove über das gesamte Formularobjekt.

+0

Erneut das KeyUp-Ereignis zuerst bei jedem Tastendruck, und dies kann zu einer flackernden Bildschirmanzeige führen. Und es ist einfach ineffizient - das beste Ereignis dafür ist immer noch das AfterUpdate-Ereignis des Steuerelements, das Sie zum Bearbeiten des Memos verwenden, da es nur einmal ausgelöst wird. –

+0

Dieser Kommentar sollte lauten: Das KeyUp-Ereignis FIRES mit jedem Tastendruck ... –

0

Wenn Sie nicht über ein Ereignis wollen stören, können Sie die Gültigkeitsregel Eigenschaft für das Textfeld

NOT LIKE "*"+Chr(10)+"*" OR "*"+Chr(13)+"*" 

eingerichtet werden, werden Sie wahrscheinlich auch festlegen mögen der Validierungstext, um speziell zu erklären, warum Access ein Fehlerfeld ausgibt.

+0

Nicht ganz, was ich wollte, Benutzer scheinen den Validierungstext nie zu verstehen. Trotzdem danke. – BIBD

2

Die Verwendung des KeyPress-Ereignisses bedeutet, dass der Code bei jeder Eingabe durch den Benutzer ausgelöst wird. Dies kann zu Bildschirmflackern und anderen Problemen führen (das OnChange-Ereignis wäre dasselbe).

Es scheint mir, dass Sie ein einzelnes Ereignis verwenden sollten, um die CrLfs zu entfernen, und das richtige Ereignis wäre AfterUpdate. Sie würden einfach dies tun:

If InStr(Me!MyMemoControl, vbCrLf) Then 
    Me!MyMemoControl = Replace(Me!MyMemoControl, vbCrLf, vbNullString) 
    End If 

Beachten Sie die Verwendung der Zugriffs globalen Konstanten, vbCrLf (Chr (10) & Chr (13)) und vbNullString (für Zeichenfolge der Länge Null).

Die Verwendung einer Validierungsregel bedeutet, dass Sie Ihrem Benutzer eine hässliche Fehlermeldung anzeigen, diesen aber nur wenig Tools zur Verfügung stellen, um das Problem zu beheben. Der AfterUpdate-Ansatz ist für die Benutzer viel sauberer und einfacher, scheint mir.

+0

In Anbetracht dessen, dass Sie es im Frontend behandeln, ist es auch nicht schaden, die Validierungsregel in der Datenbank hinzuzufügen. Es könnte sogar ein Segen sein, z.B. wenn ein Benutzer versucht, über Excel auf die Daten zuzugreifen, wie es früher oder später immer der Fall ist :) – onedaywhen

+0

Wenn Sie jedoch die Validierungsregel eingeben, müssen Sie das BeforeUpdate-Ereignis anstelle von AfterUpdate verwenden. Andernfalls werden Sie den Jet-Datenfehler wegen des Verstoßes gegen die Gültigkeitsregel löschen. –

+1

Ich verstehe Ihre Argumentation. In der Praxis bekomme ich jedoch bei meiner Methode keinen Bildschirmflicker. Darüber hinaus wird das Löschen von CrLf nach der Aktualisierung durch den Benutzer die Art und Weise ändern, in der die Daten so dargestellt werden, wie sie eingegeben wurden. Das wiederum wird zu mehr Krächzen bei den Nutzern führen. Ich bevorzuge es, wenn sie Daten eingeben, "was sie sehen, ist was sie bekommen". – BIBD

0

Dank Ian und BIBD. Ich habe basierend auf Ihrer Antwort ein öffentliches Sub erstellt, das wiederverwendbar ist.

Public Sub PreventNewlines(ByRef KeyAscii As Integer) 
    If KeyAscii = 10 Or KeyAscii = 13 Then KeyAscii = 0 
End Sub 

Private Sub textbox_KeyPress(KeyAscii As Integer) 
    Call PreventNewlines(KeyAscii) 
End Sub 

Bildschirm flimmern sollte nie ein Problem sein, da diese Ereignisse behandelt werden, nicht konstant Polling (und es ist pro Steuerung weiter den Umfang zu begrenzen). Scheint mir wie ein ungültiges Argument, da jeder Texteditor einen Code pro Tastenanschlag ausführt.

Danke