Newsgroup: it.comp.lang.visual-basic
Titolo: RichTextBox!!!

Come faccio ad evidenziare una linea di testo con il controllo
RichTextBox???

 RichTextBox???
Cosa intendi per "evidenziare" ? Se ti basta, puoi usare corsivo
e/o grassetto e/o sottolineato e/o colore con le apposite proprietà.
Se quello che intendi è avere lo sfondo colorato, tipo evidenziatore,
devi "andare giù dvro" di API. E devi anche accertarti che l'OCX e un
paio di DLL siano delle versioni giuste, altrimenti non funziona.
Fammi sapere, se è questo che ti interessa domani posto un
po' di codice.
P.S.: ti interessa lavorare riga per riga, o sul testo selezionato ?
Nel primo caso bisogna prima fare un altro giro di API :-)
Bye, G.

> P.S.: ti interessa lavorare riga per riga, o sul testo selezionato ?
lo sfondo, riga per riga :)
Grazie.
"Paperino" <non...@lo.dico> ha scritto nel messaggio
news:ao4fmt$4b2e$1...@stargate1.inet.it...


 lo sfondo, riga per riga :)
OK, allora, inizia col creare un progetto con solo una RTB e un command.
Aggiungi un modulo e inseriscici questa roba:
*******************
Option Explicit
Public Const MaxCaratteri = 1024    ' Questo va scalato alla misura della TextBox
' ma penso che sia più che sufficiente.
Public Const LF_FACESIZE = 32
Public Const WM_USER = &H400
Public Const EM_GETLINE = &HC4
Public Const EM_GETLINECOUNT = &HBA
Public Const EM_EXSETSEL = (WM_USER + 55)
Public Const EM_SETSEL = &HB1
Public Const EM_GETSEL = &HB0
Public Const EM_SETCHARFORMAT = (WM_USER + 68)
Public Const mZERO = &H0&
Public Const CFM_BACKCOLOR = &H4000000
' EM_SETCHARFORMAT wParam masks
Public Const SCF_SELECTION = &H1&
Public Const SCF_WORD = &H2&
Public Const SCF_DEFAULT = &H0&    ' set the default charformat or PARAFORMAT
Public Const SCF_ALL = &H4&    ' not valid with SCF_SELECTION or SCF_WORD
Public Const SCF_USEUIRULES = &H8&    ' modifier for SCF_SELECTION  says that
' the format came from a toolbar, etc. and
' therefore UI formatting rules should be
' used instead of strictly formatting the
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal uMgs As Long, ByVal wParam As Long,
lParam As Any) As Long
Public Type CharRange
    cpMin As Long
    cpMax As Long
End Type
Private Type CHARFORMAT2
    cbSize  As Integer
    wPad1 As Integer
    dwMask  As Long
    dwEffects  As Long
    yHeight As Long
    yOffset As Long    ' > 0 for superscript, < 0 for subscript
    crTextColor As Long
    bCharSet As Byte
    bPitchAndFamily As Byte
    charszFaceName(0 To LF_FACESIZE - 1) As Byte
    wPad2 As Integer
    wWeight As Integer    ' Font weight (LOGFONT value)
    sSpacing As Integer    ' Amount to space between letters
    crBackColor As Long    ' Background color
    lcid  As Long    ' Locale ID
    dwReserved As Long    ' Reserved. Must be 0
    sStyle As Integer    ' Style handle
    wKerning As Integer    ' Twip size above which to kern char pair
    bUnderlineType As Byte    ' Underline type
    bAnimation As Byte    ' Animated text like marching ants
    bRevAuthor As Byte    ' Revision author index
    bReserved1 As Byte
End Type
Public Sub EvidenziaRTB(Scatola As RichTextBox, Colore As Long, lngInizio As Long, lngFine As Long)
    Dim hWndr As Long
    hWndr = Scatola.hwnd
    Dim FormatoCaratteri As CHARFORMAT2
    Dim Selezione  As CharRange
    Dim lngRet As Long
    ' Selezioniamo il range di caratteri che ci interessa:
    Selezione.cpMin = lngInizio
    Selezione.cpMax = lngFine
    ' mandiamo il messaggio per la selezione effettiva.
    ' in effetti equivale a porre .SelStart e .SelLength della RTB :-)
    SendMessage hWndr, EM_EXSETSEL, mZERO, Selezione
    FormatoCaratteri.cbSize = Len(FormatoCaratteri)
    FormatoCaratteri.dwMask = CFM_BACKCOLOR    ' indichiamo di usare l'attributo backcolor
    FormatoCaratteri.crBackColor = Colore    ' e gli settiamo il valore
    ' mandiamo alla RTBox il comando
    lngRet = SendMessage(hWndr, EM_SETCHARFORMAT, SCF_SELECTION, FormatoCaratteri)
    Debug.Print lngRet & " evidenzia"    ' se stampa 1 è OK, 0 = fallito
End Sub
Public Function NumeroRighe(Scatola As RichTextBox)
    NumeroRighe = SendMessage(Scatola.hwnd, EM_GETLINECOUNT, 0&, 0&)
End Function
Public Function PrendiRiga(Scatola As RichTextBox, NumeroDiRiga As Long) As String
' Questa funzione riempie Il buffer con la linea di testo
' presa dalla RichTextBox Scatola e alla linea specificata
' La prima linea è zero.
    Dim Buffer As String
    Dim Buff(MaxCaratteri) As Byte
    Dim byteBasso As Integer
    Dim byteAlto As Integer
    Dim intResult As Integer
    Dim k As Long
    For k = 0 To 256
        Buff(k) = 255
    Next k
    byteBasso = MaxCaratteri And (255)
    byteAlto = Int(MaxCaratteri / 256)
    Buffer$ = Chr$(byteBasso) & Chr$(byteAlto) & Space(MaxCaratteri - 2)
    intResult = SendMessage(Scatola.hwnd, EM_GETLINE, NumeroDiRiga, Buff(0))
    PrendiRiga = ""
    For k = 0 To 256
        If (Buff(k) = 255) Or (Buff(k) = 0) Then Exit For
        '        Debug.Print Buff(k)
        PrendiRiga = PrendiRiga & Chr$(Buff(k))
    Next k
End Function
*******************
Poi nel Command1_Click metti queste righe:
*******************
    Dim Linea As Long
    Dim Riga As String
    Dim PosizInizioRiga As Long
    Linea = Val(InputBox("Quale riga evidenzio ?")) - 1 ' ricorda che le linee partono da zero.
    If NumeroRighe(RichTextBox1) >= 1 Then
        Riga = PrendiRiga(RichTextBox1, Linea - 1)
        PosizInizioRiga = InStr(RichTextBox1.Text, Riga) - 1
        If PosizInizioRiga > -1 Then
        ' &HFFFFBB corrisponde ad un azzurro chiaro, un giallo per esempio sarebbe &H80FFFF
            EvidenziaRTB RichTextBox1, &HFFFFBB, PosizInizioRiga, Len(Riga) + PosizInizioRiga
        End If
    Else
        MsgBox "...e dove la trovo ?"
    End If
*******************
Attenzione: non c'è controllo degli errori, e c'è anche un bug
sottile e insidioso (veramente è grande come una casa, ma
si dice sempre così :-) ), voglio vedere chi lo vede per primo.
Hint: è nella routine del pulsante. :-)
P.S.: Tieni presente che per le RTBox esiste .GetLineFromChar,
potrebbe esserti utile.
Bye, G.

 Hint: č nella routine del pulsante. :-)


 '''''''''''''''''''''''''''
No, il problema è un altro. Ma che te ne accorgerai, prima o poi...
e la prima volta che ti si evidenzierà la riga sbagliata, allora capirai
perché ti ho dato quell'ultimo consiglio :-))))
Bye, G.