Как одновременно выделить несколько слов?
// Способ первый
// Самостоятельно отрисовываем на канве
uses
{...,} SynEditTypes;
procedure TForm1.SynEdit1PaintTransient(Sender: TObject; Canvas: TCanvas;
TransientType: TTransientType);
var
Key, s, DrawText: string;
i, k: Integer;
dp: TDisplayCoord;
p: TPoint;
begin
Key := 'Begin';
for i := SynEdit1.TopLine to SynEdit1.TopLine + SynEdit1.LinesInWindow do
begin
s := SynEdit1.Lines[i-1];
k := Pos(AnsiLowerCase(Key), AnsiLowerCase(s));
while k > 0 do
begin
dp := SynEdit1.BufferToDisplayPos(BufferCoord(k, i));
DrawText := Copy(s, k, Length(Key));
p := SynEdit1.RowColumnToPixels(dp);
Canvas.Brush.Color:= clYellow;
Canvas.Font.Color:= clRed;
Canvas.TextOut(p.X, p.Y, DrawText);
k := Pos(Key, s, k + Length(Key));
end;
end;
end;
// Способ второй
uses
{...,} SynEditHighlighter, SynEditSearch, SynEditTypes;
procedure TForm1.Button1Click(Sender: TObject);
begin
with SynEdit1 do
begin
if not Assigned(SearchEngine) then
begin
SearchEngine := TSynEditSearch.Create(SynEdit1);
//SearchEngine.Options := [ssoReplace, ssoReplaceAll];
end;
SearchEngine.Pattern := '';
Repaint; // Удаляем старые метки
SearchEngine.Pattern := InputBox(' input ', ' search term ', '');
Repaint; // Рисуем новые метки
end;
end;
procedure TForm1.SynEdit1Change(Sender: TObject);
begin
SynEdit1.Repaint; // Перерисовываем метки
end;
procedure TForm1.SynEdit1Paint(Sender: TObject; ACanvas: TCanvas);
var
i, j: Integer;
p: TPoint;
Token: string;
Attr: TSynHighlighterAttributes;
begin
with SynEdit1 do
begin
if not Assigned(SearchEngine) then
Exit;
if SearchEngine.Pattern = '' then
Exit;
ACanvas.Brush.Color := clYellow;
ACanvas.Brush.Style := bsSolid;
// Поисковые запросы выделяются только в видимой области,
// что экономит много времени при работе с большими файлами.
for i := TopLine - 1 to TopLine + LinesInWindow do
begin
SearchEngine.FindAll(Lines[i]);
for j := 0 to SearchEngine.ResultCount-1 do
begin
p := RowColumnToPixels(BufferToDisplayPos(BufferCoord(SearchEngine.Results[j], i+1)));
GetHighlighterAttriAtRowCol(BufferCoord(SearchEngine.Results[j], i+1), Token, Attr);
if Assigned(Attr) then
ACanvas.Font.Style := Attr.Style
else
ACanvas.Font := Font;
ACanvas.TextOut(p.X, p.Y, SearchEngine.Pattern);
end;
end;
end;
end;
// Способ третий
// Подсветка нескольких слов, путем
// самостоятельной отрисовки на канве
type
TForm1 = class(TForm)
SynEdit1: TSynEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure SynEdit1Paint(Sender: TObject; ACanvas: TCanvas);
private
MyHighlightList: TStrings;
procedure HighlightNow;
public
end;
{...}
implementation
{...}
uses
SynEditSearch;
procedure TForm1.FormCreate(Sender: TObject);
begin
MyHighlightList := TStringList.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
MyHighlightList.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
MyHighlightList.Add('begin');
MyHighlightList.Add('end');
HighlightNow;
end;
procedure TForm1.HighlightNow;
var
i, j: Int64;
p: TPoint;
MyBufferCoord: TBufferCoord;
OldWord: string;
begin
with SynEdit1 do
begin
SearchEngine := TSynEditSearch.Create(Self);
for j := 0 to MyHighlightList.Count-1 do
begin
SearchEngine.Pattern := MyHighlightList.Strings[j];
SearchEngine.FindAll(Text);
for i := 0 to SearchEngine.ResultCount-1 do
begin
Canvas.Brush.Color := clYellow;
// Canvas.Font := Font;
Canvas.Font.Color := clRed;
p := RowColumnToPixels(BufferToDisplayPos(CharIndexToRowCol(SearchEngine.Results[i] - 1)));
MyBufferCoord := CharIndexToRowCol(SearchEngine.Results[i] - 1);
OldWord := GetWordAtRowCol(MyBufferCoord);
Canvas.TextOut(p.X, p.Y, OldWord);
end;
end;
end;
end;
procedure TForm1.SynEdit1Paint(Sender: TObject; ACanvas: TCanvas);
begin
if MyHighlightList.Count > 0 then
HighlightNow;
end;
|