2008-08-20 116 views

回答

5

我能夠使用KeyPress事件做到這一點。 下面的代碼示例:

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

這不是最好的解決方案,因爲它使用了錯誤的事件,並且每次擊鍵都會觸發。控件的AfterUpdate事件更合適,並且只觸發一次。 – 2008-09-17 03:01:15

+1

它爲我工作。沒有屏幕閃爍。在這種情況下,我希望防止最初的錯誤輸入RATHER,而不是稍後嘗試並篩選出來,並給用戶一個鈍的錯誤或改變他們對它們的輸入。 – BIBD 2008-09-17 22:11:51

0

不完全確定那個,你應該可以在你渲染內容時刪除換行符,或者甚至運行一個vbscript來清除它,你只需要檢查chr(13)或vbCrLf。

+0

不是我想要的。這意味着我不得不在後臺(而不是所見即所得)中使用用戶的數據,或拋出錯誤,我會在後面提出很多解釋。不過謝謝。 – BIBD 2008-09-11 14:30:24

3

我之前(以及我在Access中工作的最後一次是在97年左右,所以我的記憶並不那麼熱)的方式正在引發鍵盤事件並執行VBA功能。這與您在現代webform應用程序中使用AJAX建議文本框所做的操作類似,但是我記得,如果Access窗體的其他事件經常發生在整個窗體對象上的onMouseMove等其他事件,它可能會被絆倒。

+0

再次,每次擊鍵都會首先發生KeyUp事件,這會導致屏幕閃爍。而且它效率低下 - 最好的事件仍然是用於編輯備忘錄的控件的AfterUpdate事件,因爲它只觸發一次。 – 2008-09-17 03:02:34

+0

該評論應該是這樣的:KeyUp事件每次擊鍵都會引發... – 2008-09-17 03:03:08

0

如果你不希望事件的干擾,可以設置有效性規則屬性的文本框是

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

你可能還需要設置驗證文本來具體解釋Access爲什麼拋出一個錯誤框。

2

使用KeyPress事件意味着每次用戶鍵入時都會觸發您的代碼。這可能導致屏幕閃爍和其他問題(OnChange事件將是相同的)。

在我看來,你應該使用單個事件去除CrLf,並且正確的事件將是AfterUpdate。你會簡單地這樣做:

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

的使用注意事項訪問全局常量的,vbCrLf(爲CHR(10)& CHR(13))和vbNullString(零長度字符串)。

使用驗證規則意味着您要向用戶彈出一個醜陋的錯誤消息,但爲他們提供了很少的工具來糾正問題。在我看來,AfterUpdate方法對用戶來說更簡潔,更簡單。

0

謝謝伊恩和BIBD。我根據可重用的答案創建了一個公共子組。

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 

屏幕閃爍不應該是一個問題,因爲這些都是處理的事件,而不是持續輪詢(並且每個控制的進一步限制範圍)。對我來說似乎是一個無效的參數,因爲每個文本編輯器在每次擊鍵時都執行一些代碼。

謝謝