Выполнить обратный поиск строки в TRichEditDelphi , Компоненты и Классы , TMemo и TRichEditВыполнить обратный поиск строки в TRichEdit
Оформил: DeeCo {+------------------------------------------------------------ | 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; Функция
Функция возвращает индекс первого символа найденной локации или 0, если текст не был найден. Вот шаг за шагом, как функция работает:
Процедура Некоторые предложения для улучшения:
В целом, функция Выполнить обратный поиск строки в TRichEdit: функция FindTextBackwards позволяет найти строку в-rich-редакторе, начиная от указанного индекса и движется в сторону начала текста. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: TMemo и TRichEdit ::
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |