Newsgroup: it.comp.lang.visual-basic
Titolo: Problema con una Function





Salve,


 


    sono alcuni giorni che mi 
scervello per fare una funzioncina ricorsiva che poi alla fine mi restituisce un 
array ma nel modo in cui la vorrei fare non ci riesco.


 


 


Dim arrStr() As String
Dim x As 
Integer


 


Private Sub Form_Load()
    x = 
0
End Sub


 


Private Sub strArr(ByVal s As String, ByVal i As 
Integer)
    ReDim Preserve arrStr(i)
    
arrStr(i) = s
End Sub


 


Private Function strLine(ByVal s As String, 
ByVal l As Integer) As String()
    If Len(s) <= l 
Then
        Call strArr(s, 
x)
        
Else
            Do 
While Mid$(s, l, 1) <> " 
"
            l = l - 
1
            If l = 0 
Then
                
Exit Do
            
End If
        
Loop
        If l > 0 
Then


            
Call strArr(Mid$(s, 1, l - 1), 
x)
            x = x + 
1
            strLine 
(Right$(s, Len(s) - l)), 
(CInt(Text2.Text))
        End 
If
    End If
End Function


 


Private Sub butCarica_Click()
    
Dim ar() As String
    Dim i As Integer
    
ar = strLine(Text1.Text, CInt(Text2.Text))
    For i = 0 To 
UBound(ar)
        MsgBox 
(ar(i))
    Next
End Sub


 


Questo è tutto il mio codice, spero di avrelo 
riportato correttamente.


Vorrei che la funzione "
strLine"
 
mi restituisse un array contenete tutte le stringe di lunghezza <= a l tipo 
come funziona la funzione Split.


 


Dove sbaglio?, potete aiutarmi?.


 


Spero di essere stato chiaro.


 


GRAZIE



 le stringe di lunghezza <= a l tipo come funziona la funzione Split.
E perchè fare una funzione ricorsiva quando basta un loop?
Sempre che abbia capito cosa vuoi fare... tu vuoi che dato "ciao" ti venga 
restituito un array con "c", "ci", "cia"... giusto?
VB6 o VB.net?
Ciao 

 Dove sbaglio?, potete aiutarmi?.
In primis mi pare di vedere che tu NON assegni il valore di ritorno di StrLine,
ad esempio. Poi non so se ci sono altre magagne.
Bye
Raf
-----------------------------------------------------
Funk: cooler than the other side of the pillow.

 ha 
  scritto nel messaggio 
news:4630cb8f$0$10624$4faf...@reader2.news.tin.it
...


 spero di essere stato + chiaro in quello che vorrei fare.
Ok, mi pare che tu voglia implementare una routine di word-wrapping, giusto?
Devi suddividere un testo, senza spezzare le parole, su più linee di lunghezza
massima assegnata.
Come diceva Fabio, perché scomodare la ricorsione quando si può fare tutto con
un solo ciclo for-next?
Ti dò qualche dritta:
a) raccogli le parole in un array usando Split
b) scorri l'array concatenando man mano ciascuna parola (ed eventualmente uno
spazio) in una stringa di appoggio, in modo da formare linee di lunghezza non
superiore al massimo, separando con vbCrLf
c) Trasformi la stringa di appoggio nell'array desiderato usando nuovamente
Split (con separatore vbCrLf)
Bye
Raf

 Split (con separatore vbCrLf)
Ma tu hai capito quello che vuole fare?
Me lo spieghi tu?
Ciao 


Non ne sono sicuro al 100% però, come dicevo sopra, ha tutta l'aria di voler
fare un word-wrapper.
Cioè, dato un blocco di testo senza interruzioni di riga deve trasformarlo in un
blocco formattato con una lunghezza di riga non superiore ad un valore
prefissato.
Il tutto senza spezzare le parole contenute nel testo.
Le varie linee le preferisce in un array (avrà i suoi motivi).
Manuel potrà confermarci se ho capito bene oppure se ho preso un granchio.


Vi ringrazio e scusate del disturbo, sono riuscito a risolvere il problema:
Private Function strLine(ByVal s As String, ByVal l As Integer) As String()
    Dim arr() As String
    Dim arrStr() As String
    Dim str As String
    Dim i, j As Integer
    j = 0
    arr = Split(s, " ")
    For i = 0 To UBound(arr)
        str = str & arr(i) & " "
        If Len(str) >= l Then
            ReDim Preserve arrStr(j)
            arrStr(j) = Trim$(str)
            str = ""
            j = j + 1
        End If
    Next
    strLine = arrStr
End Function
CIAO
"Rafunk" <rafun...@NOTHANKSlibero.it> ha scritto nel messaggio 
news:f0su0s$5fu$1...@alix.livenet.it...


 End Function
Cosa succede se richiamo la ta funzione cosě:
debug.print strLine("pippo",25)?
Ti manca un Else nell'if.
Inoltre io splitterei prima al ritorno a capo eventuale dell'utente, e
poi con gli spazi. Non so a che ti serve ma se scrivo
<Pippo
Pluto
tante altre parole>
Se richiedo una split con lenMax=15, le prime due righe le vorrei
comunque separate e non unite (pensando ad esempio ai righi di una
fattura).
Se poi l'ingresso č senza vbNewLine allora puoi lasciar stare per ora.
-- 
Freccia@Bulldozer63 :D

ho messo un if prima di lanciare la funzione:
if len(STRINGA) > LUNGHEZZA then
    ...strLine(STRINGA,LUNGHEZZA)
else
    -
    -
    -
end if
"Freccia (VegetaSSj)" <NIENTESPAMfre...@hotmail.invalid> ha 
scritto nel messaggio news:13hrntnexg5nd$.bvz4pelmv8tx$.dlg@40tude.net...


Se hai una soluzione migliore ti sarei grato se potessi aiutarmi a 
migliorare la mia funzione.
GRAZIE
"Freccia (VegetaSSj)" <NIENTESPAMfre...@hotmail.invalid> ha 
scritto nel messaggio news:13hrntnexg5nd$.bvz4pelmv8tx$.dlg@40tude.net...


 migliorare la mia funzione.
Bhe ti basta aggiungere un split per il VbNewLine, e poi cicli su questo
array e lo ri-splitti come fai ora.
Potrebbe venire qualcosa del genere (vado a braccio):
Dim aNL as string()
Dim z as long
j = 0
aNL= Split(s,vbNewLine)
for z=0 to Ubound(aNL)
if len(aNL(z)) > l then			
    arr = Split(aNL(z), " ")
    For i = 0 To UBound(arr)
        str = str & arr(i) & " "
        If Len(str) >= l Then
            ReDim Preserve arrStr(j)
            arrStr(j) = Trim$(str)
            str = ""
            j = j + 1
        End If
    Next
Else			'Non serve spezzare è già <
  ReDim Preserve arrStr(j)
  arrStr(j) = Trim$(str)
  j = j + 1
End If
Next Z
strLine = arrStr
-- 
Freccia@Bulldozer63 :D