none
[VS 2015] premere un tasto sulla tastiera e scriverne un'altro RRS feed

  • Domanda

  • Buongiorno a tutti, utilizzando questo codice:

     Private Sub DatiModificati_KeyPress(sender As Object, e As KeyPressEventArgs) Handles _
            SaldoIniziale.KeyPress, SaldoFinale.KeyPress, TotalePresunto.KeyPress, TotaleEvaso.KeyPress,
            ImportoFido.KeyPress, TotaleImpFat.KeyPress, TotaleImpFatEvaso.KeyPress
            '------ Controllare il flag viene impostato nell'evento KeyDown. ------------------------
            If nonNumberEntered = True Then
                'Fermare il personaggio venga stipulato il controllo dal momento che è non-numerico.
                e.Handled = True
            End If
            pressionetasto = True
    
        End Sub
        Private Sub SaldoIniziale_KeyDown(sender As Object, e As KeyEventArgs) Handles SaldoIniziale.KeyDown
            '------ da inserire in TextBox_KeyDown ----------------------------
            'Inizializza il flag su false.
            nonNumberEntered = False
    
            'Determinare se il tasto è un numero della parte superiore della tastiera.
            If e.KeyCode < Keys.D0 OrElse e.KeyCode > Keys.D9 Then
                'Determinare se il tasto è un numero del tastierino.
                If e.KeyCode < Keys.NumPad0 OrElse e.KeyCode > Keys.NumPad9 Then
                    'Determinare se il tasto è un ",".
                    If e.KeyCode <> Keys.Oemcomma Then
                        'Determinare se il tasto è un backspace.
                        If e.KeyCode <> Keys.Back Then
                            'È stato premuto un tasto non numerico.
                            'Impostare il flag su true e valutare in evento KeyPress.
                            nonNumberEntered = True
                        End If
                    End If
                End If
            End If
    
            'Se è stato premuto il tasto shift, non è un numero.
            If Control.ModifierKeys = Keys.Shift Then
                nonNumberEntered = True
            End If
    
        End Sub

    per far scrivere soltanto i numeri e la virgola "," in alcune caselle testo, stavo cercando il modo di poter far scrivere la virgola "," anche con la pressione del tasto punto "." sia quello sulla riga dello shift che quello del tastierino numerico....ma continuo a sbattere la testa...

    qualcuno riesce ad aiutarmi?

    Grazie

    Guido

    giovedì 2 aprile 2020 10:39

Risposte

  • Si, li ci devi mettere la virgola, in quanto il sistema interpreta quello che hai scritto nel tuo modo di scrivere (hai le impostazioni italiane, dove la parte decimale si scrive dopo una virgola) e traduce la tua rappresentazione di un numero, in un numero.

    Però solo ora ho capito cosa intendi fare, ad una prima lettura tra tabelle di database, impostazioni ed altro, non avevo capito.

    Per sostituire il punto, sia quello del tastierino numerico e "sia quello sulla riga dello shift" puoi intercettare la pressione del tasto sulla tastiera nell'evento KeyPress, e sostituire il valore KeyChar dell'argomento ti tipo KeyPressEventArgs.

    Fatto al volo:

        Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
            If e.KeyChar = "." Then e.KeyChar = ","
        End Sub

    • Contrassegnato come risposta Guido.G giovedì 2 aprile 2020 19:02
    giovedì 2 aprile 2020 18:20

Tutte le risposte

  • Praticamente in qualsiasi linguaggio di programmazione che puoi menzionare, i decimali sono rappresentati da un punto, non da una virgola. Se i tuoi utenti si aspettano una virgola, convertila per scopi di visualizzazione e immissione, ma dovrai utilizzare un punto all'interno del codice.
    Si spera che non si stia tentando di utilizzare Input #, che intende solo leggere i dati scritti da Write # che utilizza sempre formati "universali" (in questo caso periodo come punto decimale).
    Il problema potrebbe essere dovuto all'uso della funzione Val; quello non è internazionale. Il testo di aiuto raccomanda l'uso di CDbl durante la conversione da stringhe a numeri.


    Val, Str utilizzerà sempre le impostazioni USA (punto come decimale)
    Cdbl, Format terrà conto delle impostazioni regionali.

    • Microsoft offre questo servizio gratuitamente, per aiutare gli utenti e aumentare il database dei prodotti e delle tecnologie. Il contenuto fornito “as is“ non comporta alcuna responsabilità da parte dell’azienda.

    giovedì 2 aprile 2020 10:52
    Moderatore
  • Il campo che cerco di gestire è da :

    che mi impone di usare la virgola"," altrimenti mi da errore.

    e in tabelle tipo:

    CREATE TABLE [dbo].[Table_DatiPredefiniti] (
        [Id]                     INT            IDENTITY (1, 1) NOT NULL,
        [DescrizionePredefinita] NVARCHAR (500) NULL,
        [ValorePredefinito]      DECIMAL (8, 2) NULL,
        [c1]                     NVARCHAR (50)  NULL,
        [c2]                     NVARCHAR (50)  NULL,
        PRIMARY KEY CLUSTERED ([Id] ASC)
    );

    Ho provato a modificare il codice che trasferisce il valore in questo modo:

      My.MySettings.Default.SaldoIniziale = CDec(SaldoIniziale.Text)

    ma se io scrivo 123.50 nel MYSetting viene memorizzato come 12350.

    • Modificato Guido.G giovedì 2 aprile 2020 11:33 implementazione
    giovedì 2 aprile 2020 11:09
  • Ciao,

    non fare confusione tra ciò che è un numero e quella che è la sua "rappresentazione" leggibile.

    Da codice, devi passare un oggetto di tipo Decimal per impostare il valore di SaldoIniziale. Un oggetto Decimal non ha ne un punto, ne una virgola. La sua rappresentazione leggibile, ha invece un punto o una virgola, per separare la parte intera da quella decimale, in base alle impostazioni del pc su cui gira l'applicazione.

    Anche la funzione CDec conosce le impostazioni del tuo pc, quindi se vuoi convertire una stringa in un decimal tenendo conto della parte decimale, devi passare a quella funzione una stringa che utilizza la virgola come separatore. La stessa cosa non funzionerebbe allo stesso modo se tu avessi, per dire, un pc con un sistema operativo in inglese.

    Se lanci un comando sql per aggiornare un database, dovrai passare sempre il punto come separatore, dato che quel linguaggio (e tutti i linguaggi di programmazione che conosco) usano il punto come "rappresentazione" di un numero quando serve indicare la parte decimale.

    giovedì 2 aprile 2020 15:49
  • ok...forse...anzi...sicuramente sto facendo confusione ....ma nell'immagine dove ho impostato i valori di MYSetting è lui che mi impone di mettere la virgola",".

    Sinceramente non capisco cosa dovrei fare....

    giovedì 2 aprile 2020 16:28
  • Si, li ci devi mettere la virgola, in quanto il sistema interpreta quello che hai scritto nel tuo modo di scrivere (hai le impostazioni italiane, dove la parte decimale si scrive dopo una virgola) e traduce la tua rappresentazione di un numero, in un numero.

    Però solo ora ho capito cosa intendi fare, ad una prima lettura tra tabelle di database, impostazioni ed altro, non avevo capito.

    Per sostituire il punto, sia quello del tastierino numerico e "sia quello sulla riga dello shift" puoi intercettare la pressione del tasto sulla tastiera nell'evento KeyPress, e sostituire il valore KeyChar dell'argomento ti tipo KeyPressEventArgs.

    Fatto al volo:

        Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
            If e.KeyChar = "." Then e.KeyChar = ","
        End Sub

    • Contrassegnato come risposta Guido.G giovedì 2 aprile 2020 19:02
    giovedì 2 aprile 2020 18:20
  • Grazie Mizio, avevo provato anche ad inserire "Option Strict On" per vedere se fosse la mancanza di questo comando, ma effettivamente non cambia nulla, quindi ho inserito il tuo codice, vedi quanto sono in dietro...io conoscevo questa sintassi:

    If e.KeyChar = "." Then
                e.KeyChar = CChar(",")
            End If

    e non quella che hai postato...ho imparato anche questo

    però per poterla usare ho dovuto inserire nel listato precedente:

      'Determinare se il tasto è un ".".
      If e.KeyCode <> Keys.Decimal Then
    
    end if

    altrimenti non fa scrivere il punto e quindi non lo trasforma.

    Grazie per l'aiuto.

    Guido

    giovedì 2 aprile 2020 19:02