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



いやぁ、最近自覚し始めたけど、
次はこれです っていいつつ、
2回3回後回しになること多いなw
今度こそ読み込む部分のソースをかくぞう!
てかこれ編集してると、画面の上端の、
広告の、AVキング って奴が気になって気になって仕方が無いんだが・・・
昨日クリックしたらAV撮影がテーマのエロゲーでした。
なんじゃそりゃ!(クリックしたのかよ
まずは前回のソースをば。
procedure TForm1.Open1Click(Sender: TObject);
begin
    if not OpenDialog1.Execute then
    begin
        exit;
    end;

end;
ソースっていったり、コードっていったりしてますが、
特に分けたりしてるわけでもないです。
んで、こんなコードを書いちゃってくれYO
   if not OpenDialog1.Execute then
   begin
       exit;
   end;
   FilePath:=OpenDialog1.FileName;
   FS:=TFileStream.Create(FilePath,fmOpenRead);
   Memo1.Clear;
   //ここが読み込む処理

   FS.Free;
やっぱり核の部分にはまだ触れないんじゃないか!
って感じ@w@
新しく追加されたのは4行ですね。(コメント除く
順番に見ていきましょう。
FilePath:=OpenDialog1.FileName;
ま、FilePathにOpenDialog1.FileNameを代入してるってことはわかると思います。
TOpenDialogクラスの説明によれば、
FileNameプロパティーは、さっき開かれたファイルのパスを持ってます。
これでファイルのパスがダイアログから受け取れたと。
OpenDialog君の出番はここでおしまいです。
FS:=TFileStream.Create(FilePath,fmOpenRead);
ですが、覚えているでしょうか。
クラスの実体「インスタンス」を生成して、変数にぶちこんで、
使えるようにする っていう、クラスの使い方のルール。
もしかして、このFS変数を定義してから、
FormCreateの時とかになんで初期化しないか 疑問に思った人って居ます?
TFileStreamは、Createする時=ファイルを開くとき
なんですよね。
だからファイルを使うぎりぎりまで出番は無しなのです。
そしてこのCreateには引数があります。
Create(開くファイルのパス,ファイルを開くモード);
一個目は楽勝です。
さっきDialogから受け取ったファイルパスをほーりこんであるだけです。
モードというのはなんでしょうか。
Windowsには、ファイルの開き方? にいくつか権限があって、(Linuxの方がそこんとこしっかりしてるっぽいけど
読み込み用だけとか、上書きとか、書き込みとか があるんですね。
んで、他のアプリから、「書き込みロック」とかができるらしいです。
例えば、WMPで再生中のmp3をメッセで転送しようとすると、
開けませんでした とか出ますよね?
あれは、WMPがファイルの「読み込みロック」をかけてるから、
メッセが読み込みできなくなってるわけっす。
んで、まぁ、今回は読み込むだけなんで、
fmOpenRead という、「読み込むだけ」っていう値を入れてます。
他にもあるのでヘルプからコピペ
fmCreate	 指定した名前でファイルを作成する。指定した名前のファイルがすでに存在する場合は,fmOpenWrite と同じ動作を行う
fmOpenRead 読み出し用にファイルを開く
fmOpenWrite 書き込み用にファイルを開く。既存のファイルを開いた場合,古い内容は破棄される
fmOpenReadWrite ファイルを開き,内容に変更を加える。古い内容は維持される
ま、OpenReadWriteで開いちゃうのが一番簡単なんですけどねwww
これで、
「ダイアログボックスから受け取ったファイルを
読み込みモードで開いたファイルストリームクラスの実体」を入手
できたわけです。
次の行。
Memo1.Clear;
新規作成の時にも書いたけど、Memoコンポーネントのテキストを全消しします。
これをやっておかないと、
既にアルところに追加する形でファイルを開いちゃって
見るも無残
ラスト
FS.Free;
クラス.Free; で、クラスを解放します。
TFileStreamは開くときに生成するので、使い終わったら解放するもん
なんでしょう多分。
というか、解放してやらないと、
ファイルのデータをメモリーに置きっぱなしになるのでちょっとエグイです。
(もしかしたらHDDのアクセスを隠蔽してるだけでメモリーは食わないかも
(まぁ中の人の動作は追及しないためにクラスがあるわけなので
(オブジェクト指向で深く考えたら負けかな と 思っている
こ、今度こそ読み込む部分かくぞwwww