動的変数の保存をするには?

解決


うとぅん  2007-01-17 04:06:30  No: 97660

ボタンを押したときに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

ご教授いただければ幸いです!


うとぅん  2007-01-17 04:09:38  No: 97661

すいません。
グローバルで定義している部分を書き忘れました。

Private MemoNum As Integer = -1
Private MemoPages() As TabPage
Private MemoText() As TextBox

です。
よろしくお願いいたします!


大吉末吉  2007-01-17 04:30:13  No: 97662

>         ReDim MemoPages(MemoNum)
>         ReDim MemoText(MemoNum)
ここで、ReDimしてますが・・・

http://msdn2.microsoft.com/ja-jp/library/w8k3cys2(VS.80).aspx

にあるように、

『Preserve を指定しない場合、ReDim は、新しい配列の要素をそのデータ型の既定値で初期化します。』

ので、今まで設定していた内容がクリアされてしまいますよ。


うとぅん  2007-01-17 20:21:45  No: 97663

なるほど!
それで2つ以上作った時にエラーが出るわけですか。
ありがとうございます。
早速修正してみます。


うとぅん  2007-01-17 20:29:52  No: 97664

正にご指摘の箇所を修正したところ、
正常に動いてくれました。

ありがとうございました!


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加