Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Bug con Select Case in vb5?

Ciao a tutti.
Vabbè che da qualche giorno mi sono messo a dieta e che quindi gli zuccheri
in questo periodo non mi ossigenano tanto il cervello ma, secondo voi:
se io uso
dim Numero as Double
Select Case Numero
    Case Is < 28001
        Label1.Caption = "Il numero è minore di 28.001"
    Case 28001 To 7000000
        Label1.Caption = "Il numero è compreso tra 28.001 e 7.000.000"
    Case 7000001 To 90000000
        Label1.Caption = "Il numero è compreso tra 7.000.001 e 90.000.000"
    Case Is > 90000000
        Label1.Caption = "Il numero è maggiore di 90.000.000"
End Select
non equivale forse a dire
dim Numero as Double
Select Case Numero
    Case Is < 28001
        Label2.Caption = "Il numero è minore di 28.001"
    Case Is > 28000 And Numero < 7000001
        Label2.Caption = "Il numero è compreso tra 28.001 e 7.000.000"
    Case Is > 7000000 And Numero < 90000001
        Label2.Caption = "Il numero è compreso tra 7.000.001 e 90.000.000"
    Case Is > 90000000
        Label2.Caption = "Il numero è maggiore di 90.000.000"
End Select
???
E no, perchè se uso la prima tutto va ok, mentre con la seconda finchè
Numero è minore di 7000001 tutto va bene, mentre se lo supera per lui è
sempre compreso tra 28001 e 7000000 !!
ps: ho vb5 pro con sp3 e uso nt 4.00 sp3
Secondo voi, posso seguità la dieta o me devo magnà zio bill (bollito, così
almeno è un po' più tenero)?
Grazie a tutti.
Max

Tu usa la prima e non ci pensare più... ^___^
Ciao,
moreno
#sirri#@
tin.it
(togliete "#" dall'indirizzo)



In teoria, anch'io non ho trovato difetti e non capisco come mai si comporta
come hai detto, però se ti può essere d'aiuto conosco un
trucchetto per vedere se dei numeri sono conpresi in certi campi:

Allora se hai un numero di tipo intero e vuoi vedere se è compreso
tra 0 e 5, 6 e 10, 11 e 15 puoi fare in questo modo

Select case 
num

case
 <= 5

   
label1.caption
="Compreso tra 0 e 5"

case
 <= 10

   
label1.caption
="Compreso tra 6 e 10"

case
 <= 15

   
label1.caption
="Compreso tra 11 e 15"

In questo modo il prog. controlla se il numero è ad esempio 3
si ferma al primo case, altrimenti va avanti e quindi si sa già
che il numero è maggiore di 5 (altrimenti, come ho detto si fermerebbe
al prico case).

Quindi se il numero è 13 prima controlla se è minore
di 5 e non lo è, poi se è minore di 10 e poi arriva a vedere
se è minore di 15 ed avvia la procedure label1...

Fammi sapere se ti sono stato d'aiuto.

Tango

"Max G." ha scritto:



 wrote in message
7hv47j$8o5$1...@nslave1.tin.it...


 wrote in message
7i0cgf$l03$1...@auth2.ats.it...


Prova a scriverla cosi', dovrebbe funzionare.
Dim Numero As Double
Numero = Text1.Text
Select Case Numero
    Case Is < 28001
        Label2.Caption = "Il numero è minore di 28.001"
    Case Is < 7000000 And Numero > 28001
        Label2.Caption = "Il numero è compreso tra 28.001 e 7.000.000"
    Case Is < 90000001 And Numero > 7000000
        Label2.Caption = "Il numero è compreso tra 7.000.001 e
90.000.000"
    Case Is > 90000000
        Label2.Caption = "Il numero è maggiore di 90.000.000"
End Select
Ciao

???
No, non equivale!
Ma ti sembra che (Is > 28000 And Numero < 7000001) sia un intervallo?
Non ti sembra piuttosto un'operazione logica che ritorna True/False?
E tu dirai "esatto, quindi quando è False dovrebbe saltarlo"
No! Perchè il Select confronta l'operatore (Numero) con quello che sta a
destra del Case (True/False) e se converti False in numero ottieni 0, mentre
con True -1.
Per una proprietà matematica si ha che se Numero è >28000 Numero è anche
maggiore di 0 e quindi ti cadrà sempre in quel ramo.
Case Is > 28000 And Numero < 7000001
equivale a
Case True/False => Case 0/-1
Ma ragazzi... questa volta bastava un po' d'intuizione!
Ciao.

Caro Zanna,
Puoi spiegare perche', secondo il tuo ragionamento, scrivendola in
questo modo funziona?
Dim Numero As Double
Numero = Text1.Text
Select Case Numero
    Case Is < 28001
        Label2.Caption = "Il numero è minore di 28.001"
    Case Is < 7000000 And Numero > 28001
        Label2.Caption = "Il numero è compreso tra 28.001 e 7.000.000"
    Case Is < 90000001 And Numero > 7000000
        Label2.Caption = "Il numero è compreso tra 7.000.001 e
90.000.000"
    Case Is > 90000000
        Label2.Caption = "Il numero è maggiore di 90.000.000"
End Select
Ciao Maurizio

     Case Is < 7000000 And Numero > 28001
se e' piu' piccolo di 7000000 si ferma qui, a prescindere che sia piu'
grande o piu' piccolo di 28001. Ma deve essere per forza piu' grande perche'
altrimenti non sarebbe mai arrivato a fare questo controllo! Quindi "And
Numero > 28001" puo' (potrebbe?) essere tranquillamente omesso, perche' non
influisce sulla scelta. e questo vale per tutti i successivi Case (tranne
ovviamente l'ultimo, che ha una struttura diversa).
Spero di non aver detto stupidaggini immense (e soprattutto di essere stato
chiaro nella mia spiegazione :-) ).
--
ciao
gelty
--
Visita 
http://www.sifor.it
Elimina *toglimi* per le risposte

Mi sembra giusto... ;-)
Quindi and non viene proprio preso in cosiderazione.
Ciao 
maurizio

End Select
In effetti rileggendo attentamente il mio messaggio ci si accorge che quello
che dico non ha molto senso, chissà a cosa stavo pensando :)
Ma il concetto di base è corretto!
Adesso seguimi e ti mostrerò perchè questo algoritmo funziona:
Select Case Numero
    Case Is < 28001
        Label2.Caption = "Il numero è minore di 28.001"
    Case Is < 7000000 And Numero > 28001
        Label2.Caption = "Il numero è compreso tra 28.001 e 7.000.000"
    Case Is < 90000001 And Numero > 7000000
        Label2.Caption = "Il numero è compreso tra 7.000.001 e 90.000.000"
    Case Is > 90000000
        Label2.Caption = "Il numero è maggiore di 90.000.000"
End Select
Sostituisci la parte a destra di Is > con il corrispondente risultato
dell'espressione logica (binaria)
Select Case Numero
    Case Is < 28001
        Label2.Caption = "Il numero è minore di 28.001"
    Case Is < 7000000
        Label2.Caption = "Il numero è compreso tra 28.001 e 7.000.000"
    Case Is < 90000001
        Label2.Caption = "Il numero è compreso tra 7.000.001 e 90.000.000"
    Case Is > 90000000
        Label2.Caption = "Il numero è maggiore di 90.000.000"
End Select
Questo perchè se l'espressione (Numero > xxx) è vera viene tradotta in -1,
che in binario equivale a
11111111
ed un and logico di tipo (11111111 AND xxx) darà sempre xxx, mentre al
contrario (0 AND xxx) darà sempre 0.
Riprova ne è questo case, che secondo te (voi) se l'And non venisse preso in
considerazione non dovrebbe funzionare (e non avrebbe nemmeno molta logica):
'Ho invertito gli operatori dell'And
Select Case Numero
    Case Is < 28001
        Label2.Caption = "Il numero è minore di 28.001"
    Case Is < Numero > 28001 And 7000000
        Label2.Caption = "Il numero è compreso tra 28.001 e 7.000.000"
    Case Is < Numero > 7000000 And 90000001
        Label2.Caption = "Il numero è compreso tra 7.000.001 e 90.000.000"
    Case Is > 90000000
        Label2.Caption = "Il numero è maggiore di 90.000.000"
End Select
Ciao a tutti.

End Select
