C++Builder Memo8
TMemoの検索・置換

bool isReplaceAll;

//----- FindText(FindText,MatchCase?) true:あった false:なかった
bool __fastcall TForm1::FindText(AnsiString txt,bool MatchCase){
 int i,x,xx;
 AnsiString ltxt;
 if(Memo1->SelLength){Memo1->SelStart+=Memo1->SelLength;Memo1->SelLength=0;}
 Memo1->SelLength=0;
 ltxt=Memo1->Lines->Text;
 if(!MatchCase){txt=txt.LowerCase();ltxt=ltxt.LowerCase();}
 xx=Memo1->SelStart;
 for(i=1;i<=xx;i++)ltxt[i]=1;
 if((x=ltxt.AnsiPos(txt))!=0){
  Memo1->SelStart=x-1;
  Memo1->SelLength=txt.Length();return true;}
 return false;}

//----- 検索実行
void __fastcall TForm1::Find(void){
 FindDialog1->CloseDialog();
 if(!FindText(FindDialog1->FindText,FindDialog1->Options.Contains(frMatchCase)))
  Application->MessageBox("なし","検索",MB_OK);}

//----- 次を検索(メニュー[次を検索]のOnClickイベント)
void __fastcall TForm1::Findnext1Click(TObject *Sender)
{if(FindDialog1->FindText=="")FindDialog1->Execute();else Find();}

//---- 検索ボタン押下(TFindDialogのFindイベント)
void __fastcall TForm1::FindDialog1Find(TObject *Sender)
{Find();}

//----- Find表示(メニュー[検索]のOnClickイベント)
void __fastcall TForm1::Find1Click(TObject *Sender){
 FindDialog1->Execute();}

//----- Replace 1回実行 true:あった false:なかった
bool __fastcall TForm1::Replace(void){
 int ret;
 if(FindText(ReplaceDialog1->FindText,ReplaceDialog1->Options.Contains(frMatchCase))){
  ret=(isReplaceAll)?mrYes:MessageDlg("置換?",mtConfirmation,
   TMsgDlgButtons()<<mbYes<<mbNo<<mbAll<<mbCancel,0);
  if(ret==mrYes||ret==mrAll){
   if(ret==mrAll)isReplaceAll=true;
   Memo1->SelText=ReplaceDialog1->ReplaceText;
   /*Modify();*/}
  else if(ret==mrCancel)return false; return true;}
 else return false;}

//----- 置換表示(メニュー[置換]のOnClickイベント)
void __fastcall TForm1::Replace1Click(TObject *Sender){ReplaceDialog1->Execute();}

//----- 置換ボタン押下(TReplaceDialogのReplaceイベント)
void __fastcall TForm1::ReplaceDialog1Replace(TObject *Sender){
 int repcnt;
 if(ReplaceDialog1->Options.Contains(frReplaceAll)){
  ReplaceDialog1->CloseDialog();
  isReplaceAll=false;repcnt=0;while(Replace()){++repcnt;}
  if(isReplaceAll&&repcnt){Application->MessageBox((IntToStr(repcnt)+"個置換した").c_str(),"置換",MB_OK);}
  }else{isReplaceAll=true;Replace();}}

//----- 置換の検索ボタン押下(TReplaceDialogのFindイベント)
void __fastcall TForm1::ReplaceDialog1Find(TObject *Sender){
 FindText(ReplaceDialog1->FindText,ReplaceDialog1->Options.Contains(frMatchCase));
 ReplaceDialog1->CloseDialog();}
解説
FindText(検索テキスト,大文字小文字区別)を呼ぶと、カーソル位置からのTMemo1内の検索テキストを検索してそこを選択します。
あればtrue、なければfalseを返します。
C++Builder1ではSelStartの設定時にカーソルのところへスクロールしないので改良が必要です。
 簡単な方法:SelTextを適当に設定して元に戻す

Back