よし、余談を挟まずに一気に書いてみます。
まずはさっきのソースを↓みたいに編集
var
buf:Byte;
c:Integer;
str:String;
begin
if not OpenDialog1.Execute then
begin
exit;
end;
FilePath:=OpenDialog1.FileName;
FS:=TFileStream.Create(FilePath,fmOpenRead);
Memo1.Clear;
//ここが読み込む処理
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;
FS.Free;
end;
ふえー 長い。
変数も追加されてるので注意ーー。
んじゃ解説していきます。まずは変数宣言から。
var
buf:Byte;
c:Integer;
str:String;
buf:Byte バイト型の変数、bufを定義。
bufってのは、バッファー すなわち、 とりあえず入れて貯めておく場所
の意味。
Byte型は初めて出てきましたね。
実は整数型です。超しょぼい。
容量は1バイトで、(まんまです) 負の数が使えません。
0〜255 のどれかの値しかもてないわけですね。
c:Integer 整数型の変数、cを定義。
これは一時的に使うやつです。一応数を数えるのに使うので、
カウンター を略して c 。(略しすぎ!
str:String 最終的に文字列にして、Memoコンポーネントにほおりこむために、
いったん保存するために定義しました。こいつもたいした意味は無しなんで、
stringを略してstr。
じゃぁ、ソースコードいきますよ!
c:=0;
While FS.Position<FS.Size do begin
//いったん略
c:=c+1;
if c=16 then c:=0;
end;
まず、この構造だけみてください。
まず、cを0にして、ループに入ります。
c:=c+1; で、左辺のcに右辺のc+1が入るので、cが1増えますね。
よくいろんな本で この式は数学で見ると両辺が等しくないのでおかしいですが、
プログラムではおかしくありません って書いてあったりするけど、
そんなとこに疑問もたなくね?持ってたらごめん。
次の行で、if文です。
条件は c=16 cが16ならば、 って意味ですね。
then の後に、begin / end; が無いですね!
実は、実行する処理が1行ならば、begin / end; でくくらなくてもいいのです。
で、c:=0; cが0になります。
これがどう動くかというと、
ループを通るたびにcは増えていき、16になるときには0に戻るので、
0,1,2,...13,14,15,0,1,2,....14,15,0,1,.... って感じでぐるぐるまわります。
さて、スルーしていたWhileの方を見て見ます。
While 条件 do beign end; は、「条件が 真の間繰り返す」でしたね。
この場合の条件は、 FS.Position<FS.Size です。
FSのプロパティーが二つもでてきました!
Positionは現在のストリーム位置 、 Sizeはファイルのサイズです。
ストリーム位置とは、ファイルのどこまで読んだか をさしています。
ストリーム位置がサイズより 小さい、 すなわち、全部読んでいない
という事です。全部読み込んだときにはpositionが満タンになり、
Sizeと等しくなるので、条件が偽になり、ループを抜ける
という仕組みです。
中の詳しくは次で。(結局一瞬横道それた
コンテンツ
最新の12件
2023-06-12
2021-02-15
2013-06-19
2012-07-14
2012-02-04
2012-01-06
2011-03-31
2010-08-26
2010-03-15
2009-10-21
2009-02-12
2008-11-18
メニュー編集
- counter: 964
- today: 1
- yesterday: 0
- online: 1