Newsgroup: it.comp.lang.visual-basic
Titolo: I punti (della spesa) delle migliaia inseriti al volo

Ciao Raga!
Un suggerimento al volo, in una textbox dove inserisco solo numeri (e se
metto lettere o simili devo dare errore, percio' devo fare un controllo, ma
questo si puo' fare con keypressed) come faccio ad inserire al volo (mentre
digitano) i punti delle migliaia?
Grazie e ciao!
-- 
RedFoxy
A fox around web
Power at fox for a yiffing world!

 digitano) i punti delle migliaia?
    Text1 = Format(Text1, "#,###")
    Text1.SelStart = Len(Text1)
beppe

 Grazie e ciao!
ciaociao

     Text1.SelStart = Len(Text1)
dimenticavo nell'evento change, inoltre modificherei con:
    Text1 = Format(Replace(Text1, ",", "."), "#,###")
 beppe

     Text1 = Format(Replace(Text1, ",", "."), "#,###")
solo se non si prevedono decimali, pero'.
ciao, j.

Ciao,
"javalab" scrive:

in realta' ho detto una minchiata!!! , infatti, utilizzando l'evento change
che mi formatta di volta in volta la stringa, ne il punto ne la virgola
vengono considerati.
la funzione replace di conseguenza e' inutile e incidentalmente, dato il
problema, la prima soluzione era giusta.
nel caso si vogliano considerare decimali e' forse piu' opportuno utilizzare
l'evento keypress, tenendo nella dovuta considerazione le impostazioni
internazionali.
beppe

 Grazie e ciao!
5/6 mesi fa creai una classe da associare ad una textbox per risolvere
questo problema... Si occupava di tutto inclusi i numeri decimali... Non so,
se credete sia utile posso mandarla... Magari al Sito Comune (a proposito, č
di nuovo online?)...
Antonio Mirarchi

 Antonio Mirarchi
Passacela cosi' intanto la vediamo... Cosa fa di preciso oltre i punti
decimali e di migliaia?


 decimali e di migliaia?
No, niente. Serve solo a questo. Ovviamente ti permette di recuperare il
valore come Double... Ecco il codice:
Dim WithEvents m_TextBox As TextBox
Dim m_Separator As String * 1
Dim m_SeparatorDec As String * 1
Dim m_AllowDecimal As Boolean
Dim QuanteCifre As Integer, FlagDec As Boolean, FlagRep As Boolean
Private Sub SettaiFlagsByPos(WPos As Integer)
    If WPos > 0 Then
        QuanteCifre = WPos - InStrRev(m_TextBox.Text, m_Separator, WPos)
        SepDec = (InStrRev(m_TextBox.Text, m_SeparatorDec, WPos) > 0)
    End If
    FlagRep = (WPos <> Len(m_TextBox))
End Sub
Private Sub RiempiSpazi(cc As Integer)
    If m_TextBox.SelStart <= 3 Then Exit Sub
    Dim tmps As String, cj As Integer
    tmps = Replace(Space(3 - cc), " ", "0")
    cj = m_TextBox.SelStart
    m_TextBox.Text = Mid$(m_TextBox.Text, 1, m_TextBox.SelStart - cc) + tmps
+ Mid$(m_TextBox.Text, m_TextBox.SelStart - cc + 1)
    m_TextBox.SelStart = cj + 2
End Sub
Private Sub CancellaCarattereSuccessivo()
    Dim i As Integer
    i = m_TextBox.SelStart
    m_TextBox.Text = Mid$(m_TextBox.Text, 1, i) + Mid$(m_TextBox.Text, i +
2)
    m_TextBox.SelStart = i
End Sub
Private Function CarattereSuccessivo() As String
    CarattereSuccessivo = Mid$(m_TextBox.Text, m_TextBox.SelStart + 1, 1)
End Function
Private Function CaratterePrecedente() As String
    CaratterePrecedente = Mid$(m_TextBox.Text, m_TextBox.SelStart, 1)
End Function
Public Property Get AllowDecimal() As Boolean
    AllowDecimal = m_AllowDecimal
End Property
Public Property Let AllowDecimal(WDEC As Boolean)
    m_AllowDecimal = WDEC
End Property
Public Property Get Value() As Double
    Dim tmps As String
    tmps = Replace(m_TextBox.Text, m_Separator, "")
    If m_SeparatorDec <> "," Then tmps = Replace(tmps, m_SeparatorDec, ",")
    Value = CDbl(tmps)
End Property
Public Property Get TextBox() As TextBox
    Set TextBox = m_TextBox
End Property
Public Property Set TextBox(ByRef WXT As TextBox)
    Set m_TextBox = WXT
    If Len(WXT) > 0 Then WXT.Text = ""
End Property
Public Property Get Separator() As String
    Separator = m_Separator
End Property
Public Property Let Separator(WSEP As String)
    m_Separator = WSEP
End Property
Public Property Get SeparatorDec() As String
    SeparatorDec = m_SeparatorDec
End Property
Public Property Let SeparatorDec(WSEP As String)
    m_SeparatorDec = WSEP
End Property
Private Sub Class_Initialize()
    FlagDec = False
    QuanteCifre = 0
    m_Separator = "."
    m_SeparatorDec = ","
    m_AllowDecimal = True
End Sub
Private Sub Class_Terminate()
    Set m_TextBox = Nothing
End Sub
Private Sub m_TextBox_Click()
    SettaiFlagsByPos m_TextBox.SelStart
End Sub
Private Sub m_TextBox_GotFocus()
    SettaiFlagsByPos m_TextBox.SelStart
End Sub
Private Sub m_TextBox_KeyPress(KeyAscii As Integer)
    If QuanteCifre > 3 Then QuanteCifre = m_TextBox.SelStart -
InStrRev(m_TextBox.Text, m_Separator, m_TextBox.SelStart)
    Dim cj As Integer
    Select Case KeyAscii
        Case 48 To 57                                      'E' un numero da
0 a 9
            If Not FlagRep Then                            'Se il flag di
replace NON è settato
                If FlagDec Then Exit Sub                   'Se il flag del
separatore decimale è settato, scrivi il carattere
                If QuanteCifre = 3 Then                    'Se sono già
state scritte 3 cifre
                    QuanteCifre = 1                        'Setta il
contatore delle cifre a 1
                    cj = m_TextBox.SelStart                'Salva la
posizione attuale nella textbox
                    m_TextBox.Text = m_TextBox.Text + m_Separator    '
Scrivi separatore delle migliaia
                    m_TextBox.SelStart = cj + 1            'Ripristina la
posizione precedente nella textbox
                Else                                       ' Altrimenti (se
non sono state già scritte 3 cifre)
                    QuanteCifre = QuanteCifre + 1          'Incrementa
contatore cifre
                End If
            Else                                           'Se il flag di
replace è settato
                If CarattereSuccessivo = m_Separator Then QuanteCifre = 0
' Se il carattere successivo è il separatore delle migliaia, resetta il
contatore delle cifre
                If CarattereSuccessivo = m_SeparatorDec Then FlagDec = True
'Se il carattere successivo è il separatore dei decimali, setta il flag dei
decimali
                If CarattereSuccessivo = m_Separator Or CarattereSuccessivo
= m_SeparatorDec Then m_TextBox.SelStart = m_TextBox.SelStart + 1    ' Se il
carattere successivo è uno dei separatori, salta di una posizione avanti
nella textbox
                CancellaCarattereSuccessivo
                SettaiFlagsByPos m_TextBox.SelStart + 1
                FlagRep = (m_TextBox.SelStart <> Len(m_TextBox))
            End If
        Case 8                                             'E' il backspace
            If FlagRep Then GoTo AnnullaEdEsci             'Se il flag di
replace è settato, annulla il carattere
            If m_TextBox.SelStart = 0 Then GoTo AnnullaEdEsci    'Se siamo
ad inizio casella, cancella il carattere
            If CaratterePrecedente = m_Separator Or CaratterePrecedente =
m_SeparatorDec Then    'Se il carattere precedente è uno dei separatori
                If CaratterePrecedente = m_SeparatorDec Then FlagDec = False
'Se il carattere precedente è il separatore dei decimali resetta il flag
relativo
                QuanteCifre = 3                            'Imposta
contatore delle cifre a 3
            Else                                           'Altrimenti (se
il carattere precedente non è un separatore)
                If Not FlagDec Then QuanteCifre = QuanteCifre - 1
'Decrementa il contatore delle cifre se il flag dei decimali non è settato
            End If
        Case Asc(m_Separator)                              'E' il separatore
delle migliaia
            If FlagRep Then GoTo AnnullaEdEsci             'Se il flag di
replace è settato, annulla il carattere
            If FlagDec Then GoTo AnnullaEdEsci             'Se il separatore
decimale è settato, annulla il carattere!
            If QuanteCifre < 3 Then RiempiSpazi QuanteCifre 'Se non sono
state scritte 3 cifre nel gruppo precedenti, riempi con degli zeri gli spazi
vuoti
            QuanteCifre = 0                                'Azzera contatore
cifre
        Case Asc(m_SeparatorDec)                           'E' il separatore
dei decimali
            If Not m_AllowDecimal Then GoTo AnnullaEdEsci       'Se non è
consentito l'uso di decimali, annulla il carattere
            If FlagRep Then GoTo AnnullaEdEsci             'Se il flag di
replace è settato, annulla il carattere
            If FlagDec Then GoTo AnnullaEdEsci             'Se è già stato
scritto il separatore dei decimali (FlagDec = True), annulla il carattere!
            If QuanteCifre < 3 Then RiempiSpazi QuanteCifre 'Se non sono
state scritte 3 cifre nel gruppo precedenti, riempi con degli zeri gli spazi
vuoti
            FlagDec = True                                 'Setta il flag
dei decimali
        Case Else                                          'Se è un'altro
carattere
            GoTo AnnullaEdEsci                             'Non scriverlo
perchè non è valido
    End Select
    Exit Sub
AnnullaEdEsci:
    KeyAscii = 0
End Sub
Antonio Mirarchi