Newsgroup: it.comp.lang.visual-basic
Titolo: Qualche problemino facile (per voi!)

Mi sto accorgendo che il VB, per quanto potente, mi sta creando problemi che
in C, C++ o in Turbo Pascal non avevo mai avuto! Sto creando un programma
per la gestione delle scommesse calcistiche, e ho un mare di piccoli
problemi, tutti relativi a piccole cose... ma senza una mano non credo di
venirne a capo tanto presto!
Allora: In un form ho 8 textbox in cui vanno inseriti i valori numerici
delle quote, ma non riesco ad implementare un controllo decente sul formato.
Attualmente uso una procedura del genere (la variabile sk mi serve a far si
che il messaggio di errore venga dato solo la prima volta, successivamente
non accetta proprio i caratteri non numerici):
Private Sub Text1_change()
  If IsNumeric(Text1.Text) Then
    Uno(gare) = Text1.Text
    Else: If sk = 0 Then Msgbox "Errore! Il tipo di dati immesso deve essere
numerico!", vbExclamation, "Errore tipo di dati"
          SendKeys "{backspace}"
          sk = 1
    End If
  If Text1.Text = "" Then
    Msgbox "Non e' stato immesso un numero, considero il valore corrente
pari a zero"
    Uno(gare) = 0
  End If
End Sub
Questa procedura mi serve per passare il controllo alla textbox successiva.
Private Sub Squadra1_KeyDown(KeyCode As Integer, Shift As Integer)
  If KeyCode = vbKeyReturn Then Squadra2.SetFocus
End Sub
Riepilogando, ho 3 problemi:
1) Come faccio ad assicurarmi che siano inserirti dati numerici (con massimo
2 cifre decimali)? L'espressione isnumeric vedo che non funziona affatto, mi
accetta anche numeri con piu' di un punto come 1.2.3.4.5 e quando poi provo
a visualizzare il valore immesso in Uno(gare), mi trovo 12345 senza punti,
come se i punti li ignorasse!
2) Perche' quando nella textbox8, l'ultima, premendo solo invio non ho il
messaggio che ho nelle altre 7 (considera il valore zero) ma ho un errore di
run-time "chiamata di routine o argomento non valido"? Probabilmente e'
perche' passo il controllo ad un command button e non ad una textbox, non e'
permesso?
3) I valori alla fine li inserisco in un file... ma quando vado poi ad
aprirlo, vedo che sono stati inseriti solo spazi! Eppure quando passo i
valori ai campi che costituiscono il record del file, i valori ci sono!
   Cas = Casa(i)
    Fuo = Fuori(i)
    Un = Uno(i)
    Ic = Ics(i)
    Du = Due(i)
    Unic = Unoics(i)
    Icdu = Icsdue(i)
    Undu = Unodue(i)
    Ov = Over(i)
    Und = Under(i)
    Put #filenum, i, rec
La sintassi credo sia corretta, ecco come ho aperto il file:
Sub aprifile()
  reclenght = LenB(rec)
  filenum = FreeFile
  Open "quote.bet" For Random As filenum Len = reclenght
End Sub
Non riesco proprio a capire perche' i valori ci siano, ma l'istruzione PUT
vada ad inserire solo degli spazi nel file!!!
Grazie 1000 a chi mi sapra' aiutare!

>    Put #filenum, i, rec
Cos'e' rec?
Antonio




Il Tue, 7 Mar 2000 16:00:21 +0100, "-> Dave <-" <da...@hate.spam> ha
scritto:
|:>Non sono sicuro che sia per questo, ma prova a fare, invece di
|:>IsNumeric(text1.text) a scrivere :
|:>
|:>IsNumeric(Val(Text1.text))
|:>
|:>forse cosi' funziona.
Cosi' il risultato sara' sempre True perche' la Val restituira' sempre zero
(prova a fare Val("a"))...
Prova piuttosto a fare
On error resume next
Uno(gare) = Clng(Text1.Text)
If err.number <> 0 then .....
Comunque io ho utilizzato la routine scritta sotto per il controllo di
campi numerici, facendo in modo che il carattere non numerico non appaia
proprio (considera che l'ho scritta due anni fa e non l'ho piu'
rivisitata... potrebbe essere migliorata...)
Paperina*
-------------------------------------------------------------------------------------------------
Private Sub txtImporto_Change(Index As Integer)
 
Dim nCursorPos  As Integer
Dim nLen        As Integer
    nCursorPos = txtImporto(Index).SelStart
    nLen = Len(txtImporto(Index).Text)
    txtImporto(Index).Text = _
            Format$(ValoreNumerico(txtImporto(Index)), "#,###,###,###")
 
    Select Case Len(txtImporto(Index).Text)
        Case Is > nLen
            txtImporto(Index).SelStart = nCursorPos + 1
        Case Is = nLen
            txtImporto(Index).SelStart = nCursorPos
        Case Is < nLen And nCursorPos > 0
            txtImporto(Index).SelStart = nCursorPos - 1
    End Select
 
    txtImporto(Index).SelLength = 0
End Sub
Public Function ValoreNumerico(sNumero As String) As Double
Dim sNumAppo    As String
Dim i           As Integer
    sNumAppo = ""
    For i = 1 To Len(sNumero)
        If IsNumeric(Mid(sNumero, i, 1)) Then
            sNumAppo = sNumAppo & Mid(sNumero, i, 1)
        End If
    Next i
    If sNumAppo <> "" Then
        ValoreNumerico = Val(sNumAppo)
    Else
        ValoreNumerico = 0
    End If
End Function

>    Put #filenum, i, rec
Cos'e' rec?
rec e' il record del file:
Type campi
  Cas As String * 20
  Fuo As String * 20
  Un As Currency
  Ic As Currency
  Du As Currency
  Unic As Currency
  Icdu As Currency
  Undu As Currency
  Ov As Currency
  Und As Currency
End Type
Public rec As campi

 Ciao, DaVe
Ciao!

>Public rec As campi
.. e quindi le assegnazioni a cui facevi riferimento sono tutte del tipo rec.cas =... Mi sembra di ricordare che ci fosse scritto solo cas =...
Nel secondo caso (a parte il fatto che con option explicit in testa al modulo il compilatore ti darebbe subito errore) non funzionerebbe naturalmente perche' assegneresti delle variabili indipendenti e non i campi del tipo (ma magari ho capito male).
Antonio

 forse cosi' funziona.
Ho provato, ma purtroppo continua ad accettare anche numeri con piu' di un
punto!

 rivisitata... potrebbe essere migliorata...)
E' buona come routine, ma credo abbia il problema di gestire solo valori
interi!
La funzione Isnumeric, non so per quele motivo, accetta giustamente solo una
virgola, ma accetta anche piu' punti, che poi ignora.
Mi spiego meglio: se inserisco 3,5 e' tutto ok, una seconda virgola o una
lettera o un altro carattere dopo il 5 non lo posso mettere, il controllo
che faccio su isnumeric(text1.text) mi trova l'errore e con la sendkeys
mando un backspace a cancellare la seconda virgola o il carattere errato.
Ma posso tranquillamente inserire 3.4.23.2 che mi sara' letto come
34232!!!!! I punti per isnumeric e' come se non fossero caratteri proibiti,
ma dei caratteri "fantasma", che ignora completamente! E non riesco a capire
il perche'!
Per non parlare poi di un altro fatto, quando passo da una textbox ad
un'altra con tab va tutto bene; se passo con invio (richiamo text1_keydown
in questa maniera)
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
  If KeyCode = vbKeyReturn Then Text2.SetFocus
End Sub
Bene, quando passo in text2 sento un "beep". Puo' essere una caratteristica
del setfocus il beep quando il controllo passa ad un altro oggetto? Sul
libro di VB che mi sono fatto prestare non c'e' scritto nulla a riguardo!

.. e quindi le assegnazioni a cui facevi riferimento sono tutte del tipo
rec.cas =... Mi sembra di ricordare che ci fosse scritto solo cas =...
Infatti era cosi'! Adesso ho aggiunto rec e va tutto bene!
Nel secondo caso (a parte il fatto che con option explicit in testa al
modulo il compilatore ti darebbe subito errore) non
Che ti posso dire? Il compilatore non dava nessun errore, funzionava tutto
ma non scriveva ovviamente nulla nel file, solo spazi!
Grazie!

 ha scritto:
|:>> On error resume next
|:>> Uno(gare) = Clng(Text1.Text)
|:>
|:>Ma clng va bene solo per numeri interi! Nel mio caso ci possono essere fino
|:>a 2 cifre decimali!
Beh, c'e' anche la CDbl ed altre funzioni di conversione.... puoi vedere
l'help....
|:>> Comunque io ho utilizzato la routine scritta sotto per il controllo di
|:>> campi numerici, facendo in modo che il carattere non numerico non appaia
|:>> proprio (considera che l'ho scritta due anni fa e non l'ho piu'
|:>> rivisitata... potrebbe essere migliorata...)
|:>
|:>E' buona come routine, ma credo abbia il problema di gestire solo valori
|:>interi!
|:>La funzione Isnumeric, non so per quele motivo, accetta giustamente solo una
|:>virgola, ma accetta anche piu' punti, che poi ignora.
|:>[CUT]
Ti prometto che domani mattina rivedo un po' la questione e forse ti sapro'
essere di maggiore aiuto.... parola di papscout!!
Paperina*

libro di VB che mi sono fatto prestare non c'e' scritto nulla a riguardo!
fa così per il tasto invio premuto in una TextBox non multiline (credo).
la soluzione è impostare il KeyCode a 0, non so se nel KeyDown funziona,
fatto nel Key_Press (col KeyAscii) va benissimo
Faber

 ha scritto:
|:>
|:>|:>> On error resume next
|:>|:>> Uno(gare) = Clng(Text1.Text)
|:>|:>
|:>|:>Ma clng va bene solo per numeri interi! Nel mio caso ci possono essere fino
|:>|:>a 2 cifre decimali!
|:>
|:>Beh, c'e' anche la CDbl ed altre funzioni di conversione.... puoi vedere
|:>l'help....
|:>Ti prometto che domani mattina rivedo un po' la questione e forse ti sapro'
|:>essere di maggiore aiuto.... parola di papscout!!
Come promesso ho continuato a dare un'occhiata ed ho verificato che
effettivamente anche la funzione che ti dicevo, la Cdbl(x) tratta i punti
come caratteri fantasma, ma forse questo e' un falso problema perche' mano
mano puoi riformattare il campo (anche la calcolatrice se premi piu' volte
il punto - che nel suo caso vuol dire virgola - la accetta soltanto la
prima volta...)
Paperina*

 essere di maggiore aiuto.... parola di papscout!!
Beh, grazie 1000!!!

 fatto nel Key_Press (col KeyAscii) va benissimo
Che codice dovrei scrivere? Attualmente le procedure sono tutte del tipo
Private Sub Squadra1_KeyDown(KeyCode As Integer, Shift As Integer)
  If KeyCode = vbKeyReturn Then Squadra2.SetFocus
End Sub
cioe' dovrei mettere dopo il then prima keycode=0 e poi squadra2.setfocus?

 prima volta...)
Ok, ma e' comunque un artificio, possibile che non ci sia niente di piu'
semplice?
Il VB mi stupisce sempre di piu', potentissimo, ma a volte davvero
complicato in certe cose che per altri linguaggi molto meno potenti sono
quasi immediate!!!