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

    [DELPHI] Cambio rapido del font in un RichEdit

    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

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    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!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    eccolo:

    codice:
    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...

  4. #4
    up

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Prova con questo codice, anche se scandire continuamente le stesse lettere già formattate non è una soluzione performante.
    codice:
    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.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

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

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    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.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

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.