Newsgroup: it.comp.programmare.win32
Titolo: [C++ builder] testo colorato

Salve,
e' possibile avere del testo multicolore all'interno di una text edit?
Ad esempio vorrei che la parola CIAO avesso 4 colori differenti, uno
per ogni lettera... che proprietà dovrei usare?
Forse qualcosa legata alla selezione del testo? Quali sono i metodi
per ottenere il testo selezionato in una text edit?
Grazie in anticipo

 text edit?
No, per lo meno non nativamente. Utilizza un TRichEdit.
HTH,
-- 
Stefano Frosio
www.esse-effe.com

 No, per lo meno non nativamente. Utilizza un TRichEdit.
Si, scusa, mi riferivo alle text edit di quel tipo, ovvero le
RichEdit :-)
Supportano tale opzione? Che metodi dovrei usare?
Ciao

 Supportano tale opzione? Che metodi dovrei usare?
Ti posto un esempio, credo sia la cosa più semplice.
    for (int i = 0; i < RichEdit1->Text.Length(); i++)
    {
        RichEdit1->SelStart = i;
        RichEdit1->SelLength = 1;
        RichEdit1->SelAttributes->Color = RGB((i << 5) & 0xFF, 
0, 0);
    }
Il testo contenuto è colorato con alcune gradazioni di rosso.
-- 
Stefano Frosio
www.esse-effe.com

 Il testo contenuto è colorato con alcune gradazioni di rosso.
Direi che l'unica istruzione da studiare è questa:
RichEdit1->SelAttributes->Color = RGB((i << 5) & 0xFF, 0, 0);
In pratica assegno al testo selezionato il colore che si ottiene dalla
funzione RGB che ha come primo parametro lo shift a sinistra di i e
facendo l'and con FF in modo da avere le varie gradazioni... i 2
parametri finali a che servono? Quali sono i colori disponibili? Da
0x00 a 0xFF cioè da 0 a 255?
Se consideriamo i = 0..3 si ha quanto segue?
11111111 & 000000
11111111 & 100000
11111111 & 1000000
11111111 & 1100000
Dato che FF ha 8 bit l'istruzione tipo 2 << 5 diventa: 1000000, ma il
bit mancante dove lo inserisce?
In generale il primo parametro deve essere un valore esadecimale?
Grazie

e' possibile avere del testo multicolore all'interno di una text edit?
No, devi usare un TRichEdit. Peccato che è lentissimo.

In generale il primo parametro deve essere un valore esadecimale?
Assolutamente no. Ma guarda che il codice di Stefano è solo un
esempio, puoi mettere qualsiasi valore per il canale del rosso, quello
che ti aggrada di più. Nello specifico, l'and (&) usato nell'esempio
serve a rendere uguale a 255 qualsiasi valore lo superi dopo lo shift
(<<).

 che ti aggrada di più.
Ah ecco, mi pare accetti numeri in base 8, 10 e 16.
Grazie 

Ah ecco, mi pare accetti numeri in base 8, 10 e 16.
Sono rappresentazioni: ottale, decimale ed esadecimale. Ma sono
rappresentazioni C/C++, in generale.

Ma è possibile impostare gli intervalli da colorare prima di inserire il 
testo?
Ad esempio vorrei che nella frase "Messaggio di prova" la parola Messaggio 
fosse rossa e il resto nero, ma la frase verrà inserita dopo:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    String s = "Messaggio di prova";
    RichEdit1->SelStart = 0;
    RichEdit1->SelLength = 9;
    RichEdit1->SelAttributes->Color = RGB(255, 0, 0);
    RichEdit1->Text = s;
}
In questo modo ottengo tutto il messaggio in rosso e non solo quella 
parte...
Grazie 


Ecco gli zeri mancanti sono inseriti all'inizio, ovviamente.
In pratica poiché FF è 11111111 e 2 << 5 è 1000000 volevo sapere dove 
venivano messi i due bit mancanti, anche se in effetti e' logico che siano 
inseriti all'inizio altrimenti il valore di 2 << 5 cambierebbe quindi 
diventa 01000000... era solo un chiarimento, sul momento quando l'ho letto 
mi è venuto un dubbio :-)
Ciao

testo?
No. La selezione lavora sul testo presente.

venivano messi i due bit mancanti
Non ci sono "bit mancanti che vengono inseriti". Il numero 1000000
viene messo in and con 11111111:
01000000 &
11111111 =
01000000
Ovvio che nel fare l'operazione di and devi tener conto del bit 0
iniziale.

 di i e
Questo te l'hanno già spiegato, comunque in effetti il mio era 
solo un esempio per far vedere i caratteri con colore diverso, 
niente più.
-- 
Stefano Frosio
www.esse-effe.com

 verrà inserita dopo:
Questo lo puoi fare, ma non impostando a priori il colore delle 
varie parti di testo, bensì verificando ad ogni cambiamento il 
testo inserito e modificando gli attributi delle parti che ti 
interessano. In pratica, è quello che fanno molti editor quando 
evidenziano la sintassi di un linguaggio particolare.
-- 
Stefano Frosio
www.esse-effe.com

 No, anzi, quella è la meno importante.
E si ma quel paramentro che hai passato mi ha fatto un po confondere :-D
SelStart e SelLength sono immediate, è solo questione di sapere la sintassi.
Grazie 

 linguaggio particolare.
In pratica quello che ho fatto io è un editor che interpreta una sintassi 
che indica il colore con dei caratteri apposta che precedono la frase. 
Comunque ho trovato la soluzione, ho già fatto tutto, grazie :-)
Ciao 

 :-)
Meglio così, prego.
-- 
Stefano Frosio
www.esse-effe.com

 il colore in base alla sintassi.
Il punto č che per come l'avevo pensato all'inizio mi veniva piů comodo in 
quel modo. 

 ha scritto:
Nella guida ho letto che per avere tale formattazione devo usare una 
sintassi simile:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
     RichEdit1->DefAttributes->Style << fsBold << fsItalic;
}
Ma non ottengo alcuna modifica al testo... come dovrei fare? 

 Ma non ottengo alcuna modifica al testo... come dovrei fare?
RichEdit1->DefAttributes->Style = TFontStyles() << fsBold << 
fsItalic;
-- 
Stefano Frosio
www.esse-effe.com

 RichEdit1->DefAttributes->Style = TFontStyles() << fsBold << fsItalic;
Grazie, non capisco perché nella guida l'esempio fosse senza la chiamata a 
TFontStyles();
Ciao 

 la chiamata a TFontStyles();
L'esempio che ho io nella guida per DefAttributes č il seguente 
e funziona correttamente:
RichEdit1->DefAttributes->Style =
    RichEdit1->DefAttributes->Style << fsBold << fsItalic;
-- 
Stefano Frosio
www.esse-effe.com

Rispondo ad un vecchio thread per evitare di aprirne uno nuovo dato che la 
mia richiesta è sempre inerente al testo:
Vorrei sapere come fare per poter settare le proprietà Size, Font, e Height 
del testo contenuto in una RichEdit.
Io ho provato questo codice ma non funziona:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    RichEdit1->Font->Name = "Courier";
    RichEdit1->Font->Size = 8;
    RichEdit1->Font->Height = -11;
}
Ma non funziona.
Ciao 

Inoltre non capisco perché se uso SelAttributes->Color per settare il colore 
di una porzione di testo selezionato, DefAttributes->Color non funziona piů:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    RichEdit1->DefAttributes->Color = clRed;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
    RichEdit1->DefAttributes->Color = clBlue;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
    RichEdit1->SelAttributes->Color = clGreen;
}
Cliccando su Button2 e su Button3 ottengo il testo nella RichEdit in rosso e 
blu rispettivamente. Ma non appena clicco sul Button3 e coloro di verde una 
porzione del testo, Button2 e Button3 non funzionano piů, anche se clicco 
non cambia niente all'interno della RichEdit.
Grazie