今書いてるコードが
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
矢印で示したところの意味がわかりません。わかる方がいらっしゃれば教えてくれませんか?
>Open "sample1.dat" For Binary Access Write As #1
この意味は完全に理解していますか?
なんとなくしか理解できてません・・・
もしよろしければ、そこも教えていただけると嬉しいです。
> Put #1, , listall ←ここ
ListBoxの最大添字をバイナリでsample1.datに書き込んでいる、
という意味になるんですが。
それ以前に、
・なぜ出力用バッファ「strData」を配列で取っているのか?
・なぜ「ReDim strData」では「List1.ListCount - 1」と
直接計算式を記述しているのに、その後わざわざlistallに代入するのか?
・ファイルへ出力するだけならテキストで十分なはずなのに
なぜわざわざバイナリモードにしているのか?
・このループではListBoxの最初のデータが出力されないが、
何か意図的な理由があるのか?
・ファイルオープンの際に「As #1」とリテラルで書いてしまっているあたり、
そもそも手本のコードとして適切ではないのではないか?
など、ものすごく疑問がてんこ盛りのコードのように見えます。
意味がわからないまま記述されているということで、たぶん何らかの
お手本のコードを咀嚼されているのではないかと思うんですが、
正直あまりいいお手本ではないような気がします。
もちろんご提示いただいた以外にもコードは存在するはずですし、
全体的な要件の中で上記疑問に妥当な回答のある適切なコードなのかも
しれず、単にそこまで私が理解できていないだけなのかもしれませんが。
でも、なんとなくわかりにくいですよね。
行いたい処理としては、プログラムを実行すると、テキストボックスとリストボックスがあってテキストボックスに入力した内容がリストに追加されていくというもので、メニューの保存を選択するとリスト内の内容が保存されてプログラムを終了しても、また実行したときにメニューの開くを選択するとリスト内のデータが復元されるようにしたいのです。
あと、バイナリにはこだわってないので良い方法があれば教えてください。
調べても、あまり良いものがないもので・・・
とりあえず、こんな感じではいかがでしょう。
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 で取得したデータは一度格納用の文字列型変数で受け取る必要があります。
なるほど!
これなら出来そうです。ありがとうございました。