uses
RichEdit;
procedure TForm1.RichEdit1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
var
iCharIndex, iLineIndex, iCharOffset, i, j: Integer;
Pt: TPoint;
s: string;
beginwith TRichEdit(Sender) dobegin
Pt := Point(X, Y);
// Get Character Index from word under the cursor
iCharIndex := Perform(Messages.EM_CHARFROMPOS, 0, Integer(@Pt));
if iCharIndex < 0 then Exit;
// Get line Index
iLineIndex := Perform(EM_EXLINEFROMCHAR, 0, iCharIndex);
iCharOffset := iCharIndex - Perform(EM_LINEINDEX, iLineIndex, 0);
if Lines.Count - 1 < iLineIndex then Exit;
// store the current line in a variable
s := Lines[iLineIndex];
// Search the beginning of the word
i := iCharOffset + 1;
while (i > 0) and (s[i] <> ' ') do Dec(i);
// Search the end of the word
j := iCharOffset + 1;
while (j <= Length(s)) and (s[j] <> ' ') do Inc(j);
// Display Text under Cursor
Caption := Copy(s, i, j - i);
end;
end;
Перевод контента на русский язык:
Это фрагмент кода Delphi, который предназначен для извлечения слова под курсором в RichEdit-контроле. Вот подробное описание того, что код делает:
Процедура RichEdit1MouseMove вызывается при перемещении мыши над RichEdit-контролем.
Она использует различные методы и сообщения RichEdit для определения индекса символа, индекса строки и смещения символа слова под курсором.
Затем код извлекает текст текущей строки из коллекции строк RichEdit с помощью Lines[iLineIndex].
Код ищет начало и конец слова, перебирая символы в тексте строки. Начало находит, уменьшая счетчик (i), пока не найдет пробельный символ, а конец находит, увеличивая другой счетчик (j), пока не найдет пробельный символ.
В конце код отображает извлеченное слово как заголовок формы с помощью Caption := Copy(s, i, j - i).
Вот некоторые предложения по улучшению:
Вместо хранения текста строки в переменной s рассмотрите использование временного буфера строк для избежания ненужного выделения и освобождения памяти.
Алгоритмы поиска начала и конца слова можно оптимизировать, используя более эффективные методы, такие как поиск не пробельных символов вместо перебора всех символов.
Рассмотрите добавление обработки ошибок для случаев, когда курсор находится вне RichEdit-контроля или при получении индекса символа, индекса строки или текста строки fails.
Вот альтернативное решение, использующее регулярное выражение для извлечения слова под курсором:
usesRegExpr;procedureTForm1.RichEdit1MouseMove(Sender:TObject;Shift:TShiftState;X,Y:Integer);varRe:TRegExpr;Match:TMatch;beginRe:=TRegExpr.Create('\w+');// match one or more word characterstryRe.CaseSensitive:=False;ifRe.IsMatch(RichEdit1.Text,Point(X,Y))thenCaption:=Re.Match[0].Value;// retrieve the matched text (i.e., the word)finallyRe.Free;end;end;
В этом коде используется компонент TRegExpr для создания регулярного выражения, которое.match one or more word characters (\w+). Затем код проверяет, есть ли совпадение в позиции курсора с помощью Re.IsMatch. Если есть, то он извлекает совпавший текст и отображает его как заголовок. Пожалуйста, обратите внимание, что это решение предполагает, что RichEdit-контрол имеет фокус при вызове события перемещения мыши.
Статья описывает алгоритм для получения слова, которое находится под курсором в RichEdit-компоненте при помощи методов EM_CHARFROMPOS и EM_EXLINEFROMCHAR.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.