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

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

新規登録して質問してみよう
ただいま回答率
85.48%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

3回答

3736閲覧

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

Mogami_Tsuchika

総合スコア47

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

1クリップ

投稿2015/06/25 10:19

編集2015/06/25 11:09

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

Form2に書いてあるSAVEのコード
Fnameはファイルのパス
AzukiControl1はテキストボックスです。

lang

1Public Class Form2 2 Dim Fname As String 3 Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load 4 Dim path As String = System.Environment.GetFolderPath(Environment.SpecialFolder.Personal) 'マイドキュメントのパス 5 Dim sr As New System.IO.StreamReader(path + "\MyConStudio\AppDate\text.txt", _ 6 System.Text.Encoding.GetEncoding("shift_jis")) 7 '内容をすべて読み込む 8 Fname = sr.ReadToEnd() 9 '閉じる 10 sr.Close() 11 12 Dim FL As New System.IO.StreamReader(Fname, _ 13 System.Text.Encoding.GetEncoding("shift_jis")) 14 '内容をすべて読み込む 15 AzukiControl1.Text = FL.ReadToEnd() 16 '閉じる 17 FL.Close() 18 Me.Text = Fname 19 End Sub 20 21 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 22 Me.Save() 23 24 End Sub 25 Public Sub Save() 26 Dim sw As New System.IO.StreamWriter(Fname, _ 27 False, _ 28 System.Text.Encoding.GetEncoding("shift_jis")) 29 'TextBox1.Textの内容を書き込む 30 sw.Write(Me.AzukiControl1.Text) 31 '閉じる 32 sw.Close() 33 End Sub 34End Class

MDI親フォーム(Form1)のコード
```lang-<VB.net>
Form2.Save()

MDI子フォームの呼び出し ```lang-<VB.net> '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()

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tak1wa

2015/06/25 10:44

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

回答3

0

ベストアンサー

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

投稿2015/06/25 13:14

Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tak1wa

2015/06/25 13:14

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

0

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

lang

1Public Class Form1 2 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 3 Me.IsMdiContainer = True 4 hoge = New Form2() 5 hoge.MdiParent = Me 6 hoge.Show() 7 End Sub 8 9 Private hoge As Form2 10 11 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 12 'Form2.Save() '←× 13 hoge.Save() '←○ 14 End Sub 15End Class

投稿2015/06/25 10:53

Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tak1wa

2015/06/25 11:14

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

2015/06/25 12:19

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

2015/06/25 12:24

Publicにする必要があるのかこの部分的なソースでは判断できませんが、変数スコープは理解されていますか。 Dim NewMDIChild As New Form2() はローカル変数です。メンバ変数としてNewMDIChildを定義するだけで良いです。
Mogami_Tsuchika

2015/06/25 13: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 です。 すみません、メンバ変数というのがわからなくて、、、、、。
guest

0

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

投稿2015/06/25 10:51

takito

総合スコア3111

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mogami_Tsuchika

2015/06/25 11:03

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問