Обратный поиск строки в TRichEdit |
Previous Top Next |
Code: |
{+------------------------------------------------------------ | 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; |
©Drkb::01023
Взято с сайта: http://www.swissdelphicenter.ch