Android Question Unknown problem with Select Case

QtechLab

Active Member
Licensed User
Longtime User
Goodmorning everyone,

This morning i was coding a Select Case statement with many conditions.
The statement is based on "True" condition
Cattura01.JPG



I got this error back:

Cattura02.JPG


I really don't understand why the error comes out.

This is the sub with the Select Case statemant:


B4X:
Sub RegistraEvento(Event() As Byte) As Object
    Dim NumDay As Byte, vDay As Byte, vMonth As Byte, vYear As Byte
    Dim vHour As Byte, vMin As Byte, vSec As Byte
    Dim vEv(4) As Byte, vState(4) As Double, vStato As Double, StrStato As String

    NumDay = Bit.ShiftRight(Event(0), 5)
    vDay = Bit.And(Event(0), 0x1F)
    vMonth = Bit.ShiftRight(Event(1), 4)
    vYear = Bit.Or(Bit.And(Bit.shiftleft(Event(1), 3), 0x78), Bit.ShiftRight(Event(2), 5))
    vHour = Bit.And(Event(2), 0x1F)
    vMin = Bit.ShiftRight(Event(3), 2)
    vSec =  Bit.Or((Bit.And(Bit.ShiftLeft(Event(3),4), 0x30)) , Bit.ShiftRight(Event(4) , 4))
    vEv(0) = Event(5)'Asc(Strings.Mid2(strEvent, 6, 1))
    vEv(1) = Event(6)
    vEv(2) = Event(7)
    vEv(3) = Bit.And(Event(4), 0xF)
  
    vStato = numfnc.DWord2Num2(Array(Event(8), Event(9), Event(10), Event(11)), False)
  
    Dim cmdValue As Byte = vEv(0)
    Dim EvString As String = CodeStringMap.Get(600 + cmdValue)

    Select True
      
        Case cmdValue = MEMO_CODICE_VARIAZIONE_STATO
            Dim indexCode As Int = CodeIndex(vEv(1), vEv(2))
            EvString = GetString(EvString, Array(mapCodici.Get(indexCode), DisplayState(vStato)))
'            'NewEvento.Tipo = 1
             
        Case cmdValue = MEMO_ALLARME_LINEE_CENTRALE
            EvString = GetString(EvString, Array(mapIngressi.Get(vEv(1) +1), (vEv(2) / 10), DisplayState(vStato)))
      
        Case cmdValue = MEMO_ALLARME_LINEE_XESP
            EvString = GetString(EvString, Array((vEv(1) + 1), mapIngressi.Get(vEv(3) +1), (vEv(2) / 10), DisplayState(vStato)))
         
        Case cmdValue = MEMO_ALLARME_TAMPER_TERMINALI Or cmdValue = MEMO_ALLARME_GUASTO_TERMINALI
            EvString = GetString(EvString, Array(vEv(1) + 1))
          
        Case cmdValue = MEMO_ALLARME_GUASTO_XESP
            EvString = GetString(EvString, Array(vEv(1) + 1))
          
        Case cmdValue = MEMO_ALLARME_GUASTO_XSEU
            EvString = GetString(EvString, Array(vEv(1) + 1))
            'Case MEMO_ALLARME_GUASTO_MODEM

            'Case MEMO_ALLARME_CODICE_FALSO

        Case cmdValue =   Or cmdValue = MEMO_DIGITAZIONE_CODICE_ERRATO_PC Or cmdValue = MEMO_MODEM_CODICE_ERRATO
            EvString = GetString(EvString, Array("CodiceErrato"))
          
        Case cmdValue >= MEMO_INSUFFICIENZA_RETE And cmdValue <= MEMO_FINE_TEST_BATTERIE_XC2000
            EvString = GetString(EvString, Array(vEv(1) / 10))
          
        Case cmdValue = MEMO_DIGITAZIONE_CODICE
            EvString = GetString(EvString, Array((vStato + 1), (vEv(1) + 1)))
          
        Case cmdValue = MEMO_TIMER_VARIAZIONE_STATO
            EvString = GetString(EvString, Array(DisplayState(vStato)))
          
        Case cmdValue = MEMO_CHIAVE_VARIAZIONE_STATO
            EvString = GetString(EvString, Array(DisplayState(vStato)))

        Case cmdValue = MEMO_MODEM_VARIAZIONE_STATO
            Dim indexCode As Int = CodeIndex(vEv(1), vEv(2))
            EvString = GetString(EvString, Array(mapCodici.Get(indexCode), DisplayState(vStato)))

        Case cmdValue >= MEMO_ALLARME_TAMPER_LINEE_CENTRALE And cmdValue <= MEMO_IMPULSO_LINEE_CENTRALE
            'EvString = GetString(EvString, Array((vEv(1) + 1), (vEv(2) / 10), DisplayState(vStato)))
            EvString = GetString(EvString, Array(mapIngressi.Get(vEv(1) +1), (vEv(2) / 10), DisplayState(vStato)))
          
        Case cmdValue = MEMO_GRUPPI_AUTOMATICI_VARIAZIONE
            EvString = GetString(EvString, Array(DisplayState(vStato)))

        Case cmdValue >=  MEMO_SOVRATENSIONE_RETE And cmdValue <= MEMO_RESTORE_FUSIBILE_RS485
            EvString = GetString(EvString, Array(vEv(1) / 10))
          
        Case cmdValue = MEMO_DIGITAZIONE_CODICE_FUORI_ORARIO
            EvString = GetString(EvString, Array(mapCodici.Get(vStato + 1), (vEv(1) + 1)))
          
        Case cmdValue = MEMO_DIGITAZIONE_CODICE_COMANDO_USCITE
            Dim tmp As String
            If vEv(2) = 0 Then
                tmp = "OFF"
            Else
                tmp = "ON"
            End If
            EvString = GetString(EvString, Array(mapCodici.Get(Bit.And(vStato, 65535)), Bit.And(vStato, 4294901760.0), tmp, (vEv(1) + 1)))
          
        Case cmdValue = MEMO_START_TEST_BATTERIE_XESP
            EvString = GetString(EvString, Array((vEv(1) + 1), (vEv(2) / 10)))
          
        Case cmdValue = MEMO_STOP_TEST_BATTERIE_XESP
            EvString = GetString(EvString, Array((vEv(1)), (vEv(2) / 10), (vStato)))

        Case cmdValue = MEMO_ALLARME_GRUPPO
            Dim str As StringFunctions
            str.Initialize
            EvString = GetString(EvString, Array(str.mid(Settori, vEv(1), 1)))
        Case cmdValue = MEMO_ADATTAMENTO_ORA_LEGALE
            Dim tmp As String
            If vEv(1) = 0 Then
                tmp = "OFF"
            Else
                tmp = "ON"
            End If
            EvString = GetString(EvString, Array(tmp))
          
        Case cmdValue >= MEMO_ALLARME_TAMPER_LINEE_XESP And cmdValue <= MEMO_ALLARME_TAMPER_LINEE_XESP_PROVA
            EvString = GetString(EvString, Array(Bit.And(vEv(3), 15), vEv(1), DisplayState(vStato)))
          
       Case cmdValue >= MEMO_INSUFFICIENZA_RETE_XESP And cmdValue <= MEMO_RESTORE_FUSIBILE_RIVELATORI_XESP
            EvString = GetString(EvString, Array(vEv(1), vEv(2) / 10))
          
        Case cmdValue = MEMO_FALLITO_TEST_BATTERIE_XC2000
            EvString = GetString(EvString, Array(vEv(1) / 10))
          
        Case cmdValue = MEMO_FALLITO_TEST_BATTERIE_XESP
            EvString = GetString(EvString, Array(vEv(1), vEv(2) / 10))
          
        Case cmdValue = MEMO_IMPULSO_LINEA_XESP
            EvString = GetString(EvString, Array(Bit.And(vEv(3), 15), vEv(1), DisplayState(vStato)))
          
        Case cmdValue = MEMO_ALLARME_CORTOCIRCUITO_LINEE_CENTRALE Or cmdValue = MEMO_ALLARME_CORTOCIRCUITO_LINEE_CENTRALE_PROVA
            EvString = GetString(EvString, Array(vEv(1), DisplayState(vStato)))
          
       Case cmdValue = MEMO_ALLARME_CORTOCIRCUITO_LINEE_XESP Or cmdValue = MEMO_ALLARME_CORTOCIRCUITO_LINEE_XESP_PROVA
            EvString = GetString(EvString, Array(Bit.And(vEv(3), 15), vEv(1), DisplayState(vStato)))
          
        Case cmdValue = MEMO_DIGITAZIONE_CODICE_PROGRAMMAZIONE
            EvString = GetString(EvString, Array(mapCodici.Get(vStato + 1), (vEv(1) + 1)))

        Case cmdValue = MEMO_CODICE_DIRETTO_VARIAZIONE_STATO
            Dim tmp As String
            If vStato = 0 Then
                tmp = "OFF"
            Else
                tmp = "ON"
            End If
            EvString = GetString(EvString, Array(mapCodici.Get(CodeIndex(vEv(1), vEv(2))), vEv(3), tmp))

        Case cmdValue = MEMO_MODEM_CODICE_ESCLUSIONI
            EvString = GetString(EvString, Array(mapCodici.Get(vStato + 1)))
            'Case MEMO_DIGITAZIONE_CODICE_ERRATO_XMANAGER

            'Case MEMO_PROXY_ERRATA

            'Case MEMO_REGISTRAZIONE_CARD

        Case cmdValue = MEMO_AUTORIATTIVAZIONE_SETTORI
            EvString = GetString(EvString, Array(DisplayState(vStato)))
           ' NewEvento.Tipo = 1
          
        Case cmdValue = MEMO_RIPRISTINO_LINEE_CENTRALE
            EvString = GetString(EvString, Array(mapIngressi.Get(vEv(1) +1), DisplayState(vStato)))
          
        Case cmdValue = MEMO_RIPRISTINO_LINEE_XESP
            EvString = GetString(EvString, Array(Bit.And(vEv(3), 15), vEv(1), DisplayState(vStato)))
          
        Case cmdValue = MEMO_TACITAZIONE_ALLARMI
            EvString = GetString(EvString, Array(mapCodici.Get(vStato), vEv(1)))

            'Case MEMO_TACITAZIONE_ALLARMI_XMANAGER

        Case cmdValue = MEMO_TACITAZIONE_ALLARMI_MODEM
            EvString = GetString(EvString, Array(vStato))

            'Case MEMO_XINFOCEL_SOPRAVVIVENZA
            ' Non necessario
          
        Case cmdValue = MEMO_XINFOCEL_CODICI_FALSI_REMOTE Or cmdValue = MEMO_XINFOCEL_RAPINA
            EvString = GetString(EvString, Array("nonumber"))'GetTelephoneNumber(vEv(1), vEv(2), vEv(3), vStato))
          
            'Case MEMO_XINFOCEL_PREPAGATA
            ' Non necessario
            'Case MEMO_XINFOCEL_LOW_SIGNAL
            ' Non necessario
            'Case MEMO_XINFOCEL_GSM_FAULT
            ' Non necessario
          
        Case cmdValue = MEMO_RADIO_CRYPTO_VARIAZIONE_STATO
            EvString = GetString(EvString, Array(vEv(2), DisplayState(vStato)))
           ' NewEvento.Tipo = 1
          
        Case cmdValue = MEMO_RADIO_CRYPTO_DIRETTO_VARIAZIONE_STATO
            Dim tmp As String
            If vStato = 0 Then
                tmp = "OFF"
            Else
                tmp = "ON"
            End If
            EvString = GetString(EvString, Array(vEv(2), tmp))
            'NewEvento.Tipo = 1

       Case cmdValue = MEMO_GUASTO_BATTERIA_SIRENA Or cmdValue = MEMO_GUASTO_FUSIBILE_SIRENA Or cmdValue = MEMO_INIZIO_TEST_BATTERIA_SIRENA Or cmdValue = MEMO_FINE_TEST_BATTERIA_SIRENA
            EvString = GetString(EvString, Array(vEv(1), vEv(2) / 10))
          
       Case cmdValue = MEMO_GUASTO_COMUNICAZIONE_SIRENA Or cmdValue = MEMO_GUASTO_ALTOPARLANTE_SIRENA Or cmdValue = MEMO_ALLARME_TAMPER_SIRENA Or cmdValue = MEMO_RIVELAZIONE_PROXY_SIRENA
            EvString = GetString(EvString, Array( vEv(1)))
          
       Case cmdValue = MEMO_ATTIVAZIONE_RAPIDA_TOTALE Or cmdValue = MEMO_ATTIVAZIONE_RAPIDA_PARZIALE Or cmdValue = MEMO_ATTIVAZIONE_RAPIDA_VISION
            EvString = GetString(EvString, Array(vEv(3), DisplayState(vStato)))
            'NewEvento.Tipo = 1
          
       Case cmdValue = MEMO_RAPINA_VISION
            EvString = GetString(EvString, Array(vEv(2)))
          
       Case cmdValue = MEMO_THERMOPOINT_MINIMA Or cmdValue = MEMO_THERMOPOINT_MASSIMA
            EvString = GetString(EvString, Array(vEv(1), vEv(2)))
            'Case MEMO_CODICE_COMANDO_PORTA
          
        Case cmdValue = MEMO_POWERCONTROLLER_OVERCURRENT
            EvString = GetString(EvString, Array(vEv(3)))
          
        Case cmdValue = MEMO_ALLARME_LINEE_CENTRALE_C1
            EvString = GetString(EvString, Array(mapIngressi.Get(vEv(1) +1)))
            'If GestioneEvento Then frmMain.Allarme(Centrale, vEv(1), TYPE_LINE_WLINK)
          
        Case cmdValue = MEMO_ALLARME_LINEE_CENTRALE_C2
            EvString = GetString(EvString, Array(mapIngressi.Get(vEv(1) +1)))
            'If GestioneEvento Then frmMain.Allarme(Centrale, vEv(1), TYPE_LINE_WLINK)
          
        Case cmdValue = MEMO_ALLARME_LINEE_CENTRALE_MEMS_REMOVAL
            EvString = GetString(EvString, Array(mapIngressi.Get(vEv(1) +1)))
           ' If GestioneEvento Then frmMain.Allarme(Centrale, vEv(1), TYPE_LINE_WLINK)
          
        Case cmdValue = MEMO_ALLARME_LINEE_CENTRALE_MEMS_VIBRO
            EvString = GetString(EvString, Array(mapIngressi.Get(vEv(1) +1)))
           ' If GestioneEvento Then frmMain.Allarme(Centrale, vEv(1), TYPE_LINE_WLINK)
          
        Case cmdValue = MEMO_ALLARME_LINEE_CENTRALE_MASKING
            EvString = GetString(EvString, Array(mapIngressi.Get(vEv(1) +1)))
          
        Case cmdValue = MEMO_ALLARME_TAMPER_SIRENA_WLINK
            EvString = GetString(EvString, Array(vEv(1) + 1))
          
        Case cmdValue = MEMO_GUASTO_BATTERIA_SIRENA_WLINK
            EvString = GetString(EvString, Array(vEv(1) + 1))
          
        Case cmdValue = MEMO_GUASTO_SUPERVISIONE_SIRENA_WLINK
            EvString = GetString(EvString, Array(vEv(1) + 1))
          
        Case cmdValue = MEMO_ALLARME_CANALE
            EvString = GetString(EvString, Array(mapCanali.Get(vEv(1) +1)))
            'If GestioneEvento Then frmMain.Allarme(Centrale, vEv(1), TYPE_LINE_WLINK)
          
        Case cmdValue = MEMO_ALLARME_TAMPER_CANALE
            EvString = GetString(EvString, Array(mapCanali.Get(vEv(1) +1)))
          
    End Select
   

    Dim nDay, day, month, year, hour, mins As String
    nDay= days(NumDay)
    day = vDay
    If vDay<10 Then day = "0" & vDay
    month = vMonth
    If vMonth<10 Then month = "0" & vMonth
  
    year = 2000 + vYear
    hour = vHour
    mins = vMin
    If vMin<10 Then mins = "0" & vMin
  
    Dim dateString As String
    dateString = nDay & " " & day & "/"& month & "/" & year & "  " & hour & ":" & mins

    Return Array(dateString, EvString)
  
End Sub
 

eurojam

Well-Known Member
Licensed User
Longtime User
TRUE is a reserved word, the correct syntax should be like
B4X:
    Select cmdValue
     
        Case MEMO_CODICE_VARIAZIONE_STATO
            Dim indexCode As Int = CodeIndex(vEv(1), vEv(2))
            EvString = GetString(EvString, Array(mapCodici.Get(indexCode), DisplayState(vStato)))
'            'NewEvento.Tipo = 1
            
        Case MEMO_ALLARME_LINEE_CENTRALE
            EvString = GetString(EvString, Array(mapIngressi.Get(vEv(1) +1), (vEv(2) / 10), DisplayState(vStato)))
....

End select
If cmdValue is a string you should use 'MEMO_CODICE_VARIAZIONE_STATO'
 
Upvote 0

QtechLab

Active Member
Licensed User
Longtime User
B4X:
Select cmdValue

gave me error: "Cannot cast: {type=boolean, Rank=0, RemoteObject=false} to number"

Why the missing parameter error? Select true should always working, such as While True, ecc...
 
Upvote 0

Troberg

Well-Known Member
Licensed User
Longtime User
Just for the record, Select True works, and is a very nice construct in some cases, to avoid lots of nested if - elseif.

Example:

B4X:
Select True
  Case Bit0=0 and Bit1=0 and Bit2=0 and Bit3=0
    'Do something for this case
  Case Bit0=1 and Bit1=0 and Bit2=0 and Bit3=0
    'Do something for this case
  Case Bit0=0 and Bit1=1 and Bit2=0 and Bit3=0
    'Do something for this case
  Case Bit0=1 and Bit1=1 and Bit2=0 and Bit3=0
    'Do something for this case
'Continue with the rest of the cases...
End Select
 
Upvote 0
Top