質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.59%

Form2のテキストボックスの内容をForm1からの制御でファイルに保存する方法

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,852
質問です。
現在MDIをつかったソフトを作っているのですが
子フォーム(Form2)のテキストボックスの内容を保存するために次のようなプログラムを書いたのですが、
[値をNullにすることはできません。]
と出てきてしまいます。
どうすればいいでしょうか?

Form2に書いてあるSAVEのコード
Fnameはファイルのパス
AzukiControl1はテキストボックスです。
Public Class Form2
    Dim Fname As String
    Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim path As String = System.Environment.GetFolderPath(Environment.SpecialFolder.Personal) 'マイドキュメントのパス
        Dim sr As New System.IO.StreamReader(path + "\MyConStudio\AppDate\text.txt", _
        System.Text.Encoding.GetEncoding("shift_jis"))
        '内容をすべて読み込む
        Fname = sr.ReadToEnd()
        '閉じる
        sr.Close()

        Dim FL As New System.IO.StreamReader(Fname, _
        System.Text.Encoding.GetEncoding("shift_jis"))
        '内容をすべて読み込む
        AzukiControl1.Text = FL.ReadToEnd()
        '閉じる
        FL.Close()
        Me.Text = Fname
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Me.Save()

    End Sub
    Public Sub Save()
        Dim sw As New System.IO.StreamWriter(Fname, _
        False, _
        System.Text.Encoding.GetEncoding("shift_jis"))
        'TextBox1.Textの内容を書き込む
        sw.Write(Me.AzukiControl1.Text)
        '閉じる
        sw.Close()
    End Sub
End Class
MDI親フォーム(Form1)のコード

Form2.Save()
MDI子フォームの呼び出し
'main.mcs表示
           
            Dim sw As New System.IO.StreamWriter(path + "\MyConStudio\AppDate\text.txt", _
            False, _
            System.Text.Encoding.GetEncoding("shift_jis"))

            sw.Write(Pname + "main.mcs")
            '閉じる
            sw.Close()
            Dim NewMDIChild As New Form2()
            'Set the Parent Form of the Child window.
            NewMDIChild.MdiParent = Me
            'Display the new form.
            NewMDIChild.Show()


            'AboutProject.txt表示
            Dim sw1 As New System.IO.StreamWriter(path + "\MyConStudio\AppDate\text.txt", _
            False, _
            System.Text.Encoding.GetEncoding("shift_jis"))

            sw1.Write(Pname + "AboutProject.txt")
            '閉じる
            sw1.Close()
            Dim NewMDIChild2 As New Form2()
            'Set the Parent Form of the Child window.
            NewMDIChild2.MdiParent = Me
            'Display the new form.
            NewMDIChild2.Show()
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Tak1wa

    2015/06/25 19:44

    2つ質問があります。

    ①FnameはForm2メンバ変数ですか?実際はSaveメソッドの引数だったりします?
    ②親フォームからForm2を起動する処理を提示してください。気になっているのはForm2っていうインスタンス名なのかなと。

    キャンセル

回答 3

checkベストアンサー

0

クラスの中、メソッドの外です。path変数と同じような位置です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/25 22:14

    コメントと間違えて投稿してしまいました。失礼しました。

    キャンセル

0

他の部分のコードが不明ですが Fname には何かファイル名となる文字列をセットしていますか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/25 20:03

    しています。
    先ほど、Form2で、Save()を実行したところ問題なく動作しましたが
    Form1から実行するとFnameがNothingになることがわかりました

    キャンセル

0

推測ですが、実際表示中のForm2インスタンスに対してSaveメソッドを呼び出せていますか?
例えば以下のような感じでShowした際のインスタンスを変数(例ではhoge)で保持しておき、
Saveメソッド実行時はそのインスタンスに対してメソッド呼び出しをする必要があります。

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.IsMdiContainer = True
        hoge = New Form2()
        hoge.MdiParent = Me
        hoge.Show()
    End Sub

    Private hoge As Form2

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'Form2.Save()   '←×
        hoge.Save()     '←○
    End Sub
End Class

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/25 20:14

    追記ありがとうございます。
    この例であればNewMDIChild2がForm2のインスタンスなので、
    親フォームのメンバなどにインスタンスを保持しておき、
    NewMDIChild2.Save()としてみてください。

    キャンセル

  • 2015/06/25 21:19

    どうやればNewMDIChild2をPublicにできますかね?
    そのままだと、アクセスできないので、、、、。

    キャンセル

  • 2015/06/25 21:24

    Publicにする必要があるのかこの部分的なソースでは判断できませんが、変数スコープは理解されていますか。


    Dim NewMDIChild As New Form2()


    はローカル変数です。メンバ変数としてNewMDIChildを定義するだけで良いです。

    キャンセル

  • 2015/06/25 22:11

    Public Class Form1
    Dim path As String = System.Environment.GetFolderPath(Environment.SpecialFolder.Personal) 'マイドキュメントのパス

    Private Sub バージョン情報ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles バージョン情報ToolStripMenuItem.Click

    End Sub

    Private Sub MyConStudioの終了ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles MyConStudioの終了ToolStripMenuItem.Click
    Me.Close()

    End Sub

    Private Sub 新しいファイルToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 新しいファイルToolStripMenuItem.Click
    Dim f As New Form3()
    'Form2を表示する
    'ここではモーダルダイアログボックスとして表示する
    'オーナーウィンドウにMeを指定する
    f.ShowDialog(Me)
    'フォームが必要なくなったところで、Disposeを呼び出す
    f.Dispose()
    Dim NewMDIChild As New Form2()
    'Set the Parent Form of the Child window.
    NewMDIChild.MdiParent = Me
    'Display the new form.
    NewMDIChild.Show()
    End Sub

    Private Sub 新しいプロジェクトToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 新しいプロジェクトToolStripMenuItem.Click
    Dim f As New Form4()
    'Form2を表示する
    'ここではモーダルダイアログボックスとして表示する
    'オーナーウィンドウにMeを指定する
    f.ShowDialog(Me)
    'フォームが必要なくなったところで、Disposeを呼び出す
    f.Dispose()


    'main.mcs表示
    Dim sr As New System.IO.StreamReader(path + "\MyConStudio\AppDate\ProjectName.txt", _
    System.Text.Encoding.GetEncoding("shift_jis"))
    '内容をすべて読み込む
    Dim Pname As String = sr.ReadToEnd()
    '閉じる
    sr.Close()
    Dim sw As New System.IO.StreamWriter(path + "\MyConStudio\AppDate\text.txt", _
    False, _
    System.Text.Encoding.GetEncoding("shift_jis"))
    'TextBox1.Textの内容を書き込む
    sw.Write(path + "\MyConStudio\" + "Project\" + Pname + "\main.mcs")
    '閉じる
    sw.Close()
    Dim NewMDIChild As New Form2()
    'Set the Parent Form of the Child window.
    NewMDIChild.MdiParent = Me
    'Display the new form.
    NewMDIChild.Show()


    'AboutProject.txt表示
    Dim sw1 As New System.IO.StreamWriter(path + "\MyConStudio\AppDate\text.txt", _
    False, _
    System.Text.Encoding.GetEncoding("shift_jis"))
    'TextBox1.Textの内容を書き込む
    sw1.Write(path + "\MyConStudio\" + "Project\" + Pname + "\AboutProject.txt")
    '閉じる
    sw1.Close()
    Dim NewMDIChild2 As New Form2()
    'Set the Parent Form of the Child window.
    NewMDIChild2.MdiParent = Me
    'Display the new form.
    NewMDIChild2.Show()

    Me.Text = Me.Text + " [" + Pname + "]"
    End Sub

    Private Sub ファイルを開くToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ファイルを開くToolStripMenuItem.Click
    Dim path As String = System.Environment.GetFolderPath(Environment.SpecialFolder.Personal) 'マイドキュメントのパス

    'OpenFileDialogクラスのインスタンスを作成
    Dim ofd As New OpenFileDialog()

    'はじめのファイル名を指定する
    'はじめに「ファイル名」で表示される文字列を指定する
    ofd.FileName = "default.txt"
    'はじめに表示されるフォルダを指定する
    '指定しない(空の文字列)の時は、現在のディレクトリが表示される
    ofd.InitialDirectory = System.Environment.GetFolderPath(Environment.SpecialFolder.Personal)
    '[ファイルの種類]に表示される選択肢を指定する
    '指定しないとすべてのファイルが表示される
    ofd.Filter = _
    "TEXTファイル(*.txt)|*.txt|すべてのファイル(*.*)|*.*"
    '[ファイルの種類]ではじめに
    '「すべてのファイル」が選択されているようにする
    ofd.FilterIndex = 2
    'タイトルを設定する
    ofd.Title = "開くファイルを選択してください"
    'ダイアログボックスを閉じる前に現在のディレクトリを復元するようにする
    ofd.RestoreDirectory = True
    '存在しないファイルの名前が指定されたとき警告を表示する
    'デフォルトでTrueなので指定する必要はない
    ofd.CheckFileExists = True
    '存在しないパスが指定されたとき警告を表示する
    'デフォルトでTrueなので指定する必要はない
    ofd.CheckPathExists = True

    'ダイアログを表示する
    If ofd.ShowDialog() = DialogResult.OK Then
    'OKボタンがクリックされたとき
    '選択されたファイル名を表示する
    Console.WriteLine(ofd.FileName)
    Dim sw As New System.IO.StreamWriter(path + "\MyConStudio\AppDate\text.txt", _
    False, _
    System.Text.Encoding.GetEncoding("shift_jis"))
    'TextBox1.Textの内容を書き込む
    sw.Write(ofd.FileName)
    '閉じる
    sw.Close()
    End If
    Dim NewMDIChild As New Form2()
    'Set the Parent Form of the Child window.
    NewMDIChild.MdiParent = Me
    'Display the new form.
    NewMDIChild.Show()
    End Sub

    Private Sub MyConStudioサイトを開くToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles MyConStudioサイトを開くToolStripMenuItem.Click
    Dim NewMDIChild As New Form5()
    'Set the Parent Form of the Child window.
    NewMDIChild.MdiParent = Me
    'Display the new form.
    NewMDIChild.Show()
    End Sub

    Private Sub プロジェクトを開くToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles プロジェクトを開くToolStripMenuItem.Click
    'OpenFileDialogクラスのインスタンスを作成
    Dim ofd As New OpenFileDialog()

    'はじめのファイル名を指定する
    'はじめに「ファイル名」で表示される文字列を指定する
    ofd.FileName = "default.html"
    'はじめに表示されるフォルダを指定する
    '指定しない(空の文字列)の時は、現在のディレクトリが表示される
    ofd.InitialDirectory = System.Environment.GetFolderPath(Environment.SpecialFolder.Personal) + "\MyConStudio\Project"
    '[ファイルの種類]に表示される選択肢を指定する
    '指定しないとすべてのファイルが表示される
    ofd.Filter = _
    "Projectファイル(*.pro)|*.pro"
    '[ファイルの種類]ではじめに
    '「すべてのファイル」が選択されているようにする
    ofd.FilterIndex = 2
    'タイトルを設定する
    ofd.Title = "開くファイルを選択してください"
    'ダイアログボックスを閉じる前に現在のディレクトリを復元するようにする
    ofd.RestoreDirectory = True
    '存在しないファイルの名前が指定されたとき警告を表示する
    'デフォルトでTrueなので指定する必要はない
    ofd.CheckFileExists = True
    '存在しないパスが指定されたとき警告を表示する
    'デフォルトでTrueなので指定する必要はない
    ofd.CheckPathExists = True

    'ダイアログを表示する
    If ofd.ShowDialog() = DialogResult.OK Then

    'OKボタンがクリックされたとき
    '選択されたファイル名を表示する
    Console.WriteLine(ofd.FileName)
    Dim sr2 As New System.IO.StreamReader(ofd.FileName, _
    System.Text.Encoding.GetEncoding("shift_jis"))
    '内容をすべて読み込む
    Dim Pname As String = sr2.ReadToEnd()
    '閉じる
    sr2.Close()

    'main.mcs表示

    Dim sw As New System.IO.StreamWriter(path + "\MyConStudio\AppDate\text.txt", _
    False, _
    System.Text.Encoding.GetEncoding("shift_jis"))

    sw.Write(Pname + "main.mcs")
    '閉じる
    sw.Close()
    Dim NewMDIChild As New Form2()
    'Set the Parent Form of the Child window.
    NewMDIChild.MdiParent = Me
    'Display the new form.
    NewMDIChild.Show()


    'AboutProject.txt表示
    Dim sw1 As New System.IO.StreamWriter(path + "\MyConStudio\AppDate\text.txt", _
    False, _
    System.Text.Encoding.GetEncoding("shift_jis"))

    sw.Write(Pname + "AboutProject.txt")
    '閉じる
    sw.Close()
    Dim NewMDIChild2 As New Form2()
    'Set the Parent Form of the Child window.
    NewMDIChild2.MdiParent = Me
    'Display the new form.
    NewMDIChild2.Show()

    Me.Text = "MyConStudio [" + Pname + "]"
    End If
    End Sub

    Private Sub プロジェクトを保存ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles プロジェクトを保存ToolStripMenuItem.Click
    NewMDIChild2.Save()

    End Sub
    End Class
    です。
    すみません、メンバ変数というのがわからなくて、、、、、。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る