SaveToBin手続きの実装を始めましょう。
まずは変数宣言。
必要になったらそのつど書き足してもいいんですが、
直感で3つ程定義しました。
procedure SaveBinText(SaveTo:String);
var
line:Integer;
buf:Byte;
str:String;
begin
end;
整数型のline
Memoの文字列リストを一行ずつ処理していくつもりなので、
その位置を進めていくカウンタとして定義しました。
バイト型のbuf
読み込むときと同じで、いったんここにバイナリを1バイト落としてから
ファイルに書き込んでいきます。
文字列型のstr
Memoの文字列リストを1行ずつ処理する過程で、
作業するために1行をコピーするために定義しました。
きっとこれでうまくいくと思います。
(今回リアルタイムで作りながらコラムかいてます。
(開発の発想?過程とかが伝われば。
(ただしこのブッツケプログラミングが良い方法とは限りませんwww
さて、作業の最初と最後にファイルストリームを
生成、解放するのは確定なので、
それを先に書いちゃいます。
begin
FS:=TFileStream.Create(SaveTo,fmCreate);
//ここに処理
FS.Free;
end;
ファイルストリームのCreateは、開くファイルのパスと、
開くモードを指定するんでしたね。
パスは、引数で与えられたSaveToです。
「命令の内部で、引数は、既に値が入っている変数として
そのままの名前で使えます。」
fmCreateは
「ファイルが無い場合は作り、既にある場合はfmOpenWriteの動作」
となっています。
fmOpenWriteは、
「ファイルを開き、既存の内容を削除する」
となっています。
つまり、
「ファイルが無い場合は作り、ある場合は内容を削除」
を指定しています。
どちらにしても、真っ白で空っぽなファイルストリームが初期化される
というわけです。
さて、書き込むときには、一行ずつ処理するのは確定なので、
Memoの行数分ループする処理を書きます。
FS:=TFileStream.Create(SaveTo,fmCreate);
//ここに処理
for line:=0 to Form1.Memo1.Lines.Count-1 do begin
//一行あたりの処理
end;
FS.Free;
forループは、
for 初期化 to 最大値 do ;
でした。
0から始まるループの場合、最大値+1回ループするので、
行数-1を最大値にしてあります。
ところで、なぜForm1.Memo1 という風になっているのかというと、
この手続きの階層に種があります。
今までの手続きは、全て、
Form1.●● というものでした。
手続き自体がForm1の中にあったのです。
「手続きの処理の中での階層は、手続きがある位置として考えられる」
ので、Form1.◎◎ という手続きは、すべて、
変数名やら他の命令やらを、Form1. という階層だと解析していたのです。
ところが今回は、一番上の階層に定義してある手続きです。
Form1自体も一番上の階層にあるので、
Form1の中身の階層は、自分と違うためSaveToBinからは見えません。
だから、同じ階層で見えるForm1から、.で参照しないといけないのです。
まとめると
Form1.Memo1.Lines.Count
は、
フォーム1のメモ1の文字列リストの行数
という意味ですね。
行あたりのループの中身は次回。
コンテンツ
最新の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: 771
- today: 1
- yesterday: 0
- online: 2