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



置換部分、実はけっこう大変になります。
procedure TForm1.Button1Click(Sender: TObject);
begin
まずはこの部分を、
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
としてください。
var、覚えていますか?
texとclipを定義した部分に出てきた単語です。
ここでも同じく、変数宣言に使われています。
このように、手続きの実装部の中で宣言した変数は、
この手続きの中でしか使えなくなります。
中でしか使えないなんて不便だと思いますか?
実はこれが便利なんです。
今から見せるiの使い道を見ればわかるのですが、
本当に一つの小さな用途だけに使う変数は、
外からも使えるようにしてしまうと、
そういった変数でプログラムがだらだらと長くなってしまうし、
そこでしか使わないのにどうとうと出ているのは気持ち悪いです。
必要ねえ奴は家に引っ込んでろ! ってことですね。
それがプログラムで書けるわけです。
(うわあああ 全然合理的な説明ができNEEEEEEEEEEEEEEET
まぁ、意味を見ましょう。
変数の宣言は、
変数名:型;
でしたから、
integer型の変数iを定義していますね。
これはクラスではなく、シンプルな変数なので、
(.で細かい情報にアクセスしたりしない
生成、解放の処理は必要ありません。
これだけで、ボタンクリック処理の中でいつでもつかえ、処理が終われば勝手に消えます。
では、integer型とはどんな型でしょうか。
実は、 ん 実は って多用してるけど、これはそれほどでもないか@w@
気を取り直して
ごほん
integer型は符号尽き32bit整数です。
さーて、なんのことやら な一行ですが、細かく見ていきましょう。
符号付き というのは、そう、あの符号です。 + と − 。
+/−のある、32bit整数
32bitとはなんでしょうか。bitというのはPCの中の容量の単位です。
8bitが1byteになります。
(大昔のCPUには9bit1Byteとか12bit1Byteな変態コンピューターもあったお
つまり、
+/−のある、4Byteサイズの整数
ってことですね。
4Byteってのは別に、1〜4 って意味じゃないですよ。
数にすると、0〜4294967295です。 でも、符号が付いて負の数にも容量を食うので、
-2147483648〜2147483647 になります。
整数ですから、1.4とかの小数は使えません。 また、範囲からはみ出る数字も使えません。
まぁ21億なんて行かないから大丈夫大丈夫。
さて、var i:integer;でだいぶ喋っちゃいましたねwww
前回の    //ここに置換処理が入る という部分を書き換えてください。
    //ここに置換処理が入る
    for i:=0 to tex.Count-1 do begin 
        //ここに一行あたりの置換処理が入る
    end; 
さぁ、また新しいものが出てきましたよ。
これも制御構文の一つで、
for 初期化文 to 最大値 do begin
    命令
end;
という風に使います。
初期化文では、必ず、
カウンタ := 初期値
という風に書きます。
for文は、
「初期化文を実行した後、命令を実行し、
 カウンタを1増やす。最大値を超えるまでこれを繰り返す。」
となっています。
ん?わけがわからない?
じゃぁ試しに以下のコードを見てください
for i:=0 to 2 do begin
命令 
end;
まず、iが0になります。iは2以下なので、命令が実行されます。
そしてiが1になります。
また、for が書いてある行に戻ります。
iは1になっています。iは2以下なので、命令が実行されます。
そしてiが2になります。
また、for が書いてある行に戻ります。
iは2になっています。iは2以下なので、命令が実行されます。
そして、iが3になります。
また、forが書いてある行に戻ります。
iは2より大きいので、forのend;の先に進みます。
結局、命令 が 3回実行されました。
というわけです。同じ処理をなんどもやりたいときに使うのです。

loop.png

全く同じ処理をしても意味がないですが、
iは一回ずつ大きくなっていきます。ここがミソなのですが、
まぁそれは次。
今回は、このforが何回実行されるかを注目してください。
    for i:=0 to tex.Count-1 do begin
と書いてありますね。
最大値がtexのCountプロパティー -1になっています。
TStringListのCountプロパティーは、文字列リストの文字列の数です。
この前の処理で、クリップボードからコピーしてますから、
「クリップボードに入っていたテキストの行の数」ということになります。
さて、なぜ-1なのでしょうか。
ループの回数に行数を使っているのですから、
行の数だけループしたいのは気付いていると思います。
先ほどの例で、0 to 2 の場合、カウンタは、0,1,2の時があり、 
3回実行されました。
そう、カウンタが0の時が一回あるので、
カウンタ:=0の場合は、最大値+1回ループしてしまうのです。
(さっきの例なら2+1回ループしたでしょ
だから、テキストの行+1回ループしてしまうので、一回減らして調整するために、
-1となっているわけですね。
もしここであなたが
「じゃぁ初期値を1にしたらいいんじゃね?」
と気付いたら、アインシュタインの生まれ変わりうんおk把握うはwwwwwwww




(´・ω・`)
といいたいところなんだが、0で数えるとあとでいいことがあるんだなぁ〜
では、またあおう。