知识大全 文本编辑器的设计(二)[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
相关参考
DELPHI基础教程:文本编辑器的设计(二)[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
DELPHI基础教程:文本编辑器的设计(二)[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&
DELPHI基础教程:文本编辑器的设计(一)[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
DELPHI基础教程:文本编辑器的设计(一)[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
Eclipse使用系统内置的TextEditor做为文本编辑器这个文本编辑器有一个长期存在的问题那就是文本无法换行虽然这个问题长期存在而且解决起来并不困难但是这却给人们带来不少麻烦 &n
今天在做项目的时候遇到上传文本框的问题 <inputtype=filesize=name=photoupload/> 在firefox中该控件产生的文本框是默认不可编辑的但是在IE
最近由于自己想做一个网站形式的代码库自已写一个在线文本编辑器对于现在的我来确实是很不切实际呵呵!再说了现在有一个非常好的在线文本
在使用Word2010进行文字编辑时,下列叙述错误的是_____。A、允许同时打开多个文档B、可将正在编辑的文档另存为一个纯文本文件C、使用“打开”命令可以打开一个已存在的文档D、打印预览文档时,打印
利用Delphi编辑控制摄像头(二) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n
Java多线程程序设计二十三个要点[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!