知识大全 文本编辑器的设计(二)[2]

Posted

篇首语:识字粗堪供赋役,不须辛苦慕公卿。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 文本编辑器的设计(二)[2]相关的知识,希望对你有一定的参考价值。

DELPHI基础教程:文本编辑器的设计(二)[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  SearchMemo代码如下

  unit Search;

  interface

  uses WinProcs SysUtils StdCtrls Dialogs;

  const

  WordDelimiters: set of Char = [# # ] [ a z A Z ];

  function SearchMemo(Memo: TCustomEdit;

  const SearchString: String;

  Options: TFindOptions) Boolean;

  function SearchBuf(Buf: PChar; BufLen: Integer;

  SelStart SelLength: Integer;

  SearchString: String;

  Options: TFindOptions) PChar;

  implementation

  function SearchMemo(Memo: TCustomEdit;

  const SearchString: String;

  Options: TFindOptions) Boolean;

  var

  Buffer P: PChar;

  Size: Word;

  begin

  Result := False;

  if (Length(SearchString) = ) then Exit;

  Size := Memo GetTextLen;

  if (Size = ) then Exit;

  Buffer := StrAlloc(Size + )

  try

  Memo GetTextBuf(Buffer Size + )

  P := SearchBuf(Buffer Size Memo SelStart

  Memo SelLength SearchString Options)

  if P <> nil then

  begin

  Memo SelStart := P Buffer;

  Memo 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 (True XOR N) is equivalent to

  (not N)

  Result := False; (False XOR N) is equivalent

  to (N)

   When Direction is forward ( ) skip non

  delimiters then skip delimiters

   When Direction is backward ( ) skip delims then

  skip non delims

  while (SearchCount > ) and

  ((Direction = ) xor (BufPtr^ in

  WordDelimiters)) do

  begin

  Inc(BufPtr Direction)

  Dec(SearchCount)

  end;

  while (SearchCount > ) and

  ((Direction = ) xor (BufPtr^ in

  WordDelimiters)) do

  begin

  Inc(BufPtr Direction)

  Dec(SearchCount)

  end;

  Result := SearchCount > ;

  if Direction = then

  begin back up one char to leave ptr on first non

  delim

  Dec(BufPtr Direction)

  Inc(SearchCount)

  end;

  end;

  begin

  Result := nil;

  if BufLen <= then Exit;

  if frDown in Options then

  begin

  Direction := ;

  Inc(SelStart SelLength) start search past end of

  selection

  SearchCount := BufLen SelStart Length(SearchString)

  if SearchCount < then Exit;

  if Longint(SelStart) + SearchCount > BufLen then

  Exit;

  end

  else

  begin

  Direction := ;

  Dec(SelStart Length(SearchString))

  SearchCount := SelStart;

  end;

  if (SelStart < ) or (SelStart > BufLen) then Exit;

  Result := @Buf[SelStart];

   Using a Char map array is faster than calling

  AnsiUpper on every character

  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[ ]

  Length(SearchString))

  end;

  while SearchCount > do

  begin

  if frWholeWord in Options then

  if not FindNextWordStart(Result) then Break;

  I := ;

  while (CharMap[Result[I]] = SearchString[I+ ]) do

  begin

  Inc(I)

  if I >= Length(SearchString) then

  begin

  if (not (frWholeWord in Options)) or

  (SearchCount = ) or

  (Result[I] in WordDelimiters) then

  Exit;

  Break;

  end;

  end;

  Inc(Result Direction)

  Dec(SearchCount)

  end;

  Result := nil;

  end;

  end

  

cha138/Article/program/Delphi/201311/25253

相关参考

知识大全 文本编辑器的设计(二)[1]

DELPHI基础教程:文本编辑器的设计(二)[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 文本编辑器的设计(二)[3]

DELPHI基础教程:文本编辑器的设计(二)[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&

知识大全 文本编辑器的设计(一)[2]

DELPHI基础教程:文本编辑器的设计(一)[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 文本编辑器的设计(一)[1]

DELPHI基础教程:文本编辑器的设计(一)[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 eclipse中文本编辑器的换行

  Eclipse使用系统内置的TextEditor做为文本编辑器这个文本编辑器有一个长期存在的问题那就是文本无法换行虽然这个问题长期存在而且解决起来并不困难但是这却给人们带来不少麻烦 &n

知识大全 使input type=file 不可编辑

  今天在做项目的时候遇到上传文本框的问题  <inputtype=filesize=name=photoupload/>  在firefox中该控件产生的文本框是默认不可编辑的但是在IE

知识大全 ckeditor+代码高亮

      最近由于自己想做一个网站形式的代码库自已写一个在线文本编辑器对于现在的我来确实是很不切实际呵呵!再说了现在有一个非常好的在线文本

在使用Word2010进行文字编辑时,下列叙述错误的是

在使用Word2010进行文字编辑时,下列叙述错误的是_____。A、允许同时打开多个文档B、可将正在编辑的文档另存为一个纯文本文件C、使用“打开”命令可以打开一个已存在的文档D、打印预览文档时,打印

知识大全 利用Delphi编辑控制摄像头(二)

利用Delphi编辑控制摄像头(二)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n

知识大全 Java多线程程序设计二十三个要点[2]

Java多线程程序设计二十三个要点[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!