Newsgroup: it.comp.lang.visual-basic
Titolo: Errore dentro una funzione

In una funzione che ho fatto per convertire EuroLire e visualizzare il tutto
in una ToolTip c'è un errore che non riesco a trovare....o sarebbe meglio
dire, un errore che XP mi perdona e Win98SE proprio no ,,,e questo non lo
capisco mica tanto...
Si tratta di questo:
Function EuroLire(ByVal Eu As Variant) As String
If Len(Eu) < 1 Then Exit Function
If TrovaLet(Eu) = True Then Exit Function
EuroLire = Format((Eu * "1936,27"), "###,###")
End Function
(TrovaLet è una funzione che verifica la presenza di lettere)
Private Sub saldimponibile_MouseMove(Button As Integer, Shift As Integer, X
As Single, Y As Single)
If Len(saldimponibile) > 0 Then
saldimponibile.ToolTipText = EuroLire(saldimponibile.Text)
End If
End Sub
L'errore è il 13 (Tipo non corrispondente)
--
Grazie
--
Gulp
....forse mi sono perso qualcosa !

 EuroLire = Format((Eu * "1936,27"), "###,###")
Ecco l'errore, non puoi moltiplicare una stringa "1936,27" con un numero.
Ciao.
Il Pioniere

 ha scritto nel messaggio

E come mai in XP visualizzo una ToolTip con una stringa che mi presenta il
conteggio eseguito?
E non ricevo errori?


 
Sono diverse le impostazioni internazionali, a mio parere.
Verifica come è impostato il separatore decimale in un caso e nell'altro, 
ad esempio.
Non dipende quindi dal sistema operativo, il tuo esempio mi funziona e io 
ho Win98SE installato.
-- 
|-----------------------------------------------|
|Davide Guida          >>> 
davide...@email.it
|
|-----------------------------------------------|

 End Sub
Ti consiglio di riscrivere EuroLire in questo modo:
Function EuroLire(ByVal Eu As String) As String
   Eu = Trim$(Eu)
   If Len(Eu)=0 Then Exit Function
   If TrovaLet(Eu) Then Exit Function
   EuroLire = Format(CCur("0" & Eu), "#,0.00")
End Function
Ovviamente il problema nasce nel momento in cui non viene usato il 
separatore decimale come separatore decimale.
Nel senso che se su un pc come separatore decimale (nelle imp. di 
sistema) c'č il punto e uno scrive "2,50" nella casella di testo allora 
i conti non torneranno.
Secondo me dovresti (usando qualche API di sistema) ricavarti il 
separatore decimale di quel sistema e usarlo con una Replace$.
Il mio esempio presuppone che nella casella di testo venga usato lo 
stesso schema delle impostazioni internazionali.
-- 
Quando noi ignoranti eravamo di piů,
tutto era piů bello...
(A. Celentano)

 End Function
Pardon... l'ultima istruzione deve essere:
EuroLire = Format(CCur("0" & Eu)*1936.27, "#,0.00")


 EuroLire = Format(CCur("0" & Eu)*1936.27, "#,0.00")
Osceno l'uso di Eu "As String".
Questa funzione sta in piedi perchè non tira il vento :)
Ciao

 Ciao
Ciao a te
-- 
Quando noi ignoranti eravamo di piů,
tutto era piů bello...
(Adriano Celentano)

 che dare un parere senza motivarlo, pls?
Vediamo:
Function EuroLire(ByVal Eu As String) As String
  Eu = Trim$(Eu)
    ' In Eu potrebbe esserci di tutto,
    ' es. "34.5" per essere buoni
  If Len(Eu)=0 Then Exit Function
    ' A che serve questo?
    ' se anzichè stringa vuota fosse "XYZ"
    ' sarebbe tranquillamente accettato?
  If TrovaLet(Eu) Then Exit Function
    ' Questo non voglio nemmeno sapere a cosa serva :)
  EuroLire = Format(CCur("0" & Eu)*1936.27, "#,0.00")
    ' CCur sbaglia a interpretare 34.5 e lo interpreta come 345
    ' nel nostro esempio.
    ' Se ci fosse qualcosa come ? 34.5 (l'eventuale '?' è il simbolo
dell'euro)
    ' CCur(Eu) potrebbe funzionare, ma non CCur("0" & Eu).
    ' Questo nei casi migliori di input.
End Function
Questa funzione è errata dal punto di vista logico, pratico e formale.
Quella corretta sarebbe simile a questa:
Function EuroLire(Byval lire As Currency) As Currency
    EuroLire = lire * 1936.27
End Function
Semplice, lineare, funzionale.
Ciao
--
NeoDataType : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

 Function EuroLire(Byval lire As Currency) As Currency
Ovviamente era:
Function EuroLire(Byval euro As Currency) As Currency


 End Function
Ecco...
Il tipico esempio di funzione inutile.
Una funzione che mi restituisce sempre e comunque una moltiplicazione 
non è una funzione utile.
Non mi "scazza" scrivere in ogni punto del programma LIRE * 1936.27 
piuttosto che EuroLire(Lire).
Forse mi scoccia dover controllare OGNI VOLTA quello che l'utente ha 
digitato nella casella di testo prima di richiamare la funzione 
(inutile) EuroLire che mi moltiplica semplicemente due valori.
Forse lo scopo di EuroLire è proprio quello di ricevere una stringa, 
controllare che sia corretta (anche se nell'esempio di sopra i controlli 
scarseggiano, ma lo scopo è comunque quello) e poi restituirmi (in caso 
di input valido) una conversione di valuta?
-- 
Quando noi ignoranti eravamo di più,
tutto era più bello...
(A. Celentano)

 tutto era piů bello...
Questo č proprio vero :)
Ciao

 Ciao
A te :)
-- 


 cosě. :D
Pardon non avevo letto tutto quello che avevi scritto.
Intendevo cmq dire che i controlli ovviamente vanno aumentati. E' normale.
Ma io, ripeto, mi sono attenuto ai suoi.
-- 
Quando noi ignoranti eravamo di piů,
tutto era piů bello...
(A. Celentano)

 è più comodo...
Sarà, ma continuo a pensare che sia errato.
Così facendo arriverai anche tu ad avere funzioni del tipo
ControllaPassword() (come me in 'sta libreria monnezza che mi è stata
affibbiata) che tutto fa tranne il controllo della password (si carica un
eleno di utenti e password, tira fuori un form che chiede utente e password,
e restituisce la stringa contenente la password, se corretta, altrimenti
stringa vuota!!!).
Sicuramente era più comodo per chi l'ha scritta, ma a distanza di tempo
sfido anche lo scrittore a sapere come riutilizzare in modo corretto 'sta
roba.
Ciao

 Ciao
Ciao a te :)


     ' Questo non voglio nemmeno sapere a cosa serva
E io te lo dico lo stesso...Se poi l'utente si inventa di digitare lettere
nell' oggetto testo e addirittura dopo ciò ci sale col mouse rieccoci !
 E siccome in pochi con questo caldo hanno voglia di fare una così lunga
chiaccherata
Grazie ad entrambi....
Ciao



Grazie
