コラム / バイナリエディタ / 14



あーもう!2行しか進んでないよ!俺の馬鹿!
次こそあと一歩。誓う。スクロールバーがみじんこぐらいになっても書くぞ。
   c:=0;
   While FS.Position<FS.Size do begin
       FS.Read(buf,1);
       str:=IntToHex(buf,2);
       if c=0 then begin
           Memo1.Lines.Add(str);
       end else  begin
           Memo1.Lines[Memo1.Lines.Count-1]:=
               Memo1.Lines[Memo1.Lines.Count-1]+' '+str;
       end;
       c:=c+1;
       if c=16 then c:=0;
   end;
毎度のコピペですが、
残りはあとこれだけ。
       if c=0 then begin
           Memo1.Lines.Add(str);
       end else  begin
           Memo1.Lines[Memo1.Lines.Count-1]:=
               Memo1.Lines[Memo1.Lines.Count-1]+' '+str;
       end;
新しい制御構文デターっ!
余計なものをーとっぱらってー
if 条件 then begin
    命令
end else begin
    命令
end;
これは、if-elseの構造です。
「条件が真ならthen begin - end を実行し、
条件が偽なら else begin - end;  を実行します。」
elseだけではダメです。
elseはかならずifのオケツにくっつきます。
then のあとのendには;をつけてはいけません。
つけないで、そのままつなげて else って書くから、
そのifとelseがセットだよ っと伝えられるわけ。
動作としてはそんなにむずかしくないですねw
ifに、条件がダメだったときに通る部分が増えるだけです。
んじゃぁ、条件を見てましょう。
if c=0 then begin
c=0 cが0なら。
cは、ループするたびに0〜15を進むんでしたね。
ってことは、16ループ回に1回だけここを通るってことです。
ちなみに最初の一回もここを通るんです。
逆に言うと、16ループ中に15回はelseの方を通るんですねぇ。
んじゃぁ、それぞれのコースを吟味しましょう。
16回に一回通るほう
           Memo1.Lines.Add(str);
新しい命令ですね。
Memo1自体の手続きではなく、ドットが2回打たれてます。
つまり、
Memo1のLinesのAdd命令を実行せよ。
という、私の母の弟の妹は私です みたいな(ねーよ
MemoのLinesプロパティーは、実は文字列リストのTStringsです。
なんてこったい、Memoコンポーネントの中に、
TStringsが入ってたのか!
って、設計の時に説明したか。
そう考えると、MemoってLinesが主役だよなぁ。
で、TStringsのAdd手続きを見てみると、(と ヘルプみたらこいつも関数でした
「文字列リストの末尾の行に引数の文字列を追加する」 
とあります。
ファイルの1バイトを取り出した数値を16進数で表したテキスト、strが、
Memo1の末尾にくっつくわけですね。
16ループに1回につき。
じゃぁelseの方はどうなっているのか。
            Memo1.Lines[Memo1.Lines.Count-1]:=
               Memo1.Lines[Memo1.Lines.Count-1]+' '+str;
うわぁ、長い!でも良く見てください。
よくみると
X:=X+' '+Str;
って形です。
cに1を足す形と似てますね。
Xに半角スペースとファイル1バイト分のテキストをくっつけてるようです。
んじゃぁ、Xを良く見てみます。
Memo1.Lines[Memo1.Lines.Count-1]
Memo1.Lines[n]
の形ですね。LinesはTStringsでしたから、
Lines[n] は Linesのどこかの行一つの文字列を表している訳です。
じゃぁ、nを見て見ましょう。
[Memo1.Lines.Count-1]
Lines.Countとは、すなわち、TStringsのcountプロパティーのことです。
「countプロパティーは、文字列リストの文字列の数を返します」
文字列の数、つまり、行の数ですね。
そしてそれを-1しています。
「行の数-1」というのはどんな値でしょうか。
実は、「一番最後の行の行番号」なのです。
ふっふっふ。TStringsは数字が0から始まるところがミソです。
1行目が0なので、最後の行は行数-1なんです。
例えば、3行のテキストだったら
おっぱい
おっぱい
おっぱい
などがありますね。
これの「行数」は3です。
「行番号」に注目。
0 : おっぱい
1 : おっぱい 
2 : おっぱい
みてくだせぇ!最後の行番号は3ではなく2です!
これで、「末尾の行の行番号は行数-1」ってことがわかったとおもいます。
さて、てっぺんにもどって、まとめて考えて見ましょう。
            Memo1.Lines[Memo1.Lines.Count-1]:=
               Memo1.Lines[Memo1.Lines.Count-1]+' '+str;
これつまり、
「末尾の行に半角スペースと16進数のテキストを追加する」
という意味だったんです。
これが、16ループに15回呼ばれるわけですね。
気付きましたか?
このループ、
16回に1回、新しい行を末尾に作り、
16回に15回は、末尾の行に追加していく
つまり、
16バイト分の表示ごとに改行していっていたのです!!!!
では実行してみましょう。

img21.png

あれ。。。?
なんだか・・・ずれてるよ・・・?
それはまた次回のお楽しみでございます