コラム / 置換ツールを作ろう / 12



さっそくコードを書きますよーーー
さっきのforループの中身、
//ここに一行あたりの置換処理が入る
のところを、・・・・
の前に、すまん
varのところを
var i:integer;
p:integer;
と書き換えてくれ。変数がもう一つほしくなった。
var
i :integer;
p :integer;
てな感じのほうがかっこいいかな?w vip!
半角スペースで綺麗に書くのはご自由に
(varとかintegerとかposの文字を開けちゃだめだけど
こんどこそforループ
 
    for i:=0 to tex.Count-1 do begin
         //ここに一行あたりの置換処理が入る
         while true do begin
            p:=pos(' ',tex[i]);
            if p=0 then begin
                break;
            end;
            //ここに半角スペース削除処理
            //ここに 挿入処理
         end;
    end;

はてさて、いろいろ出てきましたね。
whileというのはforの仲間、ループの制御構文です。
while 判定 do begin
   命令
end;
というように書きます。
「whileは判定が真なら命令を実行し続ける」
のです。
判定のところに、true と書いてあります。
な、なんと!
trueというのは!
「真」 そのものですwwwwwwwww
(「偽」そのものは False って書きます
つまり、
while true do begin
end;
って、 無限ループですwwwwwwwwwwwwwwwwwwww
扱いには十分注意してください、というか、この段階で実行すると、

確実にフリーズします。
そうなったら自分でなんとかしてね。
メインメニュー>実行>実行
から実行したときなら、
メインメニュー>実行>プログラムの終了
とすれば大丈夫ですが、コンパイルして実行はタスクマネージャしかないです。注意。

注意しすぎた。
さて、無限ループなのはいいとして、問題は中よ中。
p:=pos(' ',tex[i]);
とありますね。
なんだかプログラムっぽい行です。
p:= ; ここは代入文ですね。
整数型変数pに値を代入するんです。
じゃぁ、posは何かといいますと、
Pos 関数は,指定された文字列にある特定の部分文字列の最初の文字のインデックス値を返します。
ヘルプコピペしてみました。はい もちろんわけわからんので、説明すると

「posは、文字列の中から文字列を探し、見つかった場所が何文字目かを返します」
探す文字列は第一引数、受身の娘は第二引数です。
第一引数はただの文字列ですね。一見わかりにくいですが、
「半角スペースをシングルクォートで括っています」
スペースは透明だからねぇ。イヤネェ。
第二引数はtex[i]・・・とありますが。
[i]ってなにゃねん!texはクラスだから.とかつけるんじゃなかったのかよ!
と思った方もいるかもいないかもわからんね。
これは正しく書くと、
tex.strings[i] となります。texのstrings[i]ってことですね。
しかしTStringListでは、.string を省略して[ ]をつけてもいいことになっています。
これで謎が解けました。
はい、まだでした。
strings[i] がわかりませんね。
こういう、プロパティーの名前とかを、識別子 って言うんですが、
識別子[整数] とすると、その識別子が配列の時に、整数番目の要素を見れるのです。
はいはいはい、ますますわからなくなっていくのであります。
配列とは何かというと、
前へ習えした変数のグループのようなものです。
というか、軍隊の兵隊の一部隊だな。

gun.png

さて、texは文字列リストでした。文字列型がたくさんあるのです。
そう!文字列リストの実体は、文字列の配列なんですYO!
そして、TStringListの配列は、0番から始まります。
解りにくいことに、
「文字列リストの一行目の要素番号は0です」
しっかーし!ここで先ほど、forの初期値が0だったことが生きてくる!
初期値0で行の数だけループってことは、
forループの中のtex[i]は、「そのループ回数目の行」となるわけ!
いえーーーい
このスマート感が良い。
んで。posはtex[i]、すなわち、
クリップボードのテキストのどこかの行を指しているわけです。
その行から半角スペースを探してきて、見つかった文字数目を返します。
文字数目、ですから、一文字目が半角スペースなら1が返ります。
そして、見つからないと0が返るようになっています。
これで、
p:=pos(' ',tex[i]);
の行が解読できました。
pに、半角スペースが何文字目かが入るわけですね。
んで、なかったら0と。
次のifを見てください。
if p=0 then begin
    break;
end;
ifは大丈夫ですね。
p=0 これは簡単です。
まぁ一瞬でみてのとーりなんですが、説明すると、
= は 比較演算子 といって、 両辺が等しい場合 真 となります。
pが0なら真、 そうでなければ偽 となるわけですね。
pが0なら、つまり、posの結果が0、いわゆる、半角スペースがその行にないとき、
begin - end; 間が実行されます。
break; とだけ書いてありますね。
これも制御構文です。
「breakが実行されるとループを"一つだけ"抜けます。」
今はwhileの無限ループの中でした。
yes!breakはwhileを抜けます!exitじゃないのでforは抜けません!
すると、forはカウンタを回して次の行へ・・・・
    for i:=0 to tex.Count-1 do begin
         //ここに一行あたりの置換処理が入る
         while true do begin
            p:=pos(' ',tex[i]);
            if p=0 then begin
                break;
            end;
            //ここに半角スペース削除処理
            //ここに 挿入処理
         end;
    end;
ここ一体の処理がこれでわかりました!
「クリップボードのテキスト各行においてループし、
 その中で、半角スペースが見つからなくなるまで無限ループする」
ってなっています〜〜。
ん、実行しちゃダメですよ。
半角スペースが毎回見つかりますからwwww
半角スペースが になれば見つからなくなっていきますね。
それは次。でわ。