第2回  「ソースを読んでみよう!」





ソースを読んでみる

さて、それではソースプログラムの解説を始めていきましょう。
VBを起動して、s_file.vbp というファイルを開いて下さい。
フォームファイルと標準モジュールが、それぞれ1つずつ読み込まれたと思います。

そのフォーム上に、「書き換え」というボタンがありますので、これをダブルクリックして
コードウィンドウ(実際にプログラムを書く画面)を開いてみましょう。


s_file ソースプログラム1
Private Sub cmdExecute_Click()
    '存在しないファイル名を指定すると、そのファイルを作成してしまうので注意!
    '本来はエラーチェックを行ってから実行する。
    ret = BinFileEdit(txtFilename.Text, txtCode.Text)

    If ret = 0 Then
      MsgBox "書き換えに成功しました"
    Else
      MsgBox "エラーです" & vbCrLf & "エラー番号 " & ret
    End If
End Sub


上記のような画面になったと思います。

まず1行目の「Private Sub cmdExecute_Click()」の部分ですが、これは「cmdExecute」という名前の部品
(コントロール)がクリックされた時に呼び出されるプロシージャの始まりを示します。
そして、一番下の行の「End Sub」がプロシージャの終わりを示します。

次に2.3行目の「'」で始まっている部分ですが、これはコメント行といい、実際には実行されない部分です。
主にプログラムの注意書きをするために使われます。


4行目がファイルの書き換えを行っている部分になります。
「BinFileEdit」という関数を呼び出し、引数には「txtFilename.Text」「txtCode.Text」を指定する。
また、その戻り値は「ret」に格納する。
という意味になります。

何の事かさっぱりわからん・・・という人の為に、もう少しだけ詳しく説明します。
「BinFileEdit」という関数は、自分で作成した関数です。(VBがあらかじめ用意しているものでは無いという事)
この関数は、標準モジュールの「EditEngine.bas」に定義されています。
実際に「EditEngine.bas」を開いて確認してみましょう。
見つかりましたか?

4行目が実行されると、この関数が呼び出されるわけです。
「BinFileEdit」関数のコメントにも書いてある通り、この関数は「ファイルのフルパス名」と「改造コード」を与えてやると
対象のファイルを書き換え、その実行結果を返してくれます。

そして、ファイルのフルパス名は1番目の引数「txtFilename.Text」で与えています。
「txtFilename」とは、フルパス名を入力するテキストボックスの名前です。
その「Text」プロパティ(中に書かれた文字列)を引数として渡してやるわけです。

第1回の時に、フルパス名には「C:\Test\sample1.txt」と入力しましたので、
「txtFilename.Text」は、「C:\Test\sample1.txt」を示す事になります。
2番目の引数についても、同様です。

そして、ファイルの書き換えに成功すると、戻り値は「0」となります。
また、何らかのエラーがあった場合の戻り値は、エラー番号が返されます。
その値が「ret」に格納されるという事ですね。


5〜9行目に関しては、プログラムを少しでもかじった事があればすぐに分かると思いますが、
If 文といいまして、条件によって行う処理を選択する場合に使用します。

もし、「ret」に「0」が入っていれば、これはファイルの書き換えに成功したという事なので、
書き換えに成功した旨をメッセージで表示します。
それ以外の値が入っていたら、エラーがあったという事なので、
エラーである事を通知し、そのエラー番号を表示させています。



ファイルのドラッグ&ドロップに対応させよう

さて、ファイル書き換えについての説明が終了した所で、今度は使い勝手の向上を目指してみましょう。
先ほど、ファイルのフルパス名を自分で入力していましたが、はっきりいって面倒です。
そこで、エクスプローラー等から、対象のファイルをテキストボックス「txtFilename」に
ドラッグ&ドロップすると、自動的にフルパス名を表示できるようにしましょう。


s_file ソースプログラム2
Private Sub txtFilename_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
    'テキストボックスにファイルをドロップすると、ファイルのフルパスを表示する
    'OLEDropMode を1(手動)に設定しておく必要がある。

    txtFilename.Text = Data.Files(1)
End Sub


先ほどと同じく、2.3行目はコメント文ですので、実行には影響しません。
問題は1行目のなが〜い文章です。

先ほどと同じように、「txtFilename」という名前のコントロールが「OLEDragDrop」された時に発生するイベントである。
というように解読するのですが、今度はその後ろに( )で囲まれた文字列がたくさん並んでいますね。
これは、このプロシージャに渡される引数を表しています。

細かい説明は省きますが、全部で6つの引数(「Data」「Effect」「Button」「Shift」「X」「Y」)
があるという事だけ理解できればOKです。
今回利用している引数は「Data」の1つだけです。

「Data」という引数は、コントロール上にドロップされたファイルを示します。
そして「Data.Files(1)」というのは、ドロップされたファイルの1番目のファイルの事です。
ご存じの様に、ドラッグ&ドロップには複数のファイルを指定する事もできますので、
その場合は、その中のどのファイルを示すのかを指定しないといけないんですね。

後は、4行目で、そうして得たファイルのフルパス名を、「txtFilename」コントロールの「Text」プロパティに
代入してやれば、フルパス名の表示は完了となります。

ただし、2.3行目のコメントにもあるように、このコードを書くだけでは不十分で、
プロパティウィンドウから、「txtFilename」コントロールの「OLEDropMode」プロパティを
「1(手動)」に設定しておかないと、ドラッグ&ドロップが出来ませんので、注意して下さい。

それでは、s_file プログラムを実行して、フルパス名をドラッグ&ドロップで表示できるか実際に試してみて下さい。
下記の図の「◎」の所に、エクスプローラー等から目的のファイルをドラッグ&ドロップしてみましょう。

ファイルのフルパス名     ◎     
コード           


うまくできましたか?

それでは、第2回はここまでとさせて頂きます。
次回は、バイナリエディタを使って、改造結果の確認を行いたいと思います。



前に戻る     次に進む

講座の初めに戻る