Te paso una rutinilla que encontré por internet hace tiempo, que aplica un estilo a un richedit cuando el texto ya está.
A ver si te es útil.
Código Delphi
[-]
procedure TFormSQL._ChangeSintaxis(Form:TForm; vStyle:String;
RichE:TRichedit; InVisible:Boolean=True);
const
CodeC1: array[0..20] of String = ('#','$','(',')','*',',',
'.','/',':',';','[',']','{','}','<','>',
'-','=','+','''','@');
CodeC2: array[0..209] of String = (
'ACTION','ADD','ALL', 'ALTER', 'AND', 'ANY', 'AS', 'ASC', 'AUTHORIZATION', 'AVG',
'BACKUP', 'BEGIN', 'BETWEEN', 'BREAK', 'BROWSE', 'BULK', 'BY',
'CASCADE', 'CASE', 'CHECK', 'CHECKPOINT', 'CLOSE', 'CLUSTERED', 'COALESCE',
'COLLATE', 'COLUMN', 'COMMIT', 'COMMITTED', 'COMPUTE', 'CONFIRM', 'CONSTRAINT', 'CONTAINS', 'CONTAINSTABLE', 'CONTINUE', 'CONTROLROW', 'CONVERT', 'COUNT',
'CREATE', 'CROSS', 'CURRENT', 'CURRENT_DATE', 'CURRENT_TIME', 'CURRENT_TIMESTAMP', 'CURRENT_USER', 'CURSOR',
'DATABASE', 'DBCC', 'DEALLOCATE', 'DECLARE', 'DEFAULT', 'DELETE', 'DENY', 'DESC', 'DISABLE', 'DISK', 'DISTINCT', 'DISTRIBUTED', 'DOUBLE', 'DROP', 'DUMMY', 'DUMP',
'ELSE', 'ENABLE', 'END', 'ERRLVL', 'ERROREXIT', 'ESCAPE', 'EXCEPT', 'EXEC', 'EXECUTE', 'EXISTS', 'EXIT',
'FETCH', 'FILE', 'FILLFACTOR', 'FLOPPY', 'FOR', 'FOREIGN', 'FORWARD_ONLY', 'FREETEXT', 'FREETEXTTABLE', 'FROM', 'FULL', 'FUNCTION',
'GO', 'GOTO', 'GRANT', 'GROUP',
'HAVING', 'HOLDLOCK',
'IDENTITY', 'IDENTITY_INSERT', 'IDENTITYCOL', 'IF', 'IN', 'INDEX', 'INNER', 'INSERT', 'INTERSECT', 'INTO', 'IS', 'ISOLATION',
'JOIN',
'KEY', 'KILL',
'LEFT', 'LEVEL', 'LIKE', 'LINENO', 'LOAD',
'MIRROREXIT', 'MOVE',
'NATIONAL', 'NO', 'NOCHECK', 'NONCLUSTERED', 'NOT', 'NOUNLOAD', 'NULL', 'NULLIF',
'OF', 'OFF', 'OFFSETS', 'ON', 'ONCE', 'ONLY', 'OPEN', 'OPENDATASOURCE', 'OPENQUERY', 'OPENROWSET', 'OPTION', 'OR', 'ORDER', 'OUTER', 'OVER',
'PERCENT', 'PERM', 'PERMANENT', 'PIPE', 'PLAN', 'PRECISION', 'PREPARE', 'PRIMARY', 'PRINT', 'PRIVILEGES', 'PROC', 'PROCEDURE', 'PROCESSEXIT', 'PUBLIC',
'RAISERROR', 'READ', 'READTEXT', 'READ_ONLY', 'RECONFIGURE', 'RECOVERY', 'REFERENCES', 'REPEATABLE', 'REPLICATION', 'RESTORE', 'RESTRICT', 'RETURN', 'RETURNS', 'REVOKE', 'RIGHT', 'ROLLBACK', 'ROWCOUNT', 'ROWGUIDCOL', 'RULE',
'SAVE', 'SCHEMA', 'SELECT', 'SERIALIZABLE', 'SESSION_USER', 'SET', 'SETUSER', 'SHUTDOWN', 'SOME', 'STATISTICS', 'STATS', 'SYSTEM_USER',
'TABLE', 'TAPE', 'TEMP', 'TEMPORARY', 'TEXTSIZE', 'THEN', 'TO', 'TOP', 'TRAN', 'TRANSACTION', 'TRIGGER', 'TRUNCATE', 'TSEQUAL',
'UNCOMMITTED', 'UNION', 'UNIQUE', 'UPDATE', 'UPDATETEXT', 'USE', 'USER',
'VALUES', 'VARYING', 'VIEW',
'WAITFOR', 'WHEN', 'WHERE', 'WHILE', 'WITH', 'WORK', 'WRITETEXT');
var
FoundAt : LongInt;
StartPos, ToEnd, i : integer;
OldCap,T : String;
FontC, BackC, C1, C2 ,C3 ,strC, strC1 : TColor;
begin
OldCap := Form.Caption;
Self.FStyle := vStyle;
with RichE do
begin
Font.Name := RichE.Font.Name;
Font.Size := RichE.Font.Size;
if InVisible then
begin
Visible := False;
Form.Caption := 'Executing Code Coloring...';
end;
if WordWrap then WordWrap := false;
SelectAll;
SelAttributes.color := clBlack;
SelAttributes.Style := [];
SelStart := 0;
end;
BackC := clWhite; FontC := clBlack;
C1 := clBlack; C2 := clBlack; C3 := clBlack;
strC := clBlue; strC1 := clSilver;
if vStyle = 'Twilight' then
begin
BackC := clBlack; FontC := clWhite;
C1 := clLime; C2 := clSilver; C3 := clAqua;
strC := clYellow; strC1 := clRed;
end
else
if vStyle = 'Default' then
begin
BackC := clWhite; FontC := clBlack;
C1 := clTeal; C2 := clMaroon; C3 := clBlue;
strC := clMaroon; strC1 := clSilver;
end
else
if vStyle = 'Ocean' then
begin
BackC := $00FFFF80; FontC := clBlack;
C1 := clMaroon; C2 := clBlack; C3 := clBlue;
strC := clTeal; strC1 := clBlack;
end
else
if vStyle = 'Classic' then
begin
BackC := clNavy; FontC := clYellow;
C1 := clLime; C2 := clSilver; C3 := clWhite;
strC := clAqua; strC1 := clSilver;
end
else
begin
with RichE do
begin
T := '{'+vStyle+' = Invalid Style [Default,Classic,Twilight,Ocean] ONLY! }';
Lines.Insert(0,T);
StartPos := 0;
ToEnd := Length(Text) - StartPos;
FoundAt := FindText(T, StartPos, ToEnd, [stWholeWord]);
SelStart := FoundAt;
SelLength := Length(T);
SelAttributes.Color := clRed;
SelAttributes.Style := [fsBold];
StartPos := 0;
ToEnd := Length(Text) - StartPos;
FoundAt := FindText('ONLY!', StartPos, ToEnd, [stWholeWord]);
SelStart := FoundAt;
SelLength := 4;
SelAttributes.Color := clRed;
SelAttributes.Style := [fsBold,fsUnderLine];
end;
end;
RichE.SelectAll;
RichE.color := BackC;
RichE.SelAttributes.color := FontC;
for i := 0 to 100 do
begin
with RichE do
begin
StartPos := 0;
ToEnd := Length(Text) - StartPos;
FoundAt := FindText(IntToStr(i), StartPos, ToEnd, [stWholeWord]);
while (FoundAt <> -1) do
begin
SelStart := FoundAt;
SelLength := Length(IntToStr(i));
SelAttributes.Color := C1;
SelAttributes.Style := [];
StartPos := FoundAt + Length(IntToStr(i));
FoundAt := FindText(IntToStr(i), StartPos, ToEnd, [stWholeWord]);
end;
end;
end;
for i := 0 to (Length(CodeC1) - 1) do
begin
with RichE do
begin
StartPos := 0;
ToEnd := Length(Text) - StartPos;
FoundAt := FindText(CodeC1[i], StartPos, ToEnd, []);
while (FoundAt <> -1) do
begin
SelStart := FoundAt;
SelLength := Length(CodeC1[i]);
SelAttributes.Color := C2;
StartPos := FoundAt + Length(CodeC1[i]);
FoundAt := FindText(CodeC1[i], StartPos, ToEnd, []);
end;
end;
end;
for i := 0 to (Length(CodeC2) - 1) do
begin
with RichE do
begin
StartPos := 0;
ToEnd := Length(Text) - StartPos;
FoundAt := FindText(CodeC2[i], StartPos, ToEnd, [stWholeWord]);
while (FoundAt <> -1) do begin
SelStart := FoundAt;
SelLength := Length(CodeC2[i]);
SelAttributes.Color := C3;
SelAttributes.Style := [fsBold];
StartPos := FoundAt + Length(CodeC2[i]);
FoundAt := FindText(CodeC2[i], StartPos, ToEnd, [stWholeWord]);
end;
end;
end;
Startpos := 0;
with RichE do
begin
FoundAt := FindText('''', StartPos, Length(Text), []);
while FoundAt <> -1 do
begin
SelStart := FoundAt;
Startpos := FoundAt+1;
FoundAt := FindText('''', StartPos, Length(Text), []);
if FoundAt <> -1 then
begin
SelLength := (FoundAt - selstart)+1;
SelAttributes.Style := [];
SelAttributes.Color := strC;
StartPos := FoundAt+1;
FoundAt := FindText('''', StartPos, Length(Text), []);
end;
end;
end;
Startpos := 0;
with RichE do
begin
FoundAt := FindText('{', StartPos, Length(Text), []);
while FoundAt <> -1 do
begin
SelStart := FoundAt;
Startpos := FoundAt+1;
FoundAt := FindText('}', StartPos, Length(Text), []);
if FoundAt <> -1 then
begin
SelLength := (FoundAt - selstart)+1;
SelAttributes.Style := [];
SelAttributes.Color := strC1;
StartPos := FoundAt+1;
FoundAt := FindText('{', StartPos, Length(Text), []);
end;
end;
end;
if InVisible then
begin
RichE.Visible := True;
Form.Caption := OldCap;
end;
RichE.SelStart := 0;
end;
Los estilos son:
// tipos ('Twilight', 'Default', 'Ocean', 'Classic')
Y para llamada puedes utilizar algo así:
Código Delphi
[-]
_ChangeSintaxis(FormSQL, 'Twilight', RichEdit1);