PDA

Visualizza la versione completa : [DELPHI] Cambio rapido del font in un RichEdit


gygabyte017
24-03-2006, 17:03
Ciao Alka! Ciao a tutti!

Mi interessa inserire nell'evento OnChange di un TRichEdit un codice che modifica il colore del font di tutte le lettere scritte nel RichEdit in questo modo:
1a lettera: blu
2a lettera: rossa
3a lettera: verde
4a lettera: blu
5a lettera: rossa
6a lettera: verde
...
e così via sempre gli stessi 3 colori.

Realizzare uan cosa simile è facilissimo, il problema è che, se si ha un testo di 50 righe x esempio, ogni volta ci mette qualche secondo x colorare tutto, e questo NON è accettabile! Come posso fare x farlo istantaneo? sevo utilizzare SendMessage ?


Perdonate la stupidità dell'esempio.

Grazie ciao :ciauz:

alka
24-03-2006, 17:17
Non penso proprio che esista una costante relativa ad un messaggio che, inviato al RichEdit, esegua istantaneamente una formattazione di quel tipo, alquanto insolita. :)

Presumo che si possa risolvere il problema lavorando, per quanto possibile, all'ottimizzazione del codice che esegue le formattazioni.

Magari, riporta il codice così verifichiamo che non sia un problema algoritmico piuttosto che una latenza del controllo RichEdit in sé.

Ciao! :ciauz:

gygabyte017
24-03-2006, 18:23
eccolo:



procedure TForm1.RichEdit1Change(Sender: TObject);
var i:integer; lastsel:integer;
begin
lastsel:=RichEdit1.SelStart;
for i:=0 to Length(RichEdit1.Text)-1 do
begin
RichEdit1.SelStart:=i;
RichEdit1.SelLength:=1;
case (i+1)mod 3 of
1: RichEdit1.SelAttributes.Color:=clBlue;
2: RichEdit1.SelAttributes.Color:=clRed;
0: RichEdit1.SelAttributes.Color:=clGreen;
end;

RichEdit1.SelStart:=lastSel;
end;
end;

se provi a riempire già 4-5 righe ci mette 1-2 secondi...

gygabyte017
25-03-2006, 13:50
up

alka
25-03-2006, 15:40
Prova con questo codice, anche se scandire continuamente le stesse lettere già formattate non è una soluzione performante.


var
LastSel: Integer;
i: Integer;
begin
MyRichEdit.Hide;
try
LastSel := MyRichEdit.SelStart;
for i := 0 to Length(MyRichEdit.Text) - 1 do
begin
MyRichEdit.SelStart := i;
MyRichEdit.SelLength := 1;
case (i+1) mod 3 of
0:
if MyRichEdit.SelAttributes.Color <> clGreen then
MyRichEdit.SelAttributes.Color := clGreen;
1:
if MyRichEdit.SelAttributes.Color <> clBlue then
MyRichEdit.SelAttributes.Color := clBlue;
2:
if MyRichEdit.SelAttributes.Color <> clRed then
MyRichEdit.SelAttributes.Color := clRed;
end;
MyRichEdit.SelStart:=LastSel;
end;
finally
MyRichEdit.Show;
MyRichEdit.SetFocus;
end;
end;


C'è da dire che forse sarebbe meglio evitare la continua selezione di testo, ma forse sarebbe necessario agire con qualche funzione API complessa. :stordita:

Ciao! :ciauz:

gygabyte017
25-03-2006, 17:23
diciamo che il tempo si è ridotto di parecchio! Adesso si fa 50 righe in 1 secondo. Che intendi con:

ma forse sarebbe necessario agire con qualche funzione API complessa. ?

grazie :ciauz:

alka
25-03-2006, 18:39
Mi riferisco al fatto che i metodi e le proprietà del controllo RichEdit espongono solo un limitato "sottoinsieme" di quelle che sono probabilmente le reali possibilità di agire su quel controllo Windows usando funzioni API dirette; ad esempio, suppongo (in quanto non ho mai avuto occasione di provarlo) che vi siano API specifiche per ottenere informazioni sulle caratteristiche del testo o per costruire controlli personalizzati simili a RichEdit senza dover sfruttare gli attributi della selezione per ottenere informazioni su una determinata parte di testo.

Non sono informato, comunque, su questo frangente. :bhò:

Ciao! :ciauz:

Loading