有問題~

Home Home
引用 | 編輯 v52186
2007-06-15 16:31
樓主
推文 x0
想問一個程式寫法~拜託了...新手
今天上課的,全班都不會,老師說下次會考...

大致上說明一下

程式是VB2005

一個視窗上面
一個Label1和一個TextBox1
Label1要隨機產生一個英文(A~Z...這我會ok!)

TextBox1輸入英文時
如果 ..

訪客只能看到部份內容,免費 加入會員



獻花 x0
引用 | 編輯 GNUGCC
2007-06-15 21:44
1樓
  
你可能要在 TextBox1 的 KeyPress 事件去偵測輸入按鍵的值是否和 Label1 的 Caption 屬性代表的值相同,而且是要每按鍵一次就偵測一次必竟你只判斷一個英文字

自已寫看看吧...

獻花 x0
引用 | 編輯 v52186
2007-06-15 22:46
2樓
  
下面是引用GNUGCC於2007-06-15 21:44發表的 :
你可能要在 TextBox1 的 KeyPress 事件去偵測輸入按鍵的值是否和 Label1 的 Caption 屬性代表的值相同,而且是要每按鍵一次就偵測一次必竟你只判斷一個英文字

自已寫看看吧...

Caption是什麼=.=+
我做出來他會變成
按相同(A按A)會變
但是如果前面有不同後面相同不會變->(A按B再A)
如果是放到KeyPress變成按兩下才會變(上面的問題也還在),這邊我又不會用了>"<

獻花 x0
引用 | 編輯 GNUGCC
2007-06-15 22:56
3樓
  
Caption 是 Label 的變數儲存的屬性,其實你也可以先把產生出來的英文儲存在 Byte 型態的字元變數裡再拿來做判斷...

在 KeyPress 裡把傳入按鍵的值和你儲存的英文 Byte 變數做判斷,
這樣不管你的 TextBox1 有多少字元都不會受影響因為
當按下鍵盤時就會傳入一次按鍵的代碼然後立即做判斷...

獻花 x0
引用 | 編輯 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
就會知道...當Press被引發的時候Text的內容是空的...
所以沒辦法判斷輸入的字元...

獻花 x0
引用 | 編輯 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 裡面有英文或是其他型態的值在裡面的話
可能沒辦法做判斷了...

獻花 x0
引用 | 編輯 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...有錯要說一下~謝

你們給的代碼.我貼上去都會有錯誤@@
我再試試看

怎麼都沒人回了...
研究到頭破還是都錯...
除了這裡
我不知道去哪問了...~"~

獻花 x0
引用 | 編輯 overing
2007-06-18 16:42
7樓
  
RE:GNUGCC
恩恩...的確是在KeyPress的時候會先接收到KeyAscii...受教了!~謝謝XDb

RE:v52186
剛剛回頭看了第1篇...
你的IDE是VB2005...所以寫法會不太一樣(我的是VB6的XD)
像你的產生亂數的方法這邊也是不能用XD
把CODE的意思理解一下再用2005的表達法(寫法)寫一次應該就OK了...應該... 表情

獻花 x0
引用 | 編輯 v52186
2007-06-18 17:02
8樓
  
下面是引用overing於2007-06-18 16:42發表的 :
RE:GNUGCC
恩恩...的確是在KeyPress的時候會先接收到KeyAscii...受教了!~謝謝XDb

RE:v52186
剛剛回頭看了第1篇...
.......

那怎麼辦=.=
期末考就要考了>"<
找不到人求救... 表情

獻花 x0
引用 | 編輯 GNUGCC
2007-06-18 22:10
9樓
  
你在 TextBox 的 KeyPress 事件裡把傳入的 KeyAscii 和亂數產生的英文字做判斷假如一樣的話
再重新用亂數產生一次...

記住,不要和 TextBox 做判斷,因為題目要求只要輸入的
字元其中一個和產生出來的英文字元一樣的話就重新取亂數...

你可以把取亂數的程式寫在函式裡面,然後在 KeyPress
裡判斷並做呼叫動作...

獻花 x0
引用 | 編輯 v52186
2007-06-19 08:29
10樓
  
下面是引用GNUGCC於2007-06-18 22:10發表的 :
你在 TextBox 的 KeyPress 事件裡把傳入的 KeyAscii 和亂數產生的英文字做判斷假如一樣的話
再重新用亂數產生一次...

記住,不要和 TextBox 做判斷,因為題目要求只要輸入的
字元其中一個和產生出來的英文字元一樣的話就重新取亂數...
.......
"把傳入的 KeyAscii 和亂數產生的英文字做判斷"
這邊怎麼寫,我也剛學不久,大概知道怎運作,但是不知道怎麼打@@
想到頭好痛,拜託了~"~

獻花 x0
引用 | 編輯 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

獻花 x0
引用 | 編輯 v52186
2007-06-19 21:54
12樓
  
下面是引用GNUGCC於2007-06-19 21:19發表的 :
'下面這個是用來產生亂數你可以把它放在函式裡面
Dim r As New Random
Dim i As Integer

'這個 i 稍候會被用在 Text1 的 KeyPress 事件傳入的 KeyAscii 判斷, 可能 i 要宣告為全堿變數
.......

我照你的輸入後
執行程式沒有反應...
怎麼會這樣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
哪邊放錯了嗎?

獻花 x0
引用 | 編輯 GNUGCC
2007-06-19 22:15
13樓
  
i 宣告為全域變數看看...

獻花 x0
引用 | 編輯 v52186
2007-06-19 22:22
14樓
  
有阿
我放在最上面了
一樣沒有反應

獻花 x0
引用 | 編輯 overing
2007-06-19 22:36
15樓
  
可能是大小寫問題...
ASCIICODE 65~90是大寫字
有可能你輸入的是小寫所以才沒反應
(怎麼輸入LABEL都不會RANDOM取新字)
記得把字串用LCase 或UCase 把產生的字跟輸入的字統一成大寫或小寫再來判斷

我想老師說大小寫沒差的話
應該就是指"不管輸入大寫還是小寫都要能起作用"...

PS."i"跟"r"放那個位置就算是全域變數了(FORM3裡)

獻花 x0
引用 | 編輯 v52186
2007-06-19 22:51
16樓
  
不...問題是我輸入大小寫都沒有反應@@
大小寫沒差(會變就好了QQ),當然要做到最好我也沒意見0.0
今天有點晚了
明天我再來看>"<

獻花 x0
引用 | 編輯 GNUGCC
2007-06-19 23:43
17樓
  
可能要借助 Debug.Print 敘述輸出 KeyAscii 的值來判斷按下的字元是否和亂數產生出的字元相同...

Debug.Print KeyAscii
Debug.Print i

上面的 i 是指亂數的值, 可以試看看,假如 KeyAscii 和 i 相同的話就應該沒問題...

獻花 x1
引用 | 編輯 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
KeyAscii = 0
這個漏了...pass是在[鍵盤輸入]跟[顯示在物件上面]兩事件之間
只有TextBox1.text = ""沒用...
因為:

[鍵盤輸入]

[pass事件] 這時候TextBox1.text = ""

[顯示在物件上面]這裡又會把KeyAscii轉成字元顯示在TextBox1上

所以KeyAscii=0也要

如果還是不行請描述一下哪裡不ok
比方說
"輸入跟LABEL一樣的自之後TEXTBOX沒有變成空白"
或是
"LABEL的字都只出現一種"
或是
"TEXTBOX輸入跟LABEL一樣的字,LABEL還是都不會改變"
之類的...這樣要偵錯比較快

獻花 x0
引用 | 編輯 v52186
2007-06-20 15:18
19樓
  

圖 1.


下面是引用overing於2007-06-19 23:53發表的 :
try
[code]Public Class Form3
Dim r As New Random
Dim i As Integer
Private Sub Text1_KeyPress(ByVal KeyAscii As Integer)
.......
兩位的方法都試過了
Textbox輸入跟Label顯示的文字後
Label跟Textbox都不會改變
不管輸入什麼都沒有反應(大小寫都試過)

獻花 x0
引用 | 編輯 overing
2007-06-20 22:53
20樓
  
...
頭大了...CODE應該都正確了才對...
這邊VB6一樣的寫法(不是指語法)
就運作正常@@...
等我裝上2005吧... 表情

獻花 x0
引用 | 編輯 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


獻花 x0
引用 | 編輯 v52186
2007-06-21 17:26
22樓
  
下面是引用overing於2007-06-21 09:43發表的 :
終於搞定了...
.Net的寫法跟VB6差太多了 表情
[code]Public Class Form1
  Dim r As New Random
  Dim i As Integer
.......

這行出現錯誤
e.KeyChar = i
型別'Char'和'Integer'的運算子'='未定義

再拜託了 表情

獻花 x0
引用 | 編輯 overing
2007-06-21 20:26
23樓
  
改成
If e.KeyChar.ToString = Chr(i) Then
應該就...

獻花 x1
引用 | 編輯 v52186
2007-06-21 22:12
24樓
  
下面是引用overing於2007-06-21 20:26發表的 :
改成
If e.KeyChar.ToString = Chr(i) Then
應該就...
太感謝了...終於做出來了...謝謝兩位的幫助=.=

獻花 x0