请各位高手帮忙叫个代码~~~Finddialog不能自动查找...得自己写代码好像.
解决方案 »
- 如何获取到下载的地址?TidHttp
- 弱问: 有关dxTreeList
- 如何做成想资源管理器一样的帮助文件?来者有分!
- 帮看一下这条语句,怎么个解释?
- 3层中在客户端无法调用服务器层中设定的函数,郁闷,高手帮忙啊!
- 哪位高手替我翻译一句(英语)
- 为什么用close 关闭程序,程序关闭了但内存没有真正的释放?(在线)
- how can i add series to chart
- 高分求救:bde连接sql7为什么有时必须先要用网上邻居连接一次服务器才行
- 如何修改控制面板的区域选项中的日期格式
- 使用RIchView如何设置行距和字距?
- 数值转换的问题,一个int值转换成16进制存入string中,急救……
wordDelimiters : set of Char = [#0..#255] - ['a'..'z', 'A'..'Z', '1'..'9','0'];
//function SearchMemo(Memo: TCustomEdit; const SearchString: string; Options: TFindOptions): Boolean;
function SearchRichEdit(RichEdit : TCustomRichEdit; Const SearchString : string; Options : TFindOptions): boolean ;
//function SearchBuf(Buf: PChar; BufLen: Integer;SelStart, SelLength: Integer; SearchString: string; Options: TFindOptions): PChar;
function SearchBuf(Buf : PChar; BufLen : Integer; Selstart,SelLength : integer; SearchString : string; Options : TFindOptions): PChar;
//implementation
implementation
function SearchRichEdit(RichEdit : TCustomRichEdit; Const SearchString : string; Options : TFindOptions): boolean ;
var
Buffer, P: PChar;
Size: Word;
begin
Result := false; if (Length(SearchString) = 0) then
Exit; 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 { (True XOR N) is equivalent to(not N) } Result := false; { (False XOR N) is equivalentto (N) }{ When Direction is forward (1), skip nondelimiters, then skip delimiters. }{ When Direction is backward (-1), skip delims, thenskip non delims } 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 { back up one char, to leave ptr on first nondelim } 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); { start search past end of
selection } 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];
{ Using a Char map array is faster than callingAnsiUpper 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[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.
procedure TForm1.Button1Click(Sender: TObject);
begin
finddialog1.Execute;
end;procedure TForm1.FindDialog1Find(Sender: TObject);
var
I, J, PosReturn, SkipChars: Integer;
begin
for I := 0 to Memo1.Lines.Count do
begin
PosReturn := Pos(FindDialog1.FindText,Memo1.Lines[I]);
if PosReturn <> 0 then {found!}
begin
SkipChars := 0;
for J := 0 to I - 1 do
SkipChars := SkipChars + Length(Memo1.Lines[J]);
SkipChars := SkipChars + (I*2);
SkipChars := SkipChars + PosReturn - 1; Memo1.SetFocus;
Memo1.SelStart := SkipChars;
Memo1.SelLength := Length(FindDialog1.FindText);
Break;
end;
end;