Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Colorear una palabra en un RichEdit (https://www.clubdelphi.com/foros/showthread.php?t=85706)

UsuarioBaja123 21-04-2014 19:02:19

Colorear una palabra en un RichEdit
 
Hola, necesito que un timmer lea todas las líneas (código ya lo tengo) de un TRichBox (o como se llame, no tengo el delphi delante) y mire si empieza cada por ejemplo por "Hola" y entonces ponga esa palabra en azul y el resto de la línea normal por ejemplo:

Hola Mundo

se quedaría en:

Hola Mundo

Podrían ayudarme para que localize la palabra para cambiarle el color y/o ponerla en negrita.

Muchas gracias.

ZayDun 22-04-2014 10:19:13

Hola ZaneMS,

Creo que lo que buscas es esto:

Código Delphi [-]
procedure WordsColor(RE: TRichEdit; TheWord: String; Color: TColor; Style: TFontStyles);
var
i, CharPos, CharPos2, noChars: Integer;
begin
CharPos := 0;
noChars := 0;
for i := 0 to Pred(RE.Lines.Count) do
noChars := noChars + Length(RE.Lines[i]);
repeat
CharPos2 := RE.FindText(TheWord, CharPos, noChars, [stWholeWord]);
CharPos := CharPos2+1;
RE.SelStart := CharPos2;
RE.SelLength := Length(TheWord);
RE.SelAttributes.Color := Color;
RE.SelAttributes.Style := Style;
until charpos = 0;
end;

No he entendido bien lo del timer, pero creo que es mejor que lo pusieras en el evento OnChange de el RichEdit.

Código Delphi [-]
//Ejemplo de uso
WordsColor(RichEdit1, 'Hola', clRed, [fsItalic, fsBold]);


Saludos.

Neftali [Germán.Estévez] 22-04-2014 10:59:57

Pues creo que la lo tienes solucionado aquí. Échale un vistazo al código.
Link al hilo completo.

UsuarioBaja123 22-04-2014 17:53:36

Re: Colorear una letra con un timmer (DUDA)
 
Código Delphi [-]
procedure TForm1.TextoChange(Sender: TObject);
var
       Posicion : integer;
begin
if
Texto.Lines.Text:=('Hola')
then
begin
         Posicion:=ansipos('Hola',Texto.Lines.Text);
         Texto.SelStart:=Posicion-1;
         Texto.SelLength:=Length('Hola');
         Texto.SelAttributes.Color:=clred;
         Posicion:=ansipos('Hola',Texto.Lines.Text);
end
else
         Texto.SelAttributes.Color := clblack;
end;

¿Por qué no funciona?

ecfisa 22-04-2014 17:55:54

Cita:

Empezado por ZaneMS (Mensaje 475384)
Hola, necesito que un timmer lea todas las líneas (código ya lo tengo) de un TRichBox (o como se llame, no tengo el delphi delante) y mire si empieza cada por ejemplo por "Hola" y entonces ponga esa palabra en azul y el resto de la línea normal por ejemplo:

Hola ZaneMS.

No entiendo como juega el timer en todo esto, pero para cambiar el color y estilo a la primera palabra de cada línea que coincida con buscada, podes hacer:
Código Delphi [-]
procedure PaintFirstWord(RichEdit: TRichEdit; const aWord:string;
  const aColor: TColor; const aStyle: TFontStyles);
var
  Found,l: Integer;
begin
  with RichEdit do
  begin
    Found:= FindText(aWord, 0, Length(Text),[]);
    while Found <> -1 do
    begin
      SelStart:= Found;
      SelLength:= Length(aWord);
      l:= Perform(EM_LINEFROMCHAR, SelStart, 0);
      if AnsiPos(aWord, Lines[l]) = 1 then
      begin
        SelAttributes.Color:= aColor;
        SelAttributes.Style:= aStyle;
        Inc(Found, Length(Lines[l])-length(aWord));
      end;
      Found:= FindText(aWord, Found+Length(aWord), Length(Text),[])
    end;
  end;
end;

Llamada:
Código Delphi [-]
  PaintFirstWord(RichEdit1, Edit1.Text, clBlue, [fsBold]);
Saludos :)

UsuarioBaja123 22-04-2014 19:10:33

¡¡¡¡¡¡¡¡¡Gracias, efisca!!!!!!!!!

Me has resolvido tu todos los problemas que he tenido, ¡¡¡¡¡muchas gracias!!!!!

UsuarioBaja123 22-04-2014 19:27:57

1 Archivos Adjunto(s)
Vale, ahora que me lo solucionaste de la mejor manera posible (que de paso digo al primero que me contestó que su código casi me había servido) este es mi problema.

Necesito que cuando tu código haga su funcionamiento si yo siga escribiendo vuelva a la letra normal. En este caso, estoy escribiendo (la palabra a buscar es "HOLA":

_____________
HOLA a todos
_____________

y me lo deja así:

_____________
HOLA a todos
_____________

Debido a que sigo escribiendo con la misma fuente anterior. Me gustaría que si usara un texto como el siguiente se quede así:

_______________
HOLA a todos
HOLA a ustedes
HOLA sin perdones (no se me ocurre nada)
hola //Ven que también me den válidas las minúsculas.
_______________

Y cuando me encuentra la palabra a poner en rojo resulta que me la selecciona lo cual no me deja escribir a menos que esté quitando el ratón todo el rato. Algo así:

Hol ---> Hola ----> Como en la imagen adjunta...

Y al seguir escribiendo me la vuelve a seleccionar y no me deja seguir.

Por favor, ayúdenme; ya que terminé el compilador en C quiero poder poner un entorno con colores y resaltos. A ver si estos meses han servido para algo. (Y no, no es de la universidad es para un proyecto mío voluntario)

ecfisa 22-04-2014 19:48:23

Hola ZaneMS.
Cita:

Empezado por ZaneMS (Mensaje 475450)
Necesito que cuando tu código haga su funcionamiento si yo siga escribiendo vuelva a la letra normal.

Una posible solución es:
Código Delphi [-]
procedure TForm1.RichEdit1KeyPress(Sender: TObject; var Key: Char);
begin
  RichEdit1.SelAttributes.Assign(RichEdit1.Font);
end;

Otra:
Código Delphi [-]
procedure TForm1.ButtonFont(Sender: TObject);
begin
  if FontDialog1.Execute then
    RichEdit1.SelAttributes.Assign(FontDialog1.Font);
end;

Saludos :)


La franja horaria es GMT +2. Ahora son las 09:18:24.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi