Newsgroup: it.comp.lang.visual-basic
Titolo: Problema banale

Salve a tutti.
Ho un problema che probabilmente è banale, ma essendo io completamente
neofita mi sta dando dei problemi.
Assumiamo di avere due caselle di testo che esprimono lo stesso numero in
due riferimenti diversi (per esempio la velocità in m/s e in km/h).
L'utente può modificare il valore in entrambe le due caselle a seconda della
comodità.
La struttura che posto sotto mi da il problema che duarnte la digitazione in
un campo, dopo la pessione del primo tasto salta a modificare il contenuto
della seconda casella e quindi si riaggiorna la prima  e così via, con non
pochi problemi.
Ho pensato di inserire un timer di un decimi di secondo in modo che mi setti
un flag quando scade e solo in quel caso vado ad aggoirnare la seconda
casella altrimenti esco.
C'e' un idea più furba?
Grazie mille
Pietro
Private Sub metrialsecondo_Change()
   chilometriallora.Text = Val(metrialsecondo.Text)*3.6
End Sub
Private Sub Lambda_Change()
    metrialsecondo.Text =  Val(chilometriallora.Text)/3.6
End Sub

 C'e' un idea più furba?
In realtà il tuo problema si pone solamente con i numeri decimali, ma questo
è legato al fatto che hai utilizzato una combinazione di funzioni sensibili
alle impostazioni locale (Cstr) e di funzioni non localizzate (Val).
Devi decidere tu cosa vuoi che venga accettato: espressioni localizzate
(quindi con punto, oppure virgola, a seconda del S.O.), oppure
internazionali (solo col punto), e che rendi omogenee le conversioni.
Se scegli di usare le rappresentazioni localizzate, attenzione che un
textbox vuoto o non numerico ti dà errore (contrariamente al val che è molto
più 'buono').
Ciao
Alberto

Pietro B. wrote:

puoi controllare l'evento keypress e aggiornare entrambi i campi solo quando
viene premuto Carriage return, invece dell'evento change.
ciao
-- 
eliminare FASULLO per rispondere direttamente

 quando viene premuto Carriage return, invece dell'evento change.
oppure ancora, aggiungere un boolean a livello di form
private m_DaCodice as boolean
Private Sub metrialsecondo_Change()
    if m_dacodice then
        m_dacodice = false
        exit sub
    end if
    m_dacodice = true
    chilometriallora.Text = Val(metrialsecondo.Text)*3.6
End Sub
resta valido (come al solito molto valido) l'appunto di albe, anche se
bisognerebbe verificare se l'istruzione txtbox.text = txtbox.text genera o
meno l'evento change.
-- 
Salutoni
Sergio
per rispondere... togli il group dall'indirizzo

 genera o meno l'evento change.
No. Change richiede espressamente un 'change', ossia una variazione.
Il problema di Pietro č anche che ci possono essere arrotondamenti che
comportano due valori che non 'quadrano' secondo le formule impostate.
Ciao
Alberto

 comportano due valori che non 'quadrano' secondo le formule impostate.
oltre ai separatori decimali di cui hai parlato prima.


 C'e' un idea più furba?
La mia ovviamente (dopo aver letto gli altri post :-P )
Nell'evento Change controlla che ... il controllo sia anche lo
Screen.ActiveControl

 End Sub

 alla peggio la Val produce un risultato sbagliato...
Certo.
Ma siccome il risultato sbagliato viene poi scritto nell'altro textbox, e
poi viene interpretato (ancora una volta sbagliando), e viene riscritto nel
primo, e quindi questo cambia, e poi viene interpretato (ancora una volta
sbagliando), e viene riscritto nel secondo, e quindi questo cambia, , e poi
viene interpretato (ancora una volta sbagliando), e viene riscritto nel
primo, e quindi questo cambia, e poi viene interpretato (ancora una volta
sbagliando), e viene riscritto nel secondo, e quindi questo cambia, e poi
viene interpretato (ancora una volta sbagliando), e viene riscritto nel
primo, e quindi questo cambia, e poi viene interpretato (ancora una volta
sbagliando), e viene riscritto nel secondo, e quindi questo cambia, e poi
viene interpretato (ancora una volta sbagliando), e viene riscritto nel
primo, e quindi questo cambia, e poi viene interpretato (ancora una volta
sbagliando), e viene riscritto nel secondo, e quindi questo cambia, e poi...
Vi risparmio altra banda.
E' sempre possibile interrompere questa schifezza testando focus, flag, e
altre amenità. Ma alla fine ci troviamo in uno stato errato, ossia con i due
textbox che indicano valori non congruenti.
Ciao
Alberto

 ossia con i due textbox che indicano valori non congruenti.
Su questo non c'è dubbio. Della serie "Huston, qui abbiamo _due_ problemi"
;-)

 la prima  e così via, con non pochi problemi.
Ci ho messo un pomeriggio prima di capire che era un problema di loop
in un programmmino simile l'ho risolta in questa maniera:
Supponiamo che text1 sia km/h e text2 m/s
Private Sub text1_Change()
If CONTATORE = 3 Then GoTo fine
text2.text = (Text1.Text * 1000) / 3600
End Sub
Private Sub text1_GotFocus()
CONTATORE = 2
Text1.Text = ""
End Sub
Private Sub text2_Change()
If CONTATORE = 2 Then GoTo fine
text1.text = Text2.Text * 3.6
End Sub
Private Sub text2_GotFocus()
CONTATORE = 3
Text2.Text = ""
End Sub
Non sarà formalmente corretto, ma funziona
Non è detto che sia la più furba, ma parte da un concetto semplice: se non
sai fare 5x5, fai 5+5+5+5+5
Commenti? insulti? migliorie?
D

 D

 mago.
Vero.
Correggo subito:
Dim contatore
Private Sub text1_Change()
If contatore = 3 Then GoTo fine
On Error GoTo fine                   '<<<<<<<<<<<<<<<
Text2.Text = (Text1.Text * 1000) / 3600
fine:                    '<<<<<<<<<<<<<<<<<<<<<<<<<
End Sub
Private Sub text1_GotFocus()
contatore = 2
Text1.Text = ""
End Sub
Private Sub text2_Change()
If contatore = 2 Then GoTo fine
On Error GoTo fine                   '<<<<<<<<<<<<<<<
text1.Text = Text2.Text * 3.6
fine:                    '<<<<<<<<<<<<<<<<<<<<<<<<<
End Sub
Private Sub text2_GotFocus()
contatore = 3
Text2.Text = ""
End Sub
Va bene, adesso?

 Va bene, adesso?
Meglio. Ma con Screen.ActiveControl sarebbe più pulito. Scusa
l'insistenza...

 l'insistenza...
Da uno che per fare 5x5 fa 5+5+5+5+5 che ti aspettavi?
E poi l'avevo premesso: non sarà concettualmente esatto, ma funziona!
Utile la cosa dell'on error goto0
D (se sapessi cosa vuol dire, saprei di essere un niubbo)

[Gnappo = 
circa_da...@fastwebnet.it
 in
AfG5c.8033$
t81....@tornado.fastwebnet.it
] ha scritto:

La guida l'hai? O nemmeno tu? <eg>
Vedi di capire cos'ho fatto (senza entrare nel merito di altre cose, come
quelle Textn.Text *...):
'Dim contatore
Private Sub text1_GotFocus()
    'contatore = 2
    Text1.Text = ""
End Sub
Private Sub text1_Change()
    'If contatore = 3 Then GoTo fine
    If Screen.ActiveControl Is Text1 Then
        On Error GoTo fine
        Text2.Text = (Text1.Text * 1000) / 3600
    End If
fine:
    On Error GoTo 0
End Sub
Private Sub text2_GotFocus()
    'contatore = 3
    Text2.Text = ""
End Sub
Private Sub text2_Change()
    'If contatore = 2 Then GoTo fine
    If Screen.ActiveControl Is Text2 Then
        On Error GoTo fine
        Text1.Text = Text2.Text * 3.6
    End If


 quelle Textn.Text *...):
Perchè no? sono qui per imparare
D

 Perchè no? sono qui per imparare
Perchè la guida lo spiegherebbe, perchè mi sono rotto.

 Perchč no? sono qui per imparare
Non mi sembra.
Hai preso su la prima soluzione che ti consentiva di risolvere il problema,
anche se ti č stato fatto notare che stai commettendo errori concettuali.
Chi vuole imparare, di fronte ad un ostacolo si ferma, capisce, e lo
demolisce. Al giro dopo, l'ostacolo non č piů tale.
Tu hai trovato l'ostacolo, ti hanno prestato uno sgabello, l'hai saltato, e
al prossimo giro sarai qui a chiedere aiuto.
E' una tua scelta, a me non interessa, ma lo ritengo un peccato.
Ciao
Alberto

 E' una tua scelta, a me non interessa, ma lo ritengo un peccato.
Addirittura...
Da scomunica o basta un avemaria e due padre nostro?
D

perchč mi sono rotto.
Mi spiace per te, ma non era mia intenzione romperti le palle. Ma anche se
ti fossi rotto, non mi sembra un buon motivo per usare scortesia e
supponenza.
D (E scusate i francesismi)

 Da scomunica o basta un avemaria e due padre nostro?
La scimmia di cui sopra avrebbe capito il senso della frase.
Ciao
Alberto

 scortesia e supponenza.
Scortesia, certo, ma provocata. Non supponenza.

 Scortesia, certo, ma provocata. Non supponenza.
Provocata da cosa? non mi sembra di essere stato scortese. Non
volontariamente, quanto meno. Non ti ho ringraziato per avermi indicato una
via alternativa. Lo faccio adesso. Del resto, grazie at tuoi suggerimenti,
ho imparato il corretto uso di OnErrorGoTo e di  Screen.ActiveControl .
Quel "vedi di capire cos'ho fatto" non ti sembra supponenza?
Mia nonna diceva sempre "chi ha buon senso lo usi". Questa sarà la mia
ultima risposta sull'argomento.
Se poi vuoi spiegarmi qual'è l'errore nell'utilizzare text1.text in un
calcolo, sarò ben contento di capire dove sbaglio.
D

 calcolo, sarò ben contento di capire dove sbaglio.
questa è facile.
di solito il calcolo si fa con i numeri.


 calcolo, sarò ben contento di capire dove sbaglio.
La proprietà Text di un textbox è una stringa e una stringa (se
trascuriamo... le licenze che VB ci concede) non può, mai, essere usata in
un calcolo numerico. Sarebbe come dire (sto raccogliendo adepti) che faccio
un calcolo, numerico, fra sedie e nuvole. Quindi o trasformo le sedie in
nuvole, o le nuvole in sedie. Ovvero, o trasformo le stringhe in numeri o
... (trattandosi di calcolo numerico) basta.