Подкрашивание фона в TRichEdit в Delphi 2009: обход пробелов
Вопрос о подкрашивании фона в компоненте TRichEdit в Delphi часто встречается у разработчиков, работающих с богатым текстовым редактированием. Особенностью данной задачи является необходимость исключения из подкрашивания определенных символов, например, пробелов.
Исходная задача
Пользователь нашел код для подкрашивания выделенного текста в TRichEdit, но ему необходимо исключить из этого процесса пробелы. В качестве примера кода для подкрашивания выделенного текста предоставлена функция RE_SetSelBgColor, которая изменяет фоновый цвет выделенного текста на указанный.
Решение проблемы
Для решения задачи можно использовать следующий подход: сначала необходимо выделить все слова, а затем применить к ним форматирование, исключая пробелы. Пример кода для подкрашивания каждого слова в TRichEdit представлен в функции SetWordBackGroundColor, которая принимает в качестве параметров компонент TRichEdit, слово (или символы, которые нужно считать словом) и цвет фона.
procedure SetWordBackGroundColor(RichEdit : TRichEdit; aWord : String; AColor: TColor);
var
Format: CHARFORMAT2;
Index : Integer;
Len : Integer;
begin
FillChar(Format, SizeOf(Format), 0);
Format.cbSize := SizeOf(Format);
Format.dwMask := CFM_BACKCOLOR;
Format.crBackColor := AColor;
Index := 0;
Len := Length(RichEdit.Lines.Text);
Index := RichEdit.FindText(aWord, Index, Len, []);
while Index <> -1 do
begin
RichEdit.SelStart := Index;
RichEdit.SelLength := Length(aWord);
RichEdit.Perform(EM_SETCHARFORMAT, SCF_SELECTION, Longint(@Format));
Index := RichEdit.FindText(aWord, Index + Length(aWord), Len, []);
end;
end;
Чтобы подкрасить все слова, кроме пробелов, можно использовать функцию GetListofWords для извлечения списка слов из текста TRichEdit, а затем применить функцию SetWordBackGroundColor к каждому слову из этого списка.
procedure GetListofWords(Text : String; var ListofWords : TStringList);
var
DummyStr : String;
FoundWord : String;
begin
DummyStr := Text;
FoundWord := '';
if (Length(Text) = 0) then exit;
while (Pos(' ', DummyStr) > 0) do
begin
FoundWord := Copy(DummyStr, 1, Pos(' ', DummyStr) - 1);
ListofWords.Add(FoundWord);
DummyStr := Copy(DummyStr, Pos(' ', DummyStr) + 1, Length(DummyStr) - Length(FoundWord) + 1);
end;
if (Length(DummyStr) > 0) then
ListofWords.Add(DummyStr);
end;
Пример использования этих функций в обработчике нажатия кнопки:
procedure TForm1.Button1Click(Sender: TObject);
var
ListofWords : TStringList;
i : Integer;
begin
ListofWords := TStringList.Create;
try
GetListofWords(RichEdit1.Lines.Text, ListofWords);
if ListofWords.Count > 0 then
for i := 0 to ListofWords.Count - 1 do
SetWordBackGroundColor(RichEdit1, ListofWords[i], clYellow);
finally
ListofWords.Clear;
ListofWords.Free;
end;
end;
Заключение
Таким образом, разработчики могут использовать предоставленные функции для подкрашивания фона в TRichEdit, исключая из подкрашивания пробелы. Это решение было протестировано в среде Delphi 2010 и операционной системе Windows 7, но должно работать и в Delphi 2009. Однако стоит учитывать, что поиск слов по одному может быть медленным для очень больших текстов, и в таких случаях может потребоваться оптимизация алгоритма.
Пользователь ищет способ подкрасить фон в компоненте `TRichEdit` в Delphi 2009, не затрагивая пробелы, и рассматривает функции для подкрашивания слов отдельно друг от друга.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.