Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Выполнить обратный поиск строки в TRichEdit

Delphi , Компоненты и Классы , TMemo и TRichEdit

Выполнить обратный поиск строки в TRichEdit

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

 {+------------------------------------------------------------ 
 | Function FindTextBackwards 
 | 
 | Parameters : 
 |   findWhat: text to find 
 |   inString: string to find it in 
 |   startAt : character index to start at (1-based) 
 |   caseSensitive: determines whether search is case-sensitive 
 |   words   : if true the characters immediately surrounding 
 |             a found location must not be alphanumeric 
 | Returns    : 
 |   character index (1-based) of first character of a found 
 |   location, or 0, if the text was not found. 
 | Description: 
 |   Performs a simple sequential search for a string in a larger 
 |   string, starting at the specified position and working towards 
 |   the start of the string. 
 | Error Conditions: none 
 | Created: 27.02.99 by P. Below 
 +------------------------------------------------------------}

 function FindTextBackwards(findWhat, inString : string;
   startAt : integer;
   caseSensitive, words : boolean): integer;
 var
   i, patternlen, findpos : integer;
   lastchar, firstchar : char;
 begin
   Result := 0;  { assume failure }
   patternlen := Length(findWhat);

   { Do a few sanity checks on the parameters }
   if (patternlen = 0) or
     (startAt < patternlen) or
     (Length(inString) < patternlen) then
     Exit;

   if not caseSensitive then
    begin
     { convert both strings to lower case }
     findWhat := AnsiLowercase(findWhat);
     inString := AnsiLowercase(inString);
   end; { If }

   i := startAt;
   lastchar := findWhat[patternlen];
   firstchar := findWhat[1];

   while (Result = 0) and (i >= patternlen) do
    begin
     if inString[i] = lastchar then
      begin
       findPos := i - patternlen + 1;
       if inString[findPos] = firstchar then
        begin
         { We have a candidate. Compare the substring of length 
          patternlen starting at findPos with findWhat. With 
          AnsiStrLComp we can do that without having to copy 
          the substring to a temp string first. }
         if AnsiStrLComp(@findWhat[1], @inString[findPos],
           patternlen) = 0 then
          begin
           { We have a match! }
           Result := findPos;

           if words then
            begin
             { Check the characters surrounding the hit. For the hit 
              to constitute a word they must not be alphanumeric. }
             if (findPos > 1) and
               IsCharAlphanumeric(inString[findPos - 1]) then
              begin
               { Not a match after all, <sigh>. }
               Result := 0;
             end { If }
             else
              begin
               if (i < Length(inString)) and
                 IsCharAlphanumeric(inString[i + 1]) then
                begin
                 { Not a match after all, <sigh>. }
                 Result := 0;
               end; { If }
             end; { Else }
           end; { If }
         end; { If }
       end; { If }
     end; { If }
     Dec(i);
   end; { While }
 end; { FindTextBackwards }

 procedure TForm1.Button1Click(Sender : TObject);
 var
   findPos : integer;
 begin
   findPos := FindTextBackwards(findEdit.Text,
     richedit1.Text,
     richedit1.selstart + 1,
     caseCheckbox.Checked,
     wordsCheckbox.Checked);
   if findPos > 0 then
    begin
     with richedit1 do
      begin
       selstart := findPos - 1;
       sellength := findEdit.GetTextLen;
       Perform(em_scrollcaret, 0, 0);
       SetFocus;
     end;
   end
   else
     ShowMessage('Text not found');
 end;

Функция FindTextBackwards - это простое реализация обратного поиска для заданного текста в RichEdit-контроле. Функция принимает четыре параметра:

  • findWhat: текст, который нужно найти
  • inString: строка, в которой нужно найти текст
  • startAt: индекс начала поиска (1-based)
  • caseSensitive и words: флаги, контролирующие чувствительность к регистру и требование неалфавитных символов вокруг найденного текста

Функция возвращает индекс первого символа найденной локации или 0, если текст не был найден.

Вот шаг за шагом, как функция работает:

  1. Она выполняет sanity-check на входные параметры для обеспечения их корректности.
  2. Если caseSensitive равен false, она конвертирует оба строкового представления в нижний регистр с помощью функции AnsiLowercase.
  3. Затем она инициализирует переменную i начальным индексом и устанавливает последний символ шаблона в последний символ текста поиска.
  4. Функция затем вступает в цикл, который продолжается до тех пор, пока не будет найдено совпадение или не будет достигнут начало строки.
  5. Внутри цикла она проверяет, соответствует ли текущий символ шаблона последнему символу текста поиска. Если это так, она рассчитывает индекс начала потенциального совпадения (findPos) и проверяет, соответствует ли первый символ шаблона символу в findPos. Если обе условия истинны, она сравнивает подстроку от findPos до patternLen с текстом поиска с помощью функции AnsiStrLComp.
  6. Если сравнение успешно, она устанавливает результат в findPos и проверяет, является ли words истинным. Если это так, она проверяет окружающие символы для обеспечения, что они не алфавитные.
  7. Функция возвращает результат.

Процедура Button1Click - это простой пример использования этой функции в приложении Delphi. Она берет текст из edit-контроля (findEdit) и поиска его в RichEdit-контроле (richedit1) начиная с выбранной позиции. Если текст найден, она выбирает совпадение и скроллит курсор к началу выбора.

Некоторые предложения для улучшения:

  • Вместо использования AnsiStrLComp для сравнения подстрок можно использовать более эффективный алгоритм,such as the Knuth-Morris-Pratt (KMP) algorithm or the Boyer-Moore algorithm.
  • Можно добавить поддержку поиска в нескольких строках, разбивая входную строку на отдельные строки и поиск каждой строки индивидуально.
  • Можно улучшить производительность функции, используя более эффективный данных структуру для хранения шаблона, such as a suffix tree or a finite automaton.

В целом, функция FindTextBackwards - это простое но эффективное реализация обратного поиска для заданного текста в RichEdit-контроле. С некоторыми минорными улучшениями она могла бы быть еще более эффективной и надежной.

Выполнить обратный поиск строки в TRichEdit: функция FindTextBackwards позволяет найти строку в-rich-редакторе, начиная от указанного индекса и движется в сторону начала текста.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: TMemo и TRichEdit ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-08 19:21:55/0.0061190128326416/1