Newsgroup: it.comp.lang.visual-basic
Titolo: [?] InStr non funziona bene (oppure sono completamente rincoglionito)

premetto che sono piu' per la seconda ipotesi...
comunque vengo al dunque. ho delle lunghe stringhe da immagazzinare in
un database. ho scelto --e non cambiero' la mia scelta perche'
funziona benissimo e ci sono gia' 8 programmi che lavorano in questo
modo :)-- di immagazzinare le stringhe in campi stringa, splittandole
in chunks di 200 caratteri. per evitare di avere beghe con degli a
capo, apici, doppi apici e quant'altro, ho scritto una funzioncina che
sostituisce questi caratteri con dei tag, tipo l'html. ad esempio,
...
    'sostituisco le tabulazioni con il tag <tab>
    tmpStringa = Replace(tmpStringa, vbTab, "<tab>")
    'sostituisco gli "a capo" con il tag <newline>
    tmpStringa = Replace(tmpStringa, vbNewLine, "<newline>")
...
ecco. fatto questo, leggo 200 caratteri alla volta di questa stringa
"modificata" e li sbatto in un database remoto. quando ho bisogno
della stringa, leggo i pezzi, li concateno e rimetto a posto i tag:
...
    'sostituisco il tag <newline> con gli "a capo"
    tmpStringa = Replace(tmpStringa, "<newline>", vbNewLine)
    'sostituisco il tag <tab> con le tabulazioni
    tmpStringa = Replace(tmpStringa, "<tab>", vbTab)
...
giunto a questo punto, devo stampare quello che ho estratto. il
problema nasce qua. ho scritto alcune funzioni che stampano una
stringa indentandola e mantenendo i margini che imposto in precedenza,
ma le funzioni non gestiscono gli a capo --perche' preferisco gestirli
nel programma chiamante--. il chiamante, allora, deve prendere la
stringona lunga lunga senza i tag, cercare i vbNewLine e passare le
frasi separate dai newline una alla volta alla funzione di stampa. per
trovare i newline ho usato la instr, solo che non funziona. ma non
funziona davvero, non e' il solito errore cretino che faccio almeno 15
volte all'anno: questa volta non mi sgavagno...
vi incollo un pezzo di stringa:
...
68/CEE, 93/44/CEE, 93/68/CEE<newline>
-89/336/CEE<newline><newline>La macchina è altresì conforme al modello
sottoposto all<quote>esame per la certificazione CE:<newline>     
...
ecco, la cosa che mi fa incazzare e' che quando ripristino la stringa
originale togliendo i tag, giustamente ottengo:
...
68/CEE, 93/44/CEE, 93/68/CEE
     -89/336/CEE
La macchina è altresì conforme al modello sottoposto all<quote>esame
per la certificazione CE:
...
ma, invece, chiamando la:
...
            Posizione = InStr(Posizione, tmpStringa, vbNewLine) - 1
            If Posizione >= 0 Then
                TestoParziale = Left(tmpStringa, Posizione)
...
cazzarola vigliacca la instr becca solo il primo e l'ultimo <newline>
che vi ho incollato sopra. tutti quelli in mezzo li salta.
qualcuno ha qualche hint da darmi? qualcuno vuole tutto il codice per
dargli un'occhiata?
come sempre, vi ringrazio in anticipo per l'aiuto.
saluti.
-- 
      Gianni "bugbarbeq" Rondinini, 27+15, RA, 193, 152
   VBR - Vero Birro Romagnolo®, diffidate dalle imitazioni!
 BMW 530D "BatMobile EVO" Driver - Escortone da 500 CV dreamer
Kawasaki "Gas Gas" ZZ-R 1100 - HD Electra Ultra Classic Dreamer
   On contrary of popular belief, Unix *IS* user friendly:
    it just appears to be selective who it is friend with

                 TestoParziale = Left(tmpStringa, Posizione)
                    Posizione=Posizione+2
                    ....
                End if

                 End if
piů veloce (***):
                     Posizione=Posizione+3

                    Posizione=Posizione+2
scusa, non sono stato chiaro a sufficienza.
il fatto e' che instr non vede il newline, non che posizione viene
messo nel posto sbagliato.
saluti.
-- 
      Gianni "bugbarbeq" Rondinini, 27+15, RA, 193, 152
   VBR - Vero Birro RomagnoloŽ, diffidate dalle imitazioni!


 
Il tuo modo di procedere mi sembra corretto. Quindi passiamo alle 
ipotesi assurde. ;-)
Nella prima riga usa 2 variabili diverse per la posizione, cioe':
Posizione = InStr(OldPosizione,tmpStringa, ....
ciao
		maxx
-- 
NOSPAM: Rimuovere i trattini dallo username!

 messo nel posto sbagliato.
Io credo invece che non ti veda il vbNewLine perchč Posizione č mal
posizionato.

 qualcuno ha qualche hint da darmi?
Ti avviso è l' 1.15 AM quindi NON prendere per oro colato quello che ti sto
per dire :-))
Se non sbaglio il comportamento della InStr è corretto: cioè becca solo la
prima occorrenza.
Come riportato su
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/off2000/htm
l/refctInStr.asp :
Returns a Variant (Long) specifying the position of the *first* occurrence
of one string within another.
Per risolvere il tuo problema devi fare un bel Loop incrementando di volta
in volta la variabile Posizione (come tu ha suggerito Lupo) in modo da
partire dal punto in cui eri arrivato + 2 (vbNewLine = Chr$(10) + Chr$(13)).
Ciao!
--
Lorenzo Benaglia
UGIdotNET - 
http://www.ugidotnet.org

                 TestoParziale = Left(tmpStringa, Posizione)
immagino tu debba fare un loop, quindi io lo formulerei cosi':
    Posizione = -1
    Do
            Posizione = InStr(Posizione + 2, tmpStringa, vbNewLine) - 1
            If Posizione = -1 Then TestoParziale = tmpStringa: Exit Do
            TestoParziale = Left(tmpStringa, Posizione)
    Loop
beppe

posizionato.
ah, ok :)
visto in quest'ottica, il tuo suggerimento precedente e' diverso.
controllo.
ciao e grazie.


sono un pirla completo...
ho capito cosa non va: nel mio codice uso posizione per trovare il
primo newline. poi taglio la stringa e lavoro sulla stringa tagliata,
ma mi sono dimenticato di riportare posizione a 0... :D
grazie per l'aiuto.


 ma mi sono dimenticato di riportare posizione a 0... :D
Più che pirla, direi un po' sprovveduto nel cercare aiuto.
Quello del taglio della stringa e del mancato riposizionamento, è uno dei
grandi classici fra gli errori nell'elaborazione di stringhe.
E' stata la prima cosa a cui ho pensato, ma nel tuo codice non si vedeva
alcuna assegnazione, anzi, nella funzione Instr veniva utilizzata sempre la
stringa originale, e la porzione tagliata veniva messa in altra variabile.
Postando un paio di righe in più avresti avuto la risposta in un minuto.
:-)))
Ciao
Alberto

    Loop
questo e' bello. di solito gli exit do non li uso, comunque lo provo
perche' e' bello.


Postando un paio di righe in più avresti avuto la risposta in un minuto.
sai cosa mi ha fregato? il fatto e' che quello non e' l'unico posto
dove faccio quell'operazione. devo stampare il testo di un leasing ed
alcune note ed il caso --bastardo ;)-- ha voluto che altrove avessi
fatto, per provare la routine, tutte frasi di lunghezza sempre
crescente. il taglio della stringona lunga in frasi separate, quindi,
funzionava bene perche' posizione doveva sempre aumentare il proprio
valore... copiato il codice in quel punto, invece, non c'e' stato
verso di farlo funzionare...
che fenomeno che sono :)
saluti.
