Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [VB6] textbox multiriga

    Quando stampo una textbox multiriga mi viene visualizzata con la corretta formattazione se per andare a capo ho premuto il tasto Invio, se invece va a capo automaticamente mi stampa tutto su una riga senza rispettare la formattazione che vedo nella textbox.
    Come posso ovviare a tale inconveniente?

  2. #2
    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

  3. #3
    Comincio col ringraziarti per la risposta, l'ho potuta leggere solo adesso, dalle prime prove che ho fatto sembra funzionare il codice che gentilmente hai postato. In una cosa potrebbe essere migliorato e cioè nel caso in cui alla fine del rigo della textbox se viene inserita una parola lunga va(ovviamente) a capo ed il problema che si verifica è che nel MsgBox vengono stampati sulla stessa riga i primi caratteri della riga successiva(che comincia con la parola lunga che ha provocato l'andata a capo)
    Es:

    sgrekjdf idfhkre ciao a
    tutti voi sdegkgir df jhr

    nel msgbox viene stampato:
    sgrekjdf idfhkre ciao a t
    utti voi sdegkgir df jhr
    Provare per credere
    Proverò a cercare una soluzione..Ciao e grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.