引用 | 編輯
v52186
2007-06-15 16:31 |
樓主
▼ |
||
![]() 今天上課的,全班都不會,老師說下次會考... 大致上說明一下 程式是VB2005 一個視窗上面 一個Label1和一個TextBox1 Label1要隨機產生一個英文(A~Z...這我會ok!) TextBox1輸入英文時 如果 .. 訪客只能看到部份內容,免費 加入會員 ![]()
|
引用 | 編輯
GNUGCC
2007-06-15 21:44 |
1樓
▲ ▼ |
你可能要在 TextBox1 的 KeyPress 事件去偵測輸入按鍵的值是否和 Label1 的 Caption 屬性代表的值相同,而且是要每按鍵一次就偵測一次必竟你只判斷一個英文字
自已寫看看吧... ![]() |
引用 | 編輯
v52186
2007-06-15 22:46 |
2樓
▲ ▼ |
下面是引用GNUGCC於2007-06-15 21:44發表的 : Caption是什麼=.=+ 我做出來他會變成 按相同(A按A)會變 但是如果前面有不同後面相同不會變->(A按B再A) 如果是放到KeyPress變成按兩下才會變(上面的問題也還在),這邊我又不會用了>"< ![]() |
引用 | 編輯
GNUGCC
2007-06-15 22:56 |
3樓
▲ ▼ |
Caption 是 Label 的變數儲存的屬性,其實你也可以先把產生出來的英文儲存在 Byte 型態的字元變數裡再拿來做判斷...
在 KeyPress 裡把傳入按鍵的值和你儲存的英文 Byte 變數做判斷, 這樣不管你的 TextBox1 有多少字元都不會受影響因為 當按下鍵盤時就會傳入一次按鍵的代碼然後立即做判斷... ![]() |
引用 | 編輯
overing
2007-06-16 06:19 |
4樓
▲ ▼ |
複製程式
Const Str1 As String = "abcdefghijklmnopqrstuvwxyz" Private Sub Form_Load() Dim R As Integer Text1 = "" Randomize R = Fix(Rnd * 26) + 1 Label1 = Mid(Str1, R, 1) End Sub Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer) If LCase(Right(Text1, 1)) = LCase(Label1) Then Dim R As Integer Text1 = "" Randomize R = Fix(Rnd * 26) + 1 Label1 = Mid(Str1, R, 1) End If End Sub 正確來講 [Caption]屬性 是 [Label]物件類別 的[顯示屬性]... 就像 [TextBox]物件類別 的 [Text]屬性 一樣 然後VB的物件有個方便的功能就是物件名稱能提取該物件最常用的屬性 所以今天建立一個名稱叫"Label1"的[Label]的物件 Label1.Caption = "test" 跟 Label1 = "test" 這兩行的意思是一樣的... 至於為什麼CODE要寫在KeyUp...試試下面的 複製程式 Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer) Debug.Print "down event" & Text1 End Sub Private Sub Text1_KeyPress(KeyAscii As Integer) Debug.Print "Press event" & Text1 End Sub Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer) Debug.Print "up event" & Text1 End Sub 所以沒辦法判斷輸入的字元... ![]() |
引用 | 編輯
GNUGCC
2007-06-16 07:21 |
5樓
▲ ▼ |
Private Sub Text1_KeyPress(KeyAscii As Integer)
Debug.Print "Press event" & Text1 End Sub 其實如果在 KeyPress 事件的話應該要用傳入的 KeyAscii 的值做判斷,因為那個是 當鍵盤按下時的 Ascii 代碼,你可以在 Debug.Print 後面加上輸出 KeyAscii 就可以知道 Ascii 的值了... 如果要和 TextBox 的值做判斷也可以,不過如果 TextBox 裡面有英文或是其他型態的值在裡面的話 可能沒辦法做判斷了... ![]() |
引用 | 編輯
v52186
2007-06-16 08:48 |
6樓
▲ ▼ |
複製程式
Dim r As New Random Dim i As Integer i = r.Next(65, 90) Label1.Text = Chr(i) 這是亂數產生A~Z的方式 我是放在Form_Load...有錯要說一下~謝 你們給的代碼.我貼上去都會有錯誤@@ 我再試試看 怎麼都沒人回了... 研究到頭破還是都錯... 除了這裡 我不知道去哪問了...~"~ ![]() |
引用 | 編輯
overing
2007-06-18 16:42 |
7樓
▲ ▼ |
RE:GNUGCC
恩恩...的確是在KeyPress的時候會先接收到KeyAscii...受教了!~謝謝XDb RE:v52186 剛剛回頭看了第1篇... 你的IDE是VB2005...所以寫法會不太一樣(我的是VB6的XD) 像你的產生亂數的方法這邊也是不能用XD 把CODE的意思理解一下再用2005的表達法(寫法)寫一次應該就OK了...應該... ![]() ![]() |
引用 | 編輯
v52186
2007-06-18 17:02 |
8樓
▲ ▼ |
下面是引用overing於2007-06-18 16:42發表的 : 那怎麼辦=.= 期末考就要考了>"< 找不到人求救... ![]() ![]() |
引用 | 編輯
GNUGCC
2007-06-18 22:10 |
9樓
▲ ▼ |
你在 TextBox 的 KeyPress 事件裡把傳入的 KeyAscii 和亂數產生的英文字做判斷假如一樣的話
再重新用亂數產生一次... 記住,不要和 TextBox 做判斷,因為題目要求只要輸入的 字元其中一個和產生出來的英文字元一樣的話就重新取亂數... 你可以把取亂數的程式寫在函式裡面,然後在 KeyPress 裡判斷並做呼叫動作... ![]() |
引用 | 編輯
v52186
2007-06-19 08:29 |
10樓
▲ ▼ |
下面是引用GNUGCC於2007-06-18 22:10發表的 :"把傳入的 KeyAscii 和亂數產生的英文字做判斷" 這邊怎麼寫,我也剛學不久,大概知道怎運作,但是不知道怎麼打@@ 想到頭好痛,拜託了~"~ ![]() |
引用 | 編輯
GNUGCC
2007-06-19 21:19 |
11樓
▲ ▼ |
'下面這個是用來產生亂數你可以把它放在函式裡面
Dim r As New Random Dim i As Integer '這個 i 稍候會被用在 Text1 的 KeyPress 事件傳入的 KeyAscii 判斷, 可能 i 要宣告為全堿變數 i = r.Next(65, 90) Label1.Text = Chr(i) '這個是 Text1 的 KeyPress 事件 Private Sub Text1_KeyPress(KeyAscii As Integer) '假如按下的按鍵和亂數的值一樣的話就重新取亂數 If KeyAscii = i Then '這裡做取亂數呼叫動作達到重新取亂數的目的 End If End Sub ![]() |
引用 | 編輯
v52186
2007-06-19 21:54 |
12樓
▲ ▼ |
下面是引用GNUGCC於2007-06-19 21:19發表的 : 我照你的輸入後 執行程式沒有反應... 怎麼會這樣0.0 複製程式 Public Class Form3 Dim r As New Random Dim i As Integer Private Sub Text1_KeyPress(ByVal KeyAscii As Integer) If KeyAscii = i Then Label1.Text = "" TextBox1.text = "" i = r.Next(65, 90) Label1.Text = Chr(i) End If End Sub Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load i = r.Next(65, 90) Label1.Text = Chr(i) End Sub End Class ![]() |
引用 | 編輯
overing
2007-06-19 22:36 |
15樓
▲ ▼ |
可能是大小寫問題...
ASCIICODE 65~90是大寫字 有可能你輸入的是小寫所以才沒反應 (怎麼輸入LABEL都不會RANDOM取新字) 記得把字串用LCase 或UCase 把產生的字跟輸入的字統一成大寫或小寫再來判斷 我想老師說大小寫沒差的話 應該就是指"不管輸入大寫還是小寫都要能起作用"... PS."i"跟"r"放那個位置就算是全域變數了(FORM3裡) ![]() |
引用 | 編輯
v52186
2007-06-19 22:51 |
16樓
▲ ▼ |
不...問題是我輸入大小寫都沒有反應@@
大小寫沒差(會變就好了QQ),當然要做到最好我也沒意見0.0 今天有點晚了 明天我再來看>"< ![]() |
引用 | 編輯
GNUGCC
2007-06-19 23:43 |
17樓
▲ ▼ |
可能要借助 Debug.Print 敘述輸出 KeyAscii 的值來判斷按下的字元是否和亂數產生出的字元相同...
Debug.Print KeyAscii Debug.Print i 上面的 i 是指亂數的值, 可以試看看,假如 KeyAscii 和 i 相同的話就應該沒問題... ![]() |
引用 | 編輯
overing
2007-06-19 23:53 |
18樓
▲ ▼ |
try
複製程式 Public Class Form3 Dim r As New Random Dim i As Integer Private Sub Text1_KeyPress(ByVal KeyAscii As Integer) If KeyAscii = i Then TextBox1.text = "" KeyAscii = 0 i = r.Next(65, 90) Label1.Text = Chr(i) End If End Sub Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load i = r.Next(65, 90) Label1.Text = Chr(i) End Sub End Class 這個漏了...pass是在[鍵盤輸入]跟[顯示在物件上面]兩事件之間 只有TextBox1.text = ""沒用... 因為: [鍵盤輸入] ↓ [pass事件] 這時候TextBox1.text = "" ↓ [顯示在物件上面]這裡又會把KeyAscii轉成字元顯示在TextBox1上 所以KeyAscii=0也要 如果還是不行請描述一下哪裡不ok 比方說 "輸入跟LABEL一樣的自之後TEXTBOX沒有變成空白" 或是 "LABEL的字都只出現一種" 或是 "TEXTBOX輸入跟LABEL一樣的字,LABEL還是都不會改變" 之類的...這樣要偵錯比較快 ![]() |
引用 | 編輯
overing
2007-06-20 22:53 |
20樓
▲ ▼ |
...
頭大了...CODE應該都正確了才對... 這邊VB6一樣的寫法(不是指語法) 就運作正常@@... 等我裝上2005吧... ![]() ![]() |
引用 | 編輯
overing
2007-06-21 09:43 |
21樓
▲ ▼ |
終於搞定了...
.Net的寫法跟VB6差太多了 ![]() 複製程式 Public Class Form1 Dim r As New Random Dim i As Integer Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load i = r.Next(65, 90) Label1.Text = Chr(i) End Sub Private Sub TextBox1_KeyPress1(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress If e.KeyChar = i Then 'e.KeyChar 跟VB6裡的KeyAscii意思一樣 TextBox1.Text = "" e.Handled = True '對應VB6的 KeyAscii=0 ,意思不一樣...但是作用都是不讓TEXTBOX收到輸入 i = r.Next(65, 90) Label1.Text = Chr(i) End If End Sub End Class ![]() |