Hola amigos!
he recurrido a ustedes porque realmente no he podido terminar un algoritmo que trata lo siguiente:
En un componente RichEdit quiero resaltar en colores las palabras reservadas del lenguaje SQL cuando el usuario escriba una consulta. El método lo tengo puesto en OnChange del RichEdit. Las palabras reservadas las metí en un arreglo de strings.
El procedimiento funciona bien mientras el usuario escribe sin retroceder con Backspace, sin poner pegar texto y sin modificar una palabra de mas atrás. Justamente aquí necesito ayuda. Que cuando el usuario retoceda o ponga pegar texto o modifique una palabra que se encuentre mas atrás en el RichEdit también me resalte en colores las palabras reservadas, y no que se vuelvan a negras :S ya que me falla :S no he podido solucionarlo
Aquí dejo mi actual código por si me pueden echar una manito
se los agradecería enormemente =)
Código Delphi
[-]unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
RichEditSQLConsulta: TRichEdit;
Button1: TButton;
procedure RichEditSQLConsultaChange(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
const
SQLPalabrasReservadas: array [0..15] of string = ('SELECT',
'DISTINC',
'TOP',
'PERCENT',
'AS',
'FROM',
'WHERE',
'LIKE',
'BETWEEN',
'AND',
'OR',
'LEFT',
'RIGHT',
'ORDER',
'GROUP',
'BY');
{$R *.dfm}
procedure TForm1.RichEditSQLConsultaChange(Sender: TObject);
var
i, j, k: integer;
Encontrada: boolean;
SubCadena: string;
ActualPosicionCursor: integer;
begin
if RichEditSQLConsulta.Text = '' then
begin
RichEditSQLConsulta.SelAttributes.Color := clWindowText;
RichEditSQLConsulta.SelAttributes.Style := [];
end;
for i := 0 to RichEditSQLConsulta.SelStart - 1 do
for j := i + 1 to Length(RichEditSQLConsulta.Text) do
begin
for k := Low(SQLPalabrasReservadas) to High(SQLPalabrasReservadas) do
begin
SubCadena := Copy(RichEditSQLConsulta.Text, i, j);
if UpperCase(SubCadena) = SQLPalabrasReservadas[k] then
begin
Encontrada := true;
Break;
end
else
Encontrada := false;
end;
if Encontrada = true then
begin
ActualPosicionCursor := RichEditSQLConsulta.SelStart;
RichEditSQLConsulta.SelStart := i - 1;
RichEditSQLConsulta.SelLength := Length(SubCadena);
RichEditSQLConsulta.SelAttributes.Color := clBlue;
RichEditSQLConsulta.SelAttributes.Style := [fsBold];
RichEditSQLConsulta.SelStart := ActualPosicionCursor;
RichEditSQLConsulta.SelAttributes.Color := clWIndowText;
RichEditSQLConsulta.SelAttributes.Style := [];
break;
end;
end;
end;
end.
Realmente necesito una ayudita
estoy trancado en esto
De antemano gracias
Saludos.