VB6 - GetAsyncKeyState(VK_Down) ilk 2. tuş vuruşunu algılamıyor ?

  • Konuyu başlatan Konuyu başlatan A_day
  • Başlangıç tarihi Başlangıç tarihi

A_day

Öğrenci
Katılım
4 Şubat 2014
Mesajlar
41
Reaksiyon puanı
0
Puanları
6
Arkadaşlar şöyle bir sorunum var;

Yazmaya çalıştığım programın bir bölümünde ok tuşlarının vuruşlarını yakalamam gerekiyor. Buraya programın sadece o bölümünü aktardım. Ben bu ok tuşlarını yakalama işini Timer yerine LostFocus'la yapmayı tercih ettim.

Aslında kodlar çalışıyor ancak canımı sıkan bir pürüz var. İlk 2. vuruşu yanlış icra ediyor, ondan sonraki vuruşları doğru yapıyor. Satır satır defalarca denedim, hep aynı şekilde davranıyor.

Aşağıya adımları yazacağım. Sizden ricam; bu ilk 2. adımı neden yanlış uyguladığı konusunda yardımcı olmanız.

1 - Programı çalıştırdıktan sonra ilk vuruşunuz aşağı ok olsun. (Bu ilk vuruşu sadece Command1'in buton rengini değiştirecek şekilde tasarladım. Yani bu ilk aşağı ok bilinçli olarak direk Command1'in buton rengini değiştiriyor. Bu vuruşta hata aramayın.) Bu vuruş sonrası Command1 butonu vuruşu yakalayıp buton rengini değiştirecek. Burada sorun yok.

2 - İkinci vuruş sağa ok olsun. Bu vuruş sonrası Command3'ün buton renginin değişmesi beklenirken, bir alttaki buton olan Command2'nin buton rengi değişiyor. Bu kısmı debugla defalarca adım adım izledim. Sağ ok tuşladığım halde (VK_Down) kontrolünün içini icra ediyor. Oysaki (VK_Right)'in içi icra edilmeli.

3 - Programı kapatmak için mouse ile Command5'e click yaptığımda ise 2.nci adımda yapmamış olduğu eylemi icra edip, bir sağ buton olan Comman4'ün buton rengini değiştiriyor. Oysaki Command5'in Click olayını gerçekleştirmesi gerekir.

Sizlerden bu adımları bu sırayla gözlemlemenizi ve nerede hata yaptığım konusunda yardımlarınızı rica ediyorum.

Formun Görünüşü :

x0OdRD.png



Module1'in kodları :

Kod:
Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As IntegerPublic Const VK_Down = &H28
Public Const VK_Up = &H26
Public Const VK_Left = &H25
Public Const VK_Right = &H27

Form1'in kodları :

Kod:
Dim ActiveButon As String

Private Sub Form_Load()
    Me.Show
    ActiveButon = "Any"
    Command1.SetFocus
End Sub


Private Sub Command5_Click()
    End
End Sub


Private Sub Command1_LostFocus()


If Command5.Default = True Then
    Exit Sub
End If


If ActiveButon = "Any" Then
        Command1.BackColor = &HC0E0FF
        Command1.Default = False
        Command1.SetFocus
        ActiveButon = "Command1"
        Exit Sub
End If
        
If ActiveButon = "Command1" Then
    If GetAsyncKeyState(VK_Down) Then
        Command1.BackColor = &H8000000F
        Command1.Default = False
        Command2.BackColor = &HC0E0FF
        Command2.Default = True
        Command2.SetFocus
        ActiveButon = "Command2"
    Else
    If GetAsyncKeyState(VK_Up) Then
        Command1.BackColor = &H8000000F
        Command1.Default = False
        Command2.BackColor = &HC0E0FF
        Command2.Default = True
        Command2.SetFocus
        ActiveButon = "Command2"
    Else
    If GetAsyncKeyState(VK_Left) Then
        Command1.BackColor = &H8000000F
        Command1.Default = False
        Command3.BackColor = &HC0E0FF
        Command3.Default = True
        Command3.SetFocus
        ActiveButon = "Command3"
    Else
    If GetAsyncKeyState(VK_Right) Then
        Command1.BackColor = &H8000000F
        Command1.Default = False
        Command3.BackColor = &HC0E0FF
        Command3.Default = True
        Command3.SetFocus
        ActiveButon = "Command3"
    End If
    End If
    End If
    End If
End If
End Sub


Private Sub Command2_LostFocus()


If Command5.Default = True Then
    Exit Sub
End If


If ActiveButon = "Command2" Then
    If GetAsyncKeyState(VK_Down) Then
        Command2.BackColor = &H8000000F
        Command2.Default = False
        Command1.BackColor = &HC0E0FF
        Command1.Default = True
        Command1.SetFocus
        ActiveButon = "Command1"
    Else
    If GetAsyncKeyState(VK_Up) Then
        Command2.BackColor = &H8000000F
        Command2.Default = False
        Command1.BackColor = &HC0E0FF
        Command1.Default = True
        Command1.SetFocus
        ActiveButon = "Command1"
    Else
    If GetAsyncKeyState(VK_Left) Then
        Command2.BackColor = &H8000000F
        Command2.Default = False
        Command4.BackColor = &HC0E0FF
        Command4.Default = True
        Command4.SetFocus
        ActiveButon = "Command4"
    Else
    If GetAsyncKeyState(VK_Right) Then
        Command2.BackColor = &H8000000F
        Command2.Default = False
        Command4.BackColor = &HC0E0FF
        Command4.Default = True
        Command4.SetFocus
        ActiveButon = "Command4"
    End If
    End If
    End If
    End If
End If
End Sub


Private Sub Command3_LostFocus()


If Command5.Default = True Then
    Exit Sub
End If


If ActiveButon = "Command3" Then
    If GetAsyncKeyState(VK_Down) Then
        Command3.BackColor = &H8000000F
        Command3.Default = False
        Command4.BackColor = &HC0E0FF
        Command4.Default = True
        Command4.SetFocus
        ActiveButon = "Command4"
    Else
    If GetAsyncKeyState(VK_Up) Then
        Command3.BackColor = &H8000000F
        Command3.Default = False
        Command4.BackColor = &HC0E0FF
        Command4.Default = True
        Command4.SetFocus
        ActiveButon = "Command4"
    Else
    If GetAsyncKeyState(VK_Left) Then
        Command3.BackColor = &H8000000F
        Command3.Default = False
        Command1.BackColor = &HC0E0FF
        Command1.Default = True
        Command1.SetFocus
        ActiveButon = "Command1"
    Else
    If GetAsyncKeyState(VK_Right) Then
        Command3.BackColor = &H8000000F
        Command3.Default = False
        Command1.BackColor = &HC0E0FF
        Command1.Default = True
        Command1.SetFocus
        ActiveButon = "Command1"
    End If
    End If
    End If
    End If
    End If
End Sub


Private Sub Command4_LostFocus()


If Command5.Default = True Then
    Exit Sub
End If


If ActiveButon = "Command4" Then
    If GetAsyncKeyState(VK_Down) Then
        Command4.BackColor = &H8000000F
        Command4.Default = False
        Command3.BackColor = &HC0E0FF
        Command3.Default = True
        Command3.SetFocus
        ActiveButon = "Command3"
    Else
    If GetAsyncKeyState(VK_Up) Then
        Command4.BackColor = &H8000000F
        Command4.Default = False
        Command3.BackColor = &HC0E0FF
        Command3.Default = True
        Command3.SetFocus
        ActiveButon = "Command3"
    Else
    If GetAsyncKeyState(VK_Left) Then
        Command4.BackColor = &H8000000F
        Command4.Default = False
        Command2.BackColor = &HC0E0FF
        Command2.Default = True
        Command2.SetFocus
        ActiveButon = "Command2"
    Else
    If GetAsyncKeyState(VK_Right) Then
        Command4.BackColor = &H8000000F
        Command4.Default = False
        Command2.BackColor = &HC0E0FF
        Command2.Default = True
        Command2.SetFocus
        ActiveButon = "Command2"
    End If
    End If
    End If
    End If
End If
End Sub

 

A_day

Öğrenci
Katılım
4 Şubat 2014
Mesajlar
41
Reaksiyon puanı
0
Puanları
6
Arkadaşlar koca forumda, hazır kodları bir forma yapıştırıp, bahsettiğim olayı gözlemleyip, tespit ve öneride bulunacak, bu işten anlayan bir usta yok mu ?
 

eSa

Dekan
Katılım
5 Kasım 2011
Mesajlar
9,781
Reaksiyon puanı
352
Puanları
263
Arkadaşlar koca forumda, hazır kodları bir forma yapıştırıp, bahsettiğim olayı gözlemleyip, tespit ve öneride bulunacak, bu işten anlayan bir usta yok mu ?

Her buttonun lostfocus veya gotfocus olaylarına ayrı ayrı yazmak hem yazım açısından kalabalık olur hem de sorun olduğunda çözmede uğraştırır. Çünkü bir değişiklik olduğunda her bir button olayı için ayrı ayrı değiştirmen gerekir.

Bu tip tekrarlı işleri tek bir merkezden kontrol etmek her zaman daha uygun olur, böylece kodların daha sade ve anlaşılır olacaktır.

Senin yazdıklarında hata aramadım (üşendim) o yüzden sana başka bir örnek yazıyorum. Daha anlaşılır ve geliştirilebilir. Sen 2 sıra dört button ile yapmışsın. ben sana 3x3 lük button grubu yaparak örnek verdim. Aynı mantıkla istediğin gibi arttırabilir ve düşürebilirsin sayıyı.

Yöntemde buttonların tag özelliklerine x ve y olarak konum bilgisi yazdım, basılan tuşun cinsine göre de, x,y artıyor veya azalıyor. daha sonra koordinata eşit olan button bulunuyor ve rengi değiştirilip, setfocus oluyor. basitçe..

kolay gelsin

60SLoDQ.png



Kod:
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vkey As Long) As Integer



Dim pozX, pozY As Integer


Private Sub BUTTON_Click(Index As Integer)
    MsgBox BUTTON(Index).Caption & "Tuşuna basıldı"
End Sub


Private Sub form_load()
  Timer1.Interval = 10
  pozX = 1
  pozY = 1
End Sub


Private Sub timer1_timer()
Dim I, T As Integer
Dim Key As Integer
Dim Ctl As Control
Dim PozXY As String


For T = 9 To 255
Key = GetAsyncKeyState(T)
    If Key = -32767 Then
        Select Case T
            Case vbKeyRight:
                pozY = pozY + 1
                If pozY > 3 Then pozY = 1
            Case vbKeyLeft:
                pozY = pozY - 1
                If pozY < 1 Then pozY = 3
            Case vbKeyDown:
                pozX = pozX + 1
                If pozX > 3 Then pozX = 1
            
            Case vbKeyUp:
                pozX = pozX - 1
                If pozX < 1 Then pozX = 3
            
            
        End Select
    End If
    
    GoSub Sifirla
    PozXY = pozX & pozY
    Text1 = PozXY
    For Each Ctl In Me.Controls
        If TypeOf Ctl Is CommandButton Then
            If Ctl.Tag = PozXY Then
                Ctl.BackColor = vbRed
                Ctl.SetFocus
            End If
        End If
    Next
    
Next T
   




Exit Sub
Sifirla:
For I = 0 To 8
    BUTTON(I).BackColor = vbButtonFace
Next I
Return


End Sub



Vb6 proje dosyası : http://yadi.sk/d/qe9TmvHGLaY9M
 

A_day

Öğrenci
Katılım
4 Şubat 2014
Mesajlar
41
Reaksiyon puanı
0
Puanları
6
İlginize teşekkür ediyorum. Ellerinize sağlık..
 
Üst