Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicitÓ e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [Vb.Net]Inizializzazione anormale List Structure
Forum - C# / VB.NET - [Vb.Net]Inizializzazione anormale List Structure

Avatar
amreo (Normal User)
Pro


Messaggi: 93
Iscritto: 18/03/2013

Segnala al moderatore
Postato alle 17:22
Mercoledý, 06/11/2013
Ciao

io sto cercando di fare in modo che se io premo un tasto premuto, esegue l'azione, e se Ŕ ancora premuto, la tPressed viene aumentata, e se supera 360, fa l'azione e ritorna a 0.
io non riesco a capire perchŔ viene sempre Rinizializzata, ritornando il valore di inizio(0).
io per provare ho provato a inizializzarla con 30.
la funzione ScriviDati() scrive le info della struttura.

Tipo progetto: Window Console

Codice sorgente - presumibilmente VB.NET

  1. Imports System.Windows.Forms
  2.  
  3. Module Module1
  4.  
  5.     Sub Main()
  6.         InitInput()
  7.         Do
  8.             Application.DoEvents()
  9.             GetInput()
  10.             ScriviDati()
  11.         Loop
  12.     End Sub
  13.  
  14.     Sub ScriviDati()
  15.         For Each i As ManagerKeyInfo In keyM
  16.             Console.WriteLine("Azione: " & i.ActionName & "Premuto: " & i.Pressed & "TPreseed: " & i.tPressed)
  17.         Next
  18.     End Sub
  19.  
  20.  
  21.     Dim keyM As New List(Of ManagerKeyInfo)
  22.  
  23.     Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Integer) As Short
  24.     Public Function GetKeyState(ByVal key1 As Integer) As Boolean
  25.         Dim s As Short
  26.         s = GetAsyncKeyState(key1)
  27.         If s = 0 Then Return False
  28.         Return True
  29.     End Function
  30.  
  31.     'Ottiene l'elenco di tutti gli Input
  32.     Public Sub GetInput()
  33.         'inserire il codice relativo ai tasti dell' input usare GetKeyState per i tasti
  34.         'controlla ogni tasto necessario
  35.         For Each key As ManagerKeyInfo In keyM
  36.             If key.UpdatePress() = True Then DoActionDisponibili(key)
  37.         Next
  38.  
  39.     End Sub
  40.  
  41.     'Esegui l'azione dei tasti
  42.     Sub DoActionDisponibili(MKI As ManagerKeyInfo)
  43.         Select Case MKI.ActionName
  44.             Case ReceiveActionsName.Null Or ReceiveActionsName.NonImpostato
  45.                 'niente
  46.             Case ReceiveActionsName.Up
  47.             Case ReceiveActionsName.Down
  48.             Case ReceiveActionsName.Left
  49.             Case ReceiveActionsName.Right
  50.  
  51.             Case Else
  52.                 MsgBox("errore")
  53.         End Select
  54.     End Sub
  55.  
  56.     'Inizializza gli input
  57.     Sub InitInput()
  58.         'imposta KP/Tick
  59.         ManagerKeyInfo.tPTick = 20
  60.         'Aggiunge i tasti a keyM con ADD
  61.         '
  62.         keyM.Add(New ManagerKeyInfo(False, ReceiveActionsName.Up, Keys.Up, 30))
  63.         keyM.Add(New ManagerKeyInfo(False, ReceiveActionsName.Down, Keys.Down, 30))
  64.         keyM.Add(New ManagerKeyInfo(False, ReceiveActionsName.Left, Keys.Left, 30))
  65.         keyM.Add(New ManagerKeyInfo(False, ReceiveActionsName.Right, Keys.Right, 30))
  66.     End Sub
  67.  
  68. End Module
  69.  
  70.  
  71. Public Structure ManagerKeyInfo
  72.  
  73.     'indica se il tasto Ŕ premuto
  74.     Friend Pressed As Boolean
  75.  
  76.     'indica quanto tempo Ŕ stato premuto: se supera 360 rifa l'azione di premere
  77.     Friend tPressed As Short
  78.     Friend Const MaxPressed As Short = 360
  79.     Friend Shared tPTick As Short = 10 'tempo di premitura su un Tick
  80.  
  81.     'Indica il testo premuto
  82.     Friend KeyName As Keys
  83.  
  84.     'Nome dell' azione che il tasto deve eseguire
  85.     Friend ActionName As ReceiveActionsName
  86.  
  87.  
  88.     'Costruttori
  89.     Friend Sub New(ByVal tPressed As Short, ByVal ActionName As ReceiveActionsName, ByVal Key As Keys, Optional ByVal Pressed As Boolean = False)
  90.         Me.tPressed = tPressed
  91.         Me.Pressed = Pressed
  92.         Me.ActionName = ActionName
  93.         Me.KeyName = Key
  94.     End Sub
  95.     Friend Sub New(ByVal Pressed As Boolean, ByVal ActionName As ReceiveActionsName, ByVal Key As Keys, Optional ByVal tPressed As Short = 0)
  96.         Me.tPressed = tPressed
  97.         Me.Pressed = Pressed
  98.         Me.ActionName = ActionName
  99.         Me.KeyName = Key
  100.     End Sub
  101.  
  102.     'Settaggio tPress(restituisce true se deve eseguire l'azione)
  103.     Function UpdatePress() As Boolean
  104.         ' Dim PrsChange As Boolean = MainForm.GetKeyState(KeyName)
  105.         Dim PrsChange As Boolean = True 'tecnicamente la riga corretta Ŕ quella sopra, ma per prova uso questa
  106.         Dim EseguiAzione As Boolean = False
  107.         If PrsChange = False Then
  108.             If Pressed = True Then
  109.                 Pressed = False
  110.                 tPressed = 0
  111.             End If
  112.         ElseIf PrsChange = True Then
  113.             If Pressed = True Then
  114.                 Beep()
  115.                 tPressed += tPTick
  116.                 If tPressed >= MaxPressed Then
  117.                     tPressed = 0
  118.                     EseguiAzione = True
  119.                 End If
  120.             ElseIf Pressed = False Then
  121.                 Pressed = True
  122.                 tPressed += tPTick
  123.                 EseguiAzione = True
  124.             End If
  125.         End If
  126.         Return EseguiAzione
  127.     End Function
  128.  
  129. End Structure
  130.  
  131. Friend Enum ReceiveActionsName As SByte
  132.     NonImpostato = -1
  133.     Null = 0
  134.     Up = 1
  135.     Down = 2
  136.     Right = 3
  137.     Left = 4
  138.     'altre azioni
  139. End Enum


Ultima modifica effettuata da amreo il 06/11/2013 alle 17:30
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 17:40
Mercoledý, 06/11/2013
Cosa Ŕ

Keys

?


Ricorda che nessuno Ŕ obbligato a risponderti e che nessuno Ŕ perfetto ...
PM Quote
Avatar
amreo (Normal User)
Pro


Messaggi: 93
Iscritto: 18/03/2013

Segnala al moderatore
Postato alle 17:45
Mercoledý, 06/11/2013
un enum di System.Window.Form

contiene l'elenco di tutti i tasti disponibili sulla tastiera(anche mouse)

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 18:00
Mercoledý, 06/11/2013
Ma quindi il tipo di applicazione deve essere modificata in Win Form ...


Ricorda che nessuno Ŕ obbligato a risponderti e che nessuno Ŕ perfetto ...
PM Quote
Avatar
amreo (Normal User)
Pro


Messaggi: 93
Iscritto: 18/03/2013

Segnala al moderatore
Postato alle 18:16
Mercoledý, 06/11/2013
no, ho aggiunto il riferimento window.form

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 18:23
Mercoledý, 06/11/2013
Ah ... ecco ...

Comunque ... cosa dovrebbe succedere ? Quali tasti provare ?


Ricorda che nessuno Ŕ obbligato a risponderti e che nessuno Ŕ perfetto ...
PM Quote
Avatar
amreo (Normal User)
Pro


Messaggi: 93
Iscritto: 18/03/2013

Segnala al moderatore
Postato alle 18:41
Mercoledý, 06/11/2013
solo i tasti inizializza in InitInput. le freccette: attenzione decommenta la prima linea di UpdatePress e commenta la seconda

PM Quote
Avatar
amreo (Normal User)
Pro


Messaggi: 93
Iscritto: 18/03/2013

Segnala al moderatore
Postato alle 20:16
Venerdý, 08/11/2013
Risolto. funziona come deve funzionare(non ho capito il motivo pero funziona cosi.

ho creato un' altra structure: contiene i risultati di UpdatePress di ManagerKeyInfo
Codice sorgente - presumibilmente VB.NET

  1. Public Structure MKICheckResult
  2.  
  3.     Public Property ActionRun As Boolean
  4.  
  5.     Public Property MKI As ManagerKeyInfo
  6.  
  7.     Public Sub New(ActionRun As Boolean, MKI As ManagerKeyInfo)
  8.         Me.ActionRun = ActionRun
  9.         Me.MKI = MKI
  10.     End Sub
  11. End Structure



ho modificato il tipo della funzione UpdatePress di ManagerKeyInfo da Boolean in MKICheckResult.

ho modificato GetInput: ho dichiarato una variabile
Codice sorgente - presumibilmente C# / VB.NET

  1. Dim MKICR As MKICheckResult


ho sostituito il ciclo for each in ciclo for
Codice sorgente - presumibilmente VB.NET

  1. For i = 0 To KeyM.Count
  2. MKICR = KeyM(i).UpdatePress()
  3.  keyM(i) = New ManagerKeyInfo(MKICR.MKI.Pressed, MKICR.MKI.ActionName, MKICR.MKI.KeyName, MKICR.MKI.tPressed)
  4. Next



l'errore non ho capito qual'Ŕ ma credo che sia dovuto alla lista, che non cambia i valori degli elementi, quindi ho dovuto usare il costruttore.:)




Ultima modifica effettuata da amreo il 08/11/2013 alle 20:17
PM Quote