ボタンを押したときにTabPageとTextBoxを追加し、この内容を保存するプログラムを作成しているのですが、TabPageとTextBoxを2つずつ以上作った状態では保存時にエラーが出てしまいます。
どこがおかしいのでしょうか。
ソース
'メモ追加
Private Sub MemoAddBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MemoAddBtn.Click
MemoNum = MemoNum + 1
ReDim MemoPages(MemoNum)
ReDim MemoText(MemoNum)
MemoPages(MemoNum) = New TabPage
MemoText(MemoNum) = New TextBox
TabControlMemo.Controls.Add(MemoPages(MemoNum))
MemoPages(MemoNum).Text = MemoName.Text
MemoPages(MemoNum).Controls.Add(MemoText(MemoNum))
With MemoText(MemoNum)
.Top = 0
.Left = 0
.Width = 334
.Height = 383
.Multiline = True
End With
End Sub
Private Sub MemoryBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MemoryBtn.Click
Dim i As Integer
'保存するクラスのインスタンスを作成
Dim mem As New Memo
mem.MN = MemoNum
ReDim mem.TabName(MemoNum)
ReDim mem.MemoText(MemoNum)
For i = 0 To MemoNum
mem.TabName(i) = MemoPages(i).Text '←エラーが出る箇所
mem.MemoText(i) = MemoText(i).Text
Next i
'XmlSerializerオブジェクトを作成
'書き込むオブジェクトの型を指定する
Dim serializer As New _
System.Xml.Serialization.XmlSerializer(GetType(Memo))
'ファイルを開く
Dim fs As New System.IO.FileStream("Memo.xml", System.IO.FileMode.Create)
'シリアル化し、XMLファイルに保存する
serializer.Serialize(fs, mem)
'閉じる
fs.Close()
End Sub
別クラスで
Public Class Memo
Public MN As Integer
Public TabName() As String
Public MemoText() As String
End Class
ご教授いただければ幸いです!
すいません。
グローバルで定義している部分を書き忘れました。
Private MemoNum As Integer = -1
Private MemoPages() As TabPage
Private MemoText() As TextBox
です。
よろしくお願いいたします!
> ReDim MemoPages(MemoNum)
> ReDim MemoText(MemoNum)
ここで、ReDimしてますが・・・
http://msdn2.microsoft.com/ja-jp/library/w8k3cys2(VS.80).aspx
にあるように、
『Preserve を指定しない場合、ReDim は、新しい配列の要素をそのデータ型の既定値で初期化します。』
ので、今まで設定していた内容がクリアされてしまいますよ。
なるほど!
それで2つ以上作った時にエラーが出るわけですか。
ありがとうございます。
早速修正してみます。
正にご指摘の箇所を修正したところ、
正常に動いてくれました。
ありがとうございました!
ツイート | ![]() |