たびたびお世話になっております。
VB2005においてプロジェクト内のフォーム名(Windowsフォーム)の
一覧を取得する方法を知りたいのですがどなたか教えて下さい。
何をしたいかと言いますと
フォーム名の一覧を取得しコンボボックス等で指定された
フォームを開くというような動作をしたいのです。
宜しくお願い致します。
一応、こんな感じでしょうか。
リフレクションに頼った開発手法は、あまりお奨めはしませんけど。
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
ComboBox1.Items.Clear()
Dim T As Type = My.Forms.GetType()
For Each M As Reflection.MemberInfo In T.GetMembers()
If M.MemberType = Reflection.MemberTypes.Property Then
ComboBox1.Items.Add(M.Name)
End If
Next
End Sub
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
If ComboBox1.SelectedIndex >= 0 Then
Dim FormName As String = ComboBox1.SelectedItem.ToString()
Dim F As Form = DirectCast(CallByName(My.Forms, FormName, CallType.Method), Form)
F.Show()
End If
End Sub
魔界の仮面弁士さん早速ありがとうございます。
無事、必要としていた動作が実現出来ました。
ところでリフレクションに頼った開発手法を奨めれない
というのはどういった理由からでしょうか?
宜しかったら教えて頂けないでしょうか?
宜しくお願い致します。
(あ゜……。CallType.Method → CallType.Get かな)
> If M.MemberType = Reflection.MemberTypes.Property Then
> ComboBox1.Items.Add(M.Name)
> End If
実際には、コンボボックスに直接読み書きするのではなく、フォーム名称の一覧を
コレクションとして返したり、あるいは名称からインスタンスを取得できるような
「フォーム管理クラス」として設計した方が良いかな?
ついでに、フォームの一覧に含める/含めないを制御するために、各フォームに
識別用のカスタム属性を付加できるようにしてみるというのも面白いかも。
> ところでリフレクションに頼った開発手法を奨めれない
> というのはどういった理由からでしょうか?
えぇと、今回の案件に当てはまるかどうかは、また別問題です。すみません。
一般論として、用量を守らぬ薬の乱用は毒である、という話です。
リフレクションは、低レベル命令ゆえの非常に強力な機能を有しています。
(たとえば、Private レベルの変数を外部から読み書きできてしまうなど)
それゆえに、あまり多用すべき種類の機能では無いですし、使うのであれば、
記述したコードの意味を理解しておくべきであると思っています。
そして型名やプロパティ名による操作は、基本的にコードがコンパイル時に解決されないため、
速度面で劣る面があり、また、最適化ツールやリファクタリングツールなどの恩恵を受けにくく
なるなどのデメリットがあります。そしてそれ以上に、コードが直感的ではなくなり、
読みにくい物になりがちであるという理由もあります。私見ですけれども。
とはいえ、リフレクションを使った方が楽になれるような状況下であるならば、
リフレクションの利用に吝かではありません。実際、コンポーネント開発などを行うと、
Reflection 等に頼らざるを得ない場面にも少なからず遭遇したりしますしね。(^^;
魔界の仮面弁士さんありがとうございます。
まずは教えて頂いたコードやリフレクションの意味をよく理解したいと思います。
勉強になりました。
また、宜しくお願い致します。
ツイート | ![]() |