DOBON.NET DOBON.NETプログラミング掲示板過去ログ

別フォーム同名コントロールを制御

環境/言語:[VB.NET Windows2000]
分類:[.NET]

はじめまして、お世話になります。

別々のフォーム上にある同名のコントロールを、
モジュールでひとつの関数で制御するコードを作成しています。
VB6ではうまくいっていたのですが.NETではエラーになってしまうので、
困っているのですが、どなたか良い方法をご存知でしたらご教授頂きたいと思います。

例↓(VB6です。)
フォームが二つあり両方にTextBox1が存在した場合。

public frmTest as From
Public Sub Test()
frmTest.TextBox1.Text = "テスト"
End Sub

※変数frmTestには呼び出す前に各フォームを入れておきます。
2004/09/13(Mon) 10:52:52 編集(投稿者)

■No6132に返信(keiさんの記事)
> はじめまして、お世話になります。
>
> 別々のフォーム上にある同名のコントロールを、
> モジュールでひとつの関数で制御するコードを作成しています。
> VB6ではうまくいっていたのですが.NETではエラーになってしまうので、
> 困っているのですが、どなたか良い方法をご存知でしたらご教授頂きたいと思います。
>
> 例↓(VB6です。)
> フォームが二つあり両方にTextBox1が存在した場合。
>
> public frmTest as From
> Public Sub Test()
> frmTest.TextBox1.Text = "テスト"
> End Sub
>
> ※変数frmTestには呼び出す前に各フォームを入れておきます。

# 「From」は「Form」の誤植と考えていいでしょうか?
# (Fromという名前のForm型ではないですよね?)

確かに、VB6ではFormという型でどのFormクラスにもアクセスできましたが、VB.NETではできません。
Formという型では抽象的すぎるからです。
例えば、Form1とForm2があるなら、それらは2つとも System.Windows.Forms.Form クラスを継承したクラスであり、かつ「型」として認識できる名前なので、

> Public frmTest As Form

を、Public frmTest As [Form1] または [Form2]としなければなりません。

それを考慮すると、Keiさんの方法では不可能です。
もし2つのFormで同様の動きをさせたいのなら、WithEventなどでイベントを統合するなりした方がいいでしょう。

また、クラスの概念を考えると、VB.NETではFormに属するコントロールを、
直接指定することはお勧めできません。

# 何故か、VB.NETでは規定がFriendになってますが...(初期値はPrivateのくせに)
■No6133に返信(java.lang.Nullpoさんの記事)
java.lang.Nullpoさん、返信ありがとうございます。

> FromはFormの誤植と考えていいでしょうか?
すみません・・タイプミスです。。

> 確かに、VB6ではFormという型を使えばアクセスできましたが、VB.NETではできません。
> 例えば、Form1とForm2があるなら、
>
>>public frmTest as From
>
> を、Public frmTest As [Form1] または [Form2]としなければなりません。

やはりできませんか・・
Public Text as System.Windows.Forms.TextBox
のようにコントロールの型を宣言してそこに入れる方法でやるのがベストかな??

まだまだいろいろ試してみたいと思います。ありがとうございました。
解決済み!
2004/09/17(Fri) 14:14:16 編集(投稿者)

# 解決済みになってますし、大分今更という気もするのですが‥‥(汗)

■No6132に返信(keiさんの記事)
> 別々のフォーム上にある同名のコントロールを、
> モジュールでひとつの関数で制御するコードを作成しています。
> VB6ではうまくいっていたのですが.NETではエラーになってしまうので、
> 困っているのですが、どなたか良い方法をご存知でしたらご教授頂きたいと思います。

 VB.NET でも同様に遅延バインディングを使用することは可能ですよ。
 ただ、
> public frmTest as Form
ではなく
 public frmTest as Object
のように宣言する必要があります。また、 TextBox1 の Modifiers プロパティを Public に
しなければなりません。
# もう一つ、 Option Strict を Off にしないといけないのですが、既定値は Off なので
# (自分で変えた覚えがなければ)気にしないでも大丈夫です。


 別のアプローチとして、 TextBox1 をパブリック(或いはフレンド) メンバとして持つ
Form0 を作成し、 Form1 、 Form2 は ( Form ではなく) Form0 を継承するようにする
というのもあります。この時は
 public frmTest as Form0
という宣言になりますね。


 また、リフレクションを使用する方法もあります。
 こちらのサイトの次の Tips 等が参考になるでしょうか。
# でもコードが大きく変わるから有用性は低いかなぁ。
# あ、遅延バインディングについても触れられてるので、一度目を通されることをお勧めします。

型のメンバを動的に呼び出す
http://dobon.net/vb/dotnet/programing/typeinvokemember.html



■No6134に返信(keiさんの記事)
> Public Text as System.Windows.Forms.TextBox
> のようにコントロールの型を宣言してそこに入れる方法でやるのがベストかな??

# 他掲示板ですが、少し前にこんなスレッドがありました。
# 言語は違いますけど、処理内容的に参考になる部分もあるかも知れません。

C#でForm以外のモジュールからのFormモジュールの呼び出し
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?mode=viewtopic&topic=14348&forum=7&start=0
私が思うに、正攻法としては、Formクラスを継承してTextBox1プロパティを持つ抽象クラスを作成し、TextBox1を持つべきフォームはすべてこの抽象クラスから派生したクラスを使用するという方法になりそうですが。
深山さん、管理人さん、返信ありがとうございます。

返事が遅くなって申し訳有りません。

いろいろ試してみたのですが、今のところは深山さんの仰っている
>public frmTest as Object
の方法で組んでます。

まだまだ勉強不足なので理解が難しいですが、
教えてくださったことを参考にさせていただき頑張ります。

お二人ともありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板