Ver Mensaje Individual
  #1  
Antiguo 05-06-2007
Avatar de Black_Ocean
Black_Ocean Black_Ocean is offline
Miembro
 
Registrado: nov 2006
Posts: 128
Reputación: 18
Black_Ocean Va por buen camino
Exclamation AYUDA! no puedo terminar un algoritmo de resalto de texto en un RichEdit!

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
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

const
  //Arreglo de algunas palabras reservadas del lenguaje SQL
  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.

Última edición por Black_Ocean fecha: 05-06-2007 a las 03:25:40.
Responder Con Cita