お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
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