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