リストボックスの保存のコードの一部分の意味がわからない所があるのですが教えてくれませんか?

解決


マーク  2008-02-17 23:35:09  No: 138991  IP: 192.*.*.*

今書いてるコードが
Private Sub Save()
    Dim itemindex As Long
    Dim strData() As String * 30
    ReDim strData(List1.ListCount - 1)
    Dim listall As Integer
    
    listall = List1.ListCount - 1
    Open "sample1.dat" For Binary Access Write As #1
    Put #1, , listall  ←ここ
        For itemindex = 1 To listall
            strData(itemindex) = List1.List(itemindex)
            Put #1, , strData(itemindex)
        Next itemindex
    Put #1, , listall  ←ここ
    Close #1
矢印で示したところの意味がわかりません。わかる方がいらっしゃれば教えてくれませんか?

編集 削除
USUKUD  2008-02-17 23:41:38  No: 138992  IP: 192.*.*.*

>Open "sample1.dat" For Binary Access Write As #1

この意味は完全に理解していますか?

編集 削除
マーク  2008-02-17 23:44:21  No: 138993  IP: 192.*.*.*

なんとなくしか理解できてません・・・
もしよろしければ、そこも教えていただけると嬉しいです。

編集 削除
さるべーじ  URL  2008-02-18 04:00:36  No: 138994  IP: 192.*.*.*

> Put #1, , listall  ←ここ

ListBoxの最大添字をバイナリでsample1.datに書き込んでいる、

という意味になるんですが。

それ以前に、

    ・なぜ出力用バッファ「strData」を配列で取っているのか?

    ・なぜ「ReDim strData」では「List1.ListCount - 1」と
      直接計算式を記述しているのに、その後わざわざlistallに代入するのか?

    ・ファイルへ出力するだけならテキストで十分なはずなのに
      なぜわざわざバイナリモードにしているのか?

    ・このループではListBoxの最初のデータが出力されないが、
      何か意図的な理由があるのか?

    ・ファイルオープンの際に「As #1」とリテラルで書いてしまっているあたり、
      そもそも手本のコードとして適切ではないのではないか?

など、ものすごく疑問がてんこ盛りのコードのように見えます。

意味がわからないまま記述されているということで、たぶん何らかの
お手本のコードを咀嚼されているのではないかと思うんですが、
正直あまりいいお手本ではないような気がします。

もちろんご提示いただいた以外にもコードは存在するはずですし、
全体的な要件の中で上記疑問に妥当な回答のある適切なコードなのかも
しれず、単にそこまで私が理解できていないだけなのかもしれませんが。

でも、なんとなくわかりにくいですよね。

編集 削除
マーク  2008-02-18 11:52:38  No: 138995  IP: 192.*.*.*

行いたい処理としては、プログラムを実行すると、テキストボックスとリストボックスがあってテキストボックスに入力した内容がリストに追加されていくというもので、メニューの保存を選択するとリスト内の内容が保存されてプログラムを終了しても、また実行したときにメニューの開くを選択するとリスト内のデータが復元されるようにしたいのです。
あと、バイナリにはこだわってないので良い方法があれば教えてください。
調べても、あまり良いものがないもので・・・

編集 削除
さるべーじ  URL  2008-02-18 23:03:27  No: 138996  IP: 192.*.*.*

とりあえず、こんな感じではいかがでしょう。

Private Sub cmdSave_Click()

    Dim FNo As Integer: FNo = FreeFile
    Dim i As Integer
    
    Open "save.txt" For Output As #FNo
    For i = 0 To List1.ListCount - 1
        Print #FNo, List1.List(i)
    Next
    Close #FNo

End Sub

・ファイル番号は他のプログラムなどで使われている可能性がありますので、
  かち合わないように FreeFile で空き番号を取得します。
・ListBoxのアイテムの数だけループを回して順に書き込めばいいです。
  アイテム数が x 個ある場合、アイテムの添字は 0 〜 x-1 となります。
・後で読み込むためだけの保存であれば、アイテム数を保存する必要はありません。
・アイテムを文字列型変数に格納する必要もありません。
  直接書き出してしまって大丈夫です。
・どうしてもバイナリでなければならない特段の理由がない限り、
  テキスト形式での出力をお勧めします。
  出力したファイルをテキストエディタで確認できるなど、扱いが簡単だからです。

で、保存と読込はセットで覚えてしまいましょう。

Private Sub cmdLoad_Click()

    Dim FNo As Integer: FNo = FreeFile
    Dim strWk As String
    
    Open "save.txt" For Input As #FNo
    Do Until EOF(FNo)
        Input #FNo, strWk
        List1.AddItem (strWk)
    Loop
    Close #FNo

End Sub

・EOF を条件としたループにすると、ファイルの最後まで読み取って次へ進みます。
・Input で取得したデータは一度格納用の文字列型変数で受け取る必要があります。

編集 削除
マーク  2008-02-19 01:02:41  No: 138997  IP: 192.*.*.*

なるほど!
これなら出来そうです。ありがとうございました。

編集 削除