文字列の一部を削除したり挿入したりする
EditコンポーネントやMemoコンポーネントの文字列の一部を参照するときに[copy]関数を使いましたが,文字列の一部を変更することもできます。
文字列の一部を削除するときには[delete]関数を,文字列の中に別の文字列を挿入するときには[insert]関数を使います。
この2つの関数は,コンポーネントの文字列を直接操作することはできませんので,コンポーネントの文字列を一旦文字型変数に代入して削除や挿入を行った後,それをコンポーネントに代入しなければなりません。
具体的には,[delete]関数は
delete(全体の文字列,削除を開始する位置,削除する文字数)の形で記述します。
[insert]関数は
insert(挿入する文字列,元の文字列,挿入する位置)の形で記述します。
この2つの関数を使って,文字列を検索した後,置換するプログラムを書いてみます。
元にするプログラムは「エディトコンポーネントのセルのコントロール」で紹介した検索プログラムです。
フォームの設計を下のようにします。

ボタンは,「検索」ボタンが[Button1]で,「置換」ボタンが[Button2]です。
[Button2]の文字が薄くなっているのは初期設定で無効にしているからです。
「ファイルを開く」ボタンについては,ここでは記述しませんが,サンプルプログラムにのせてあります。
下のプログラムソースでは「検索」プログラムから変更した部分を太字で記してあります。
{ Private 宣言 }
sel:integer; //検索する位置を保存するための変数を宣言
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//検索をする
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
for i:=sel to length(memo1.Text) do begin
//memo1の文章全体を検索
if copy(memo1.Text,i,length(edit1.Text))=edit1.Text then begin
//もしmemo1の文字列とedit1の文字列が一致したら
memo1.SetFocus;
//memo1コンポーネントにフォーカスを合わせる
memo1.selstart:=i-1;
//セルの場所をi-1にして
memo1.SelLength:=length(edit1.Text);
//edit1の文字列の長さ分を選択する
sel:=i+1;
//selの値を一致した文字列の次から検索できるように設定
button2.Enabled:=true; //Button2を有効にする
exit;
//プロシージャの終了
end;
end;
button2.Enabled:=false; //Button2を無効にする
showmessage('一致する文字列はありませんでした');
end;
//置換をする
procedure TForm1.Button2Click(Sender: TObject);
var
str,str1:string; //文字列を2個,宣言する
begin
str:=memo1.Text; //memo1コンポーネントの内容をstrに代入する
str1:=edit2.Text; //edit2の文字列をstr1に代入する
delete(str,sel-1,length(edit1.Text)); //strからedit1の文字列を削除する
insert(str1,str,sel-1); //削除した部分にedit2の文字列を代入する
memo1.Text:=str; //memo1にstrを代入する
memo1.SetFocus; //memo1コンポーネントにフォーカスを合わせる
memo1.SelStart:=sel-2; //セルをi-2にして※1
memo1.SelLength:=length(edit2.Text); //edit2の文字列の長さだけ選択する
end;
※1 ここでは「memo1.SelStart:=sel-1」でよいと思うのですが,それだとなぜかずれてしまいます。
これを「サンプルプログラム」にして掲載しましたので,興味のある方はご覧ください。