Newsgroup: it.comp.lang.visual-basic
Titolo: [VB6] Funzione InstrRev

Buonasera a voi,
dovrei scomporre una stringa suddivisa dallo slash in due parti singole, 
slash escluso, ma non ottengo quel che desidero.
Qualcuno sa dirmi dove sbaglio e se sto usando il metodo corretto?
La stringa che dovrei separare �: "CognomeUno / CognomeDue"
sName = DsReg!Denominazione
strFirst = Trim$(Left$(sName, InStrRev(sName, " /"))) 
Questa mi restituisce correttamente "CognomeUno"
strScnd = Trim$(Right$(sName, InStrRev(sName, "/ "))) 
Questa invece mi restituisce "/ Cognome due"
non riesco a separare il secondo cognome.
Grazie a tutti
Sossio
 

 non riesco a separare il secondo cognome.
Soluzione:
strFirst =Trim(Left(sName, InStr(sName, "/") - 1))
strScnd = Trim(Right(sName, InStr(sName, "/") - 1))
Spiegazione:
instr e instrrev restituiscono la posizione del carattere
instr inizia da SX e va a DX
instrrev fa' in contrario, ma ENTRAMBI danno un numero
che corrisponde alla posizione del carattere da SX a DX !
in questa riga: "zaaaaa/bbb/ccx"
instr "/" restituisce 7 (trova quello tra a e b  partendo da z)
instrrev "/" restituisce 11 (trova quello tra b e c partendo da x)
ma la posizione indicata e' SEMPRE contando da SX a DX 

 ha
scritto:

Io userei InStr e Mid$
Dim x%
X = InStr (sName  ,"/ ")
Cognome1 =Trim$ (Mid$ (sName,1, X)
Cognome2 =Trim$ (Mid$ (sName, X+2,len(sName) )
Non l'ho provata perch� non ho VB su questa macchina, ma dovrebbe funzionare, al
limite varia X+2 con X+1.
--
ciao
  Stefano

 ma la posizione indicata e' SEMPRE contando da SX a DX
Grazie per aver risposto.
Purtroppo credo di non aver compreso perfettamente. La funzione di cui 
stiamo
parlando, a me non restituisce il numero (quindi la posizione), ma l'intera 
stringa che desidero.
Proprio come spiegavo nella porzione di testo che ho riportato, applicandola 
cos� com'�,
mi restituisce "CognomeUno" e nel secondo caso "/ CognomeDue"
Io vorrei che nel secondo caso, la stringa separata, non contenesse n� lo 
spazio n� lo slash.
Abbi pazienza...sono un p� duretto!!
Grazie

 ha scritto nel messaggio 
news:kkhm55lt5cauepb1j...@4ax.com...

Si Stefano. E' perfetta, l'ho appena scritta e funziona alla grande.
Grazie di cuore a tutti.
Sossio 

 ha scritto nel messaggio 
news:kuH6m.35589$1s6....@twister2.libero.it...

Dim PosBar as integer
sName = Trim$(DsReg!Denominazione)
PosBar = InStr(sName, "/")
If pos > 0 Then
    strFirst = Left$(sName, PosBar - 2)
    strScnd = Mid$(sName, PosBar + 2)
Else
    'gestisci l'eventuale mancanza del segno "/"
End If
Ciao.


Per completezza, sarebbe giusto citare anche la funzione Split(), che in 
questo caso � molto pi� comoda (secondo me).
Dim Fields() As String
    Fields = Split(sName, " / ")
    strFirst = Fields(0)
    'Precauzione
    If UBound(Fields) > 0 Then
        strScnd = Fields(1)
    End If
Bye
Raf

 questo caso � molto pi� comoda (secondo me).
Stringa="CognomeUno/CognomeDue"
Cognome1=Split(Stringa,"/")(0)
Cognome2=Split(Stringa,"/")(1)
Esatto...
-- 
Ciao Fede
By Chicco Production
http://bcp.freetools.it

 ha scritto nel messaggio 
news:4a5b561e$0$6821$5fc...@news.tiscali.it...

Grazie ancora a tutti.
Obiettivo centrato. 

 Cognome2=Split(Stringa,"/")(1)
Eccezionale......i miei complimenti.
-- 
Ciao
Geppo 


Da non prendere alla lettera pero'... fatta così vengono generati il
doppio degli elementi necessari; meglio fare più ortodosso dichiarando
l'array e usando uno split solo

 l'array e usando uno split solo
Altra considerazione generale: se la stringa da parsare non contiene il 
"separatore" ("/" in questo caso), la seconda split dar� runtime error.
Raf 

 "separatore" ("/" in questo caso), la seconda split dar� runtime error.
Come sopra!


 Come sopra!
Per carità, nel tuo esempio sono due blocchi semplici semplici, ma per
questo si diceva "non prendere alla lettera"... la sintassi Split
(qualcosa)(indice) in una riga funziona pure, ma non è proprio un bel
modo di procedere; uno vede l'esempio, dice "che bello" e lo fa con 5
blocchi, passa l'altro ancora e lo applica a 30: funziona sempre, però
stai generando un botto di array non necessari e senza i giusti
controlli di errore
Tanto vale prendere l'abitudine a dichiararlo questo unico array, e
non ci si pensa più.

 non ci si pensa pi�.
Secondo il tuo modo di procedere, va bene e fai bene a farlo.
La sicurezza � un qualcosa che si aquisisce con l'esperienza!


Per la cronaca...
Non viene generato un bel niente...
Non ci sono assegnazioni...
La funzione viene utilizzata al volo...
Al contrario l'array dichiarato mantiene invece impegnata la memoria finch� 
non lo si distrugge (direttamente o indirettamente)...


 non lo si distrugge (direttamente o indirettamente)...
Non viene assegnata niente!?
Qui mi pare che sei tu che vuoi prendere tutti per deficenti... se ti
fermavi a "non gli scriviamo il programma, gli diamo gli spunti" era
meglio
Non viene assegnato niente *esplicitamente*, ma Il runtime ha comunque
dovuto generare l'array in memoria e restituirtelo per far si che tu
lo possa referenziare con (indice), e lo ha dovuto rifare tutte le
volte.... spreco di memoria, spreco di CPU
Comunque, le chiacchiere stanno a zero, fai questa prova e dimmi se ti
sempra performi allo stesso modo:
Private Declare Function GetTickCount Lib "kernel32" () As Long
Dim s1 As String, s2 As String
Dim i As Long
Dim start As Long
s1 = String(1000, "\")
start = GetTickCount
For i = 0 To 999
    s2 = Split(s1, "\")(i)
Next
Debug.Print GetTickCount - start
start = GetTickCount
Dim ar() As String
ar = Split(s1, "\")
For i = 0 To 999
    s2 = ar(i)
Next
Debug.Print GetTickCount - start

Solo una persona molto stupida lo userebbe in questo modo.
Il post di partenza era molto pi� semplice.
Qui mi pare che sei tu che vuoi prendere tutti per deficenti!!!
Ma forse usi un Vic20, per cui ti capisco!


 Ma forse usi un Vic20, per cui ti capisco!
Guarda, non attacca...
Semplice o no, è stato fatto solo notare che il tuo "spunto", la tua
"chicca" non era da utilizzare *alla lettera*, tutto qui...
Sei tu che hai subito sentito il bisogno di metterti sulla difensiva,
e per me la cosa finiva pure li'; poi però hai voluto farla fuori dal
vaso con lo splendido post "per la cronaca" che è SENZA SENSO.
Ma magari me lo vuoi rispiegare, eh... noi col C64 (ero piccolo per il
VIC20) siamo un po' tardi, si sa

LOL


 ha scritto nel messaggio 
news:4a60e8dd$0$6819$5fc...@news.tiscali.it...

Ehm...vi ringrazio di cuore per le disquisizioni che in fin dei conti,
mostrano tanti aspetti dai quali imparare � d'obbligo...
io, se voi siete al vic20 (!), sono all'et� della pietra, e ho deciso di 
usare
questa
Dim x%
x = InStr(sName, " / ")
strName1 = Trim$(Mid$(sName, 1, x))
strName2 = Trim$(Mid$(sName, x + 2, Len(sName)))
azzolino...va che � na meraviglia.
Dico...parti pure dal fatto che non sono Bill Gates, e (purtroppo) neppure 
un suo dipendente,
ma se fatto un test, il suggerimento funge, io lo accetto e proseguo!
Grazie a tutti

 Grazie a tutti
-- 
Ciao
Geppo