Black_Ocean
05-06-2007, 03:21:08
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 :D se los agradecería enormemente =)
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 :D estoy trancado en esto :(
De antemano gracias ;)
Saludos.
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 :D se los agradecería enormemente =)
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 :D estoy trancado en esto :(
De antemano gracias ;)
Saludos.