⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 search.pas

📁 利用DELPHI7来编写的一个记事本。不是非常的完善
💻 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 + -