Putroppo, quando il ritorno a capo è fatto in automatico il CRLF non compare tra i caratteri del testo... Penso che tu te ne sia già accorto da solo.
L'unica maniera con cui puoi ovviare a questo è confrontare la lunghezza delle righe con la larghezza della TextBox: potresti
codice:
Dim sText As String
Dim TextBoxWidth As Long
Dim sTextArr() As String
'Recuperi contenuto e larghezza della TextBox
sText = Text1
TextBoxWidth = Text1.Width
' Splitti il contenuto per ritorni a capo (da INVIO)
sTextArr() = Split(sText, vbCrLf)
In questo modo hai un'array popolato con tutte le righe della TextBox.
Ogni elemento dell'array rappresenta una riga della TextBox ogni volta che sei andato a capo con INVIO.
Q questo punto dovresti fare un ciclo For sull'array, ad ogni iterazione fare un TextWidth del testo memorizzato nell'elemento dell'array. Con TextWidth ottieni la larghezza che occuperebbe, il testo passato, se venisse stampato sul Form. E' quindi opportuno assegnare al Form lo stesso Font della TextBox.
Una volta ottenuta questa larghezza, se questa è maggiore della larghezza della TextBox, dovresti "spezzettarla" in tante parti di larghezza massima uguale a quella della TexBox.
Eccoti un po' di codice:
(command1_Click esegue l'operazione che ti ho descritto sul testo di una TexBox)
codice:
Private Sub Command1_Click()
Dim sText As String
Dim TextBoxWidth As Long
Dim sTextArr() As String
Dim sTempString As String
Dim sNewRowStr As String
Dim j As Long
TextBoxWidth = Text1.Width ' ottiene larghezza TextBox
sText = Text1 ' testo su Text1
sTextArr() = Split(sText, vbCrLf) ' sTextplitta per ritorni a capo
' ciclo sulle righe
For j = 0 To UBound(sTextArr())
' confronto larghezza riga corrente con larghezza TextBox
' se è > la modifico aggiungendo ritorni a capo quanti bastando per creare
' n stringhe di larghezza = alla larghezza della TextBox
If TextWidth(sTextArr(j)) > TextBoxWidth Then sTextArr(j) = SplitInRows(sTextArr(j), TextBoxWidth)
Next j
sText = Join(sTextArr(), vbCrLf) ' nuovo testo in JOIN
MsgBox "Ecco il testo formattato come Text1: " & sText
End Sub
'
Private Function SplitInRows(ByVal Text As String, ByVal nLength As Long) As String
' Restituisce la string Text suddivisa in tante stringhe di larghezza
' massima = nLength concatenate con separatore CRLF
Dim sTemp As String
Dim sRetVal As String
While TextWidth(Text) > nLength
sTemp = Text
While TextWidth(sTemp) > nLength
sTemp = Left$(sTemp, Len(sTemp) - 1) ' trovo una strina di
Wend ' larghezza = nLength
Text = Mid$(Text, Len(sTemp) + 1) ' la elimino da Text
If sRetVal = "" Then ' concateno al valore
sRetVal = sTemp ' di ritorno
Else
sRetVal = sRetVal & vbCrLf & sTemp
End If
Wend
' concateno ultima parte
If Text <> "" Then sRetVal = sRetVal & vbCrLf & Text
SplitInRows = sRetVal
End Function
Purtroppo, il bordo della TextBox o eventuale Scrollbar verticale può causarti problemi in quanto, la larghezza della TextBox è sempre maggiore di quella dell'area editabile. Per il bordo ti basta determinare un valore costante da sottrarre alla larghezza. Per quanto riguarda la scrolbar (ammesso che la tua TextBox ne abbia una) dovresti trovarne la larghezza e sottrarla (penso che SendMessage ci si dovrebbe riuscire). Altrimenti puoi usare anche in questo caso una costante.
Spero di esserti stato utile
Ciao
Simo