Gambas-it

Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: tornu - 18 Febbraio 2009, 00:49:15

Titolo: ValueBox
Inserito da: tornu - 18 Febbraio 2009, 00:49:15
Buona Sera a tutti,
Ho delle ValueBox con impostata la proprietà Number inserite in un form che all'avvio visualizzano di default uno zero, la mia domanda è: si può evitare che all'apertura lo zero venga visualizzato?
Prima di postare ho provato in vari modi (esempio: ValueBox.Clear(), ValueBox.Value = "") ma niente lo zero "non schioda".
Titolo: Re: ValueBox
Inserito da: Ceskho - 18 Febbraio 2009, 00:57:08
Purtroppo no...lo zero c'è e rimane...dovresti usare una textbox e formattarla per contenere solo numeri...
Titolo: Re: ValueBox
Inserito da: tornu - 18 Febbraio 2009, 01:05:27
Volevo evitare ciò usando la ValueBox per risparmiare qualche riga di codice, ma non conoscevo questa caratteristica, userò la TextBox come da te suggeritomi.
Grazie
Titolo: Re: ValueBox
Inserito da: Ceskho - 18 Febbraio 2009, 01:07:18
Spero di sbagliarmi così ti evito il lavoro più grosso....:D
Titolo: Re: ValueBox
Inserito da: md9327 - 18 Febbraio 2009, 14:39:44
Domandina: perchè non vuoi che compaia lo zero?

Tieni conto che le varibili di base (es. Integer, Float, Long ecc.) non possono contenere valori null, e per questo vengono impostate per default a zero.
La ValueBox, segue questa logica, per cui ti presenta il valore di reset (0, appunto).
Al contrario, la TextBox, può contenere caratteri alfanumerici e, dato che è collegata ad un'oggetto String, può avere valori nulli.
Titolo: Re: ValueBox
Inserito da: tornu - 18 Febbraio 2009, 20:55:24
Perchè mi complica i controlli che devo effettuare tra di loro, un esempio stupido e che se cancello "involontariamente" lo zero mi va in errore il programma costringendomi a implementare ulteriori controlli per evitare che questa condizione non si verifichi in nessun caso.
Titolo: Re: ValueBox
Inserito da: leo72 - 18 Febbraio 2009, 23:32:52
Fin dai tempi in cui scrivevo programmini in BASIC sul Commodore 16 la mia prima preoccupazione è sempre stata quella di non dare _mai_ per scontato cosa l'utente inserisse alla richiesta di input da parte del programma, anche se l'utente ero io e basta.
Quindi ho sempre controllato a fondo ciò che veniva inserito, proprio per evitare che venissero passati dati senza senso o non corrispondenti ai tipi richiesti, anche in caso di scelte quasi obbligate.

Questo per dirti che la gestione dei dati è sempre importante, indipendentemente dal filtraggio che un controllo può o meno eseguire di suo.
Titolo: Re: ValueBox
Inserito da: tornu - 19 Febbraio 2009, 01:19:21
Concordo pienamente con quello che dici, infatti la mia scelta era ricaduta proprio sulle ValueBox per gestire dei campi che devono contenere solo dati numerici è vista le loro caratteristiche mi sembrava quella giusta, per lo stesso motivo che tu hai citato, quello di evitare che l'utente possa inserire dei dati non corretti evitando di dover scrivere non poche righe di controllo che necessitano per esempio le TextBox.
Non che la cosa mi crei particolari problemi ma se si possono sfruttare delle funzionalità già presenti nelle proprietà degli oggetti che già svolgono quel particolare controllo che ti serve è sicuramente una comodità.
Titolo: Re: ValueBox
Inserito da: giulio - 19 Febbraio 2009, 17:45:14
Ciao. Quick and dirty solution (una porcheria) per non vedere lo zero all'avvio:

Codice: [Seleziona]

 ' Gambas class file

PUBLIC bValueboxNumber AS Boolean

PUBLIC SUB _new()

END

PUBLIC SUB Form_Open()
   
  ValueBox1.Type = ValueBox.Time
       
END

PUBLIC SUB ValueBox1_KeyPress()
 
  IF NOT bValueboxNumber THEN
    ValueBox1.Type = ValueBox.Number
  ELSE
    RETURN
  ENDIF  
  bValueboxNumber = TRUE
 
END


In pratica, all'avvio imposti Valuebox come Type Time.
La prima volta che inserisci un valore diventa Type Number.
La soluzione è sporca perché ad ogni keypress c'è una verifica,
ma usando TextBox forse è ancora più arzigogolato. Ciao
Titolo: Re: ValueBox
Inserito da: Ceskho - 19 Febbraio 2009, 18:08:05
Che casino....secondo me fai prima a tenerti lo zero....
Titolo: Re: ValueBox
Inserito da: ivosperi - 19 Febbraio 2009, 18:29:24
Ciao a tutti
Scusate l'intrusione, ma come ho già chiesto in un altro post non esiste la possibilità di controllare i tasti premuti all'interno di un textbox tipo:

Codice: [Seleziona]
Sub text_keypress (Index as Integer, KeyAscii as Integer)
  if KeyAscii >= 48 And KeyAscii <= 57 Then exit sub
  if KeyAscii = 8 Then exit sub
  if Chr$(KeyAscii) = "." Then exit sub
  KeyAscii = 0
End Sub


Grazie ciao
Titolo: Re: ValueBox
Inserito da: Ceskho - 19 Febbraio 2009, 18:34:06
Dove lo hai preso quell'esempio?alcuni passaggi mi risultano oscuri...sarà che ho fretta....boh...
Titolo: Re: ValueBox
Inserito da: ivosperi - 19 Febbraio 2009, 18:38:35
Scusa, hai ragione, dimenticavo di dire che era scritto per vb

la procedura restituiva la variabile keyascii che identificava l'ultimo tasto premuto
Titolo: Re: ValueBox
Inserito da: fsurfing - 19 Febbraio 2009, 20:14:23
usa questo:
Codice: [Seleziona]


PUBLIC SUB TextBox1_KeyPress()

DIM keycode AS Integer

keycode = Key.Code
Label1.text = keycode

END



 


alla pressione di un tasto in textbox label1 visualizza il codice
Titolo: Re: ValueBox
Inserito da: fsurfing - 19 Febbraio 2009, 20:19:22
tieni però presente che utilizzare una costante integer per definire un tasto  non è consigliato dalla documentazione di gambas.

se lo utilizzi su un programma che userai solo tu va benissimo, ma se dovrai o vorrai che altri lo usino su sistemi diversi dal tuo potresti avere dei problemi

la guida recita:
Citazione
   Never compare the value of this property with a numeric constant, because the key codes may depend on the underlying toolkit.  Always use the constants defined in this class!
Titolo: Re: ValueBox
Inserito da: fsurfing - 19 Febbraio 2009, 20:24:41
se vuoi proprio il codice asci puoi fare così:

Codice: [Seleziona]

PUBLIC SUB TextBox1_Change()




Label1.text = Asc(Right(TextBox1.Text, 1)) 'codice ascii
label2.text = key.Code 'codice tasto di sistema

END

 
Titolo: Re: ValueBox
Inserito da: Ceskho - 19 Febbraio 2009, 21:41:27
Citazione

fsurfing ha scritto:
se vuoi proprio il codice asci puoi fare così:

Codice: [Seleziona]

PUBLIC SUB TextBox1_Change()




Label1.text = Asc(Right(TextBox1.Text, 1)) 'codice ascii
label2.text = key.Code 'codice tasto di sistema

END

 


oppure puoi creare una textybox che contiene solo una lettera alla volta e poi dai il comando.

Codice: [Seleziona]

PUBLIC SUB TextBox1_Change()

Label1.text = Asc(TextBox1.Text)

END SUB
Titolo: Re: ValueBox
Inserito da: tornu - 19 Febbraio 2009, 23:48:38
Grazie giulio del suggerimento, ma per il momento mi tengo lo zero come mi consiglia il  buon Ceskho.
Titolo: Re: ValueBox
Inserito da: Ceskho - 19 Febbraio 2009, 23:58:36
:cappello:
Titolo: Re: ValueBox
Inserito da: ivosperi - 20 Febbraio 2009, 17:03:14
Ciao

Citazione

 fsurfing ha scritto:

se vuoi proprio il codice asci puoi fare così:

Codice: [Seleziona]

PUBLIC SUB TextBox1_Change()

Label1.text = Asc(Right(TextBox1.Text, 1)) 'codice ascii
label2.text = key.Code 'codice tasto di sistema

END


Facendo così controlli solo l'ultimo carattere del testo, ma mentre scrivi non è detto che tu sia alla fine del testo, puoi esserti spostato con le frecce.
Io voglio controllare i caratteri che si possono inserire, ho provato questo:

Codice: [Seleziona]

PUBLIC SUB TextQuant_KeyPress()
 IF Key.Code >= 48 AND Key.Code <= 57 THEN RETURN
 IF Key.Code = 8 THEN RETURN
 IF Chr$(Key.Code) = "." THEN RETURN
 Key.Code = 0  
END

.. ma key.Code = 0 è in sola lettura, mi basterebbe capire come annulare l'ultimo tasto premuto
Titolo: Re: ValueBox
Inserito da: Ceskho - 20 Febbraio 2009, 17:06:51
Ma non vedo il bisogno di annullare l'ultimo tasto...quando premi un nuovo tasto la variabile che ti restituisce il codice viene automaticamente sovrascritta...

Se scrivi a cosa ti serve il codice vedo se posso aiutarti meglio...
Titolo: Re: ValueBox
Inserito da: ivosperi - 20 Febbraio 2009, 17:32:02
Lo scopo sarebbe avere un textbox nel quale si possono digitare solo i caratteri "che dico io", ho capito che riesco a capire che carattere è stato inserito usando key.code ma come posso gestirlo?

Grazie ciao
Titolo: Re: ValueBox
Inserito da: Ceskho - 20 Febbraio 2009, 17:39:48
Key.Code è in sola lettura effettivamente. Ma se usi il tuo esempio togliendo la stringa

Codice: [Seleziona]

key.Code=0


funziona come vuoi tu?
Titolo: Re: ValueBox
Inserito da: Ceskho - 20 Febbraio 2009, 17:42:56
L'ultimo esempio che mi viene in mente è questo. Provalo:

Codice: [Seleziona]
PUBLIC SUB TextQuant_KeyPress()

 DIM codice as integer

 codice = Key.Code
 IF codice >= 48 AND codice <= 57 THEN RETURN
 IF codice = 8 THEN RETURN
 IF Chr$(codice) = "." THEN RETURN
 codice = 0

END
Titolo: Re: ValueBox
Inserito da: ivosperi - 20 Febbraio 2009, 17:45:38
No, in vb c'era keyascii che assomigliava a key.code, allora sempre secondo esempio se la condizione era verificata usciva dalla sub altimenti l'ultima istruzione della sub eliminava il carattere appena premuto

Codice: [Seleziona]

PUBLIC SUB TextQuant_KeyPress()
 IF Key.Code >= 48 AND Key.Code <= 57 THEN RETURN
 IF Key.Code = 8 THEN RETURN
 IF Chr$(Key.Code) = "." THEN RETURN
 Key.Code = 0  
END
Titolo: Re: ValueBox
Inserito da: Ceskho - 20 Febbraio 2009, 17:57:07
E l'altro esempio funziona? quello con la variabile "codice" ?
Titolo: Re: ValueBox
Inserito da: ivosperi - 20 Febbraio 2009, 18:04:53
No se se vari il valore di "condice" vari solo una variabile da te impostata che non agisce sul sistema
Titolo: Re: ValueBox
Inserito da: Ceskho - 20 Febbraio 2009, 18:10:12
Sarà...a me pareva funzonasse
Titolo: Re: ValueBox
Inserito da: ivosperi - 20 Febbraio 2009, 18:17:24
non è che non funziona
Ma non annulla l'ultimo carattere premuto se diverso da uno di quelli specificati
ciao
Titolo: Re: ValueBox
Inserito da: Ceskho - 20 Febbraio 2009, 18:26:32
Allora prova a fare:
Codice: [Seleziona]

PUBLIC SUB TextQuant_KeyPress()

 DIM codice as integer
 DIM a as string

 a = textQuant.Text
 codice = Key.Code
 IF codice >= 48 AND codice <= 57 AND codice = 8 AND Chr$(codice) = "."   THEN RETURN
 ELSE
 textQuant.text = a
 
END
Titolo: Re: ValueBox
Inserito da: ivosperi - 20 Febbraio 2009, 18:30:20
Bella idea ma purtroppo quando salvi in "a" la stringa ormai il carattere è gia stato aggiunto
Titolo: Re: ValueBox
Inserito da: giulio - 20 Febbraio 2009, 20:59:20
@ivosperi

Devi usare STOP EVENT.

Es.:

Codice: [Seleziona]


PUBLIC SUB TextBox1_KeyPress()

  IF Key.text = "a" THEN RETURN
  STOP EVENT

END



Nell'esempio la textbox accetta solo le "a". Attenzione che STOP EVENT
blocca tutto, anche tasti cursore e barra spazio et cetera, che dovrai mettere tra i tasti accettati.
Titolo: Re: ValueBox
Inserito da: ivosperi - 21 Febbraio 2009, 10:49:36
FUNZIA !!!!!! grazie a tutti ecco Qui:

Codice: [Seleziona]
PUBLIC SUB TextQuant_KeyPress()
 IF Key.Code >= 48 AND Key.Code <= 57 THEN RETURN
 STOP EVENT
END


Allora:
in un textbox durante l'utilizzo viene premuto un tasto, se il codice ascci di quel tasto è compreso tra 48 e 57 (sono i numeri), esce dalla sub e qundi consente l'inserimento del carattere,
altrimenti con STOP EVENT annulla il carattere inserito.

Basta variare la condizione IF...THEN e cosi si può decidere che caratteri possono essere immessi nel textbox

Grazie ancora a tutti ciao ivo
Titolo: Re: ValueBox
Inserito da: ivosperi - 21 Febbraio 2009, 10:58:03
Così funziona meglio:

Codice: [Seleziona]
PUBLIC SUB TextQuant_KeyPress()
 
  Label1.Text = key.Code 'visualizza codice tasto premuto

  IF Key.Code >= 48 AND Key.Code <= 57 THEN RETURN
  IF Key.Code = 4099 THEN RETURN   'cancella

STOP EVENT
END


è meglio consentire anche il codice 4099 che rappresenta il cancella,
e per conoscere i codici dei tasti si può aggungere:
Codice: [Seleziona]
Label1.Text = key.Code
 che visualizza in un label il codice del tasto premuto.

ciao   :-D  :-D  :-D