動的に作成したMDI子フォームのTextboxの内容を保存するには?

タグの編集
投稿者 winvis  (学生) 投稿日時 2009/11/2 01:37:25
*まず、最初に
ほぞんなどのメインメニューは、親ウインドウにあります
TextBox1は、MDI子ウインドウにあります(ChlidFormが名前です)
この子ウインドウは、動的に作成されたものです
VB2008 Expressです
*ここから質問
Dim cForm As Form = Me.ActiveMdiChild
IO.File.WriteAllText(FileName, cForm.TextBox1.Text, System.Text.Encoding.GetEncoding("Shift-JIS"))
と、エラー(Textbox1は、system.windows.form.formのメンバではありません)が出るのですが
どうすればいいですか
数日ネットで探したんですがいい解決策が見つかりませんでした
投稿者 るきお  (社会人) 投稿日時 2009/11/2 02:24:48
こんにちは。

TextBox1はwinvisさんが追加したものであって、マイクロソフトが用意しているFormクラスのメンバーではありません。
だから、cForm.TextBox1はエラーです。
(cFormがForm型だからです。なぜcFormがForm型かというとDim cForm As Formとしているからです。)

そのフォームをChildFormと名づけているのであれば
Dim cForm AS ChildForm …
でうまくいくはずです。

ただし、Option Strict Onにしている場合はこれだと暗黙の型変換でエラーになってしまうので、自分で明示的に型変換を指定して次のようにする必要があります。
Dim cForm As ChildForm = DirectCast(Me.ActiveMdiChild, ChildForm)

この書き方なら万全なのでよくわからなければこのように書いておけばよいです。

ちなみに私は面倒なのでOption Strict はOnにしないでばしばし暗黙の型変換をしています。
投稿者 winvis  (学生) 投稿日時 2009/11/2 03:51:58
回答ありがとうございます
Dim cForm AS ChildFormだと、型ChildFormが定義されていませんと出てしまいます
動的に、作成するフォームだからでしょうか?
Option Strict Onは、offです
投稿者 るきお  (社会人) 投稿日時 2009/11/2 05:40:15
>Dim cForm AS ChildFormだと、型ChildFormが定義されていませんと出てしまいます
>動的に、作成するフォームだからでしょうか?
いいえ。違うと思います。

最初の書き込みで
>TextBox1は、MDI子ウインドウにあります(ChlidFormが名前です)
とあるので、フォームの名前がChildFormだと思いましたが、
違うのであれば実際に自分でつけた名前を指定してください。
投稿者 トマト  (小学生) 投稿日時 2009/11/3 21:31:34
>違うのであれば実際に自分でつけた名前を指定してください。
わかりやすくするとChlidFormのソース表示の一行目の
Public Class (この部分)

が型名(クラス名)です。