|
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"AnsiPosを使った検索(上検索も可能)"
こんにちは。Koji27です。
上へも下へも検索可能な AnsiPos を使った検索コードです。
私はこれを応用したモノを使用していますが、これでも良いサンプ
ルになると思います。
Form に TMemo1つ、TEdit1つ、TButton1つ、TCheckBox2つ、
置いた状態で使ってください。
private
function FindIt(const StrSearch, StrText, StrSel: String;
IntStart: Integer; BooKey,
BooCase: Boolean): Integer;
function FindUp(const StrSearch, StrText: String): Integer;
function FindDown(const StrSearch, StrText: String): Integer;
---略---
function TForm1.FindIt(const StrSearch, StrText, StrSel: String;
IntStart: Integer; BooKey,
BooCase: Boolean): Integer;
var
IntPos: Integer;
StrTmpTxt, StrTmpSea: String;
begin
if BooKey = True then begin
//上検索の処理
if BooCase = True then begin
//大文字、小文字を区別しない時
StrTmpTxt:= AnsiUpperCase(Copy(StrText, 1, IntStart));
StrTmpSea:= AnsiUpperCase(StrSearch);
end else begin
//大文字、小文字を区別するとき
StrTmpTxt:= Copy(StrText, 1, IntStart);
StrTmpSea:= StrSearch;
end;
IntPos:= FindUp(StrTmpSea, StrTmpTxt);
end else begin
//下検索の処理
if BooCase = True then begin
//大文字、小文字を区別しない時
StrTmpTxt:= AnsiUpperCase(Copy(StrText, IntStart + Length(StrSel),
Length(StrText)));
StrTmpSea:= AnsiUpperCase(StrSearch);
end else begin
//大文字、小文字を区別するとき
StrTmpTxt:= Copy(StrText, IntStart + Length(StrSel), Length(StrText))
;
StrTmpSea:= StrSearch;
end;
IntPos:= FindDown(StrTmpSea, StrTmpTxt);
if IntPos <> 0 then begin
if IntStart = 0 then begin
IntPos := IntPos -1 + IntStart + Length(StrSel);
end else begin
IntPos := IntPos -1 + IntStart -1 + Length(StrSel);
end;
end;
end;
Result:= IntPos;
end;
function TForm1.FindUp(const StrSearch, StrText: String): Integer;
var
IntPos, IntFind, IntTmp : Integer;
BooEnd : Boolean;
StrTmp : String;
begin
IntFind:= 0;
IntTmp:= 0;
BooEnd:= False;
StrTmp:= StrText;
repeat
IntPos := AnsiPos(StrSearch, StrTmp);
if IntPos = 0 then begin
BooEnd:= True;
end else begin
IntFind:= IntFind + IntPos + IntTmp -1;
StrTmp:= Copy(StrTmp,IntPos+Length(StrSearch),Length(StrTmp));
IntTmp:= Length(StrSearch);
end;
until BooEnd = True;
Result:= IntFind;
end;
function TForm1.FindDown(const StrSearch, StrText: String): Integer;
begin
Result := AnsiPos(StrSearch, StrText);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
IntPos: Integer;
begin
if Edit1.Text <> '' then begin
//上検索は CheckBox1.Checked:= True; にする。
//大文字、小文字を区別しないは CheckBox2.Checked:= True; にする。
IntPos:= FindIt(Edit1.Text, Memo1.Text, Memo1.SelText,
Memo1.SelStart, CheckBox1.Checked, CheckBox2.Checked);
if IntPos = 0 then begin
//文字列が見つからなかった時の処理。
end else begin
Memo.SelStart:= IntPos;
Memo.SelLength:= Length(Edit1.Text);
end;
end;
end;
コードを見ればわかりますが、上検索は遅いです(^-^;;
何か良いアイディアがあれば修正してください。
▽--------------- Koji27 -- DZP02560 ---------------▽
△----------- http://www.marimo.or.jp/~koji27/ -----------△
Original document by Koji27 氏 ID:(DZP02560)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|