📄 search.pas
字号:
unit search;
interface
uses WinProcs,Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Dialogs, StdCtrls, ComCtrls, Menus;
const
WordDelimiters: set of char=[#0..#255]-['a'..'z','A'..'Z','1'..'9','0'];
function SearchRichEdit(RichEdit :TRichEdit;const searchstring:string;
options:tfindoptions):boolean;
function searchbuf(buf:pchar;buflen:integer;
SelStart,SelLength:integer;
SearchString:String;Options:TfindOptions):pchar;
implementation
function SearchRichEdit(RichEdit :TRichEdit;const SearchString:String;
Options:TFindOptions):Boolean;
var
Buffer,P:pchar;
Size:Word;
begin
Result:=False;
if(length(searchstring)=0) then
size:=RichEdit.getTextlen;
if(Size=0) then exit;
buffer:=stralloc(size+1);
try
RichEdit.gettextbuf(buffer,size+1);
p:=searchbuf(buffer,size,RichEdit.SelStart,RichEdit.sellength,searchstring,options);
if p <> nil then
begin
RichEdit.selstart:=p-buffer;
RichEdit.sellength:=length(searchstring);
result:=true;
end;
finally
strdispose(buffer);
end;
end;
function searchbuf(buf:pchar;buflen:integer;
selstart,sellength:integer;searchstring:string;
options:tfindoptions):pchar;
var
searchcount,i:integer;
c:char;
direction:shortint;
charmap:array[char] of char;
function FindNextWordStart(var BufPtr:Pchar):boolean;
begin
result:=false;
while(SearchCount>=0) and ((Direction=1)xor(BufPtr^in WordDelimiters)) do
begin
inc(BufPtr,Direction);
dec(SearchCount);
end;
while(searchCount>=0) and((Direction=-1)xor(BufPtr^in WordDelimiters)) do
begin
inc(BufPtr,Direction);
dec(SearchCount);
end;
result:=SearchCount>=0;
if Direction=-1 then
begin
Dec(BufPtr,Direction);
inc(searchcount);
end;
end;
begin
result:=nil;
if buflen<=0 then exit;
if frdown in options then
begin
direction:=1;
inc(selstart,sellength);
searchcount:=buflen-SelStart-Length(SearchString);
if SearchCount<0 then exit;
if longint(SelStart)+SearchCount>Buflen then exit;
end
else
begin
Direction:=-1;
Dec(SelStart,length(SearchString));
searchcount:=SelStart;
end;
if (selStart<0) or (SelStart>BufLen) then exit;
Result:=@Buf[SelStart];
for c:=low(charmap) to high(charmap) do
charmap[c]:=c;
if not (frMatchCase in Options) then
begin
AnsiUpperBuff(Pchar(@charmap),sizeof(charMap));
AnsiUpperBuff(@SearchString[1],length(SearchString));
end;
while SearchCount>=0 do
begin
if frWholeWord in options then
if not FindNextWordStart(Result) then
break;
i:=0;
while(charmap[result[i]]=searchString[i+1]) do
begin
inc(i);
if(i>=length(searchstring)) then
begin
if(not (frWholeWord in options)) or (SearchCount=0) or
(result[i] in WordDelimiters) then
exit;
break;
end;
end;
inc(result,direction);
dec(searchCount);
end;
result:=nil;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -