最近、Linux上でプログラミングせずになぜかVisual StudioでVB.NETを使う事が多いので、Linux方面で書くことがあまりないです。なので、今日はVB.NETで動的にフォーム(GUI)を生成する方法をまとめます。
VB.NETで基本となるウィンドウはMeで指定できます。
これはJavaScriptで言うところのWindow.documentオブジェクトみたいなもんですね。
構造自体は、HTMLもJAVA(androidは画面をXMLで指定しますね)もVB.NETも同じで基本的にはレイアウト用のパネルコンポーネントを並べるだけです。言わばHTMLのテーブルレイアウトです。
androidプログラミングだと、XMLで定義する方法とJAVAで定義する方法の2つがありましたが、VB.NETでは全てプログラミングで指定します。Visual StudioにはGUIのエディターが搭載されていますが、あれが出力する最終の成果物は単なるVBのソースコードです。Form1.Designer.vbみたいな名前になっていますのでテキストエディタで開いてみましょう。このファイルはVisual Studioからは直接触れないようになっています。
では肝心の定義の仕方ですが
GUIオブジェクト(Panel、FlowLayoutPanel、TabControlなど)は、controlsオブジェクトを持ちます。このcontrolsオブジェクトに内包させたいオブジェクトをaddしていくだけです。
実際にはSizeやLocation、Marginも自前で設定する必要があります。
FlowLayoutPanelは自動で整列してくれるのでとても便利です。marginをきちんと設定してどんどん利用しましょう。
もちろん、更にFlowLayoutPanelをネストすることも可能です。
起動してみるとこのような感じになります。
FlowLayoutPanel同士がネストされている様子は背景色を変えてみるとよく分かります。
どんなに複雑なレイアウトも入れ子にするだけで簡単に生成できる動的生成ですが、いかがでしょうか。Visual Studioのフォームエディターが結構優秀なので、見た目に分かりにくい動的生成はかなり大変かも知れませんが、実装上TextBoxを不特定多数配置することになったとか、使い道はきっとあると思います。
今回私は、テキストボックスをレイアウト毎使いまわすためにやり方を調べました。
久しぶりにWindowsでプログラミングしましたが、Visual Studioはよくできていますね。キーボードショートカットさえ覚えれば、そこそこ使えると思いましたがそれが一番問題です…。:-P
VB.NETで基本となるウィンドウはMeで指定できます。
これはJavaScriptで言うところのWindow.documentオブジェクトみたいなもんですね。
構造自体は、HTMLもJAVA(androidは画面をXMLで指定しますね)もVB.NETも同じで基本的にはレイアウト用のパネルコンポーネントを並べるだけです。言わばHTMLのテーブルレイアウトです。
androidプログラミングだと、XMLで定義する方法とJAVAで定義する方法の2つがありましたが、VB.NETでは全てプログラミングで指定します。Visual StudioにはGUIのエディターが搭載されていますが、あれが出力する最終の成果物は単なるVBのソースコードです。Form1.Designer.vbみたいな名前になっていますのでテキストエディタで開いてみましょう。このファイルはVisual Studioからは直接触れないようになっています。
では肝心の定義の仕方ですが
GUIオブジェクト(Panel、FlowLayoutPanel、TabControlなど)は、controlsオブジェクトを持ちます。このcontrolsオブジェクトに内包させたいオブジェクトをaddしていくだけです。
Dim Panel1 As FlowLayoutPanel = New FlowLayoutPanel()
Dim btn1 As Button = New Button()
Panel1.Controls.Add(btn1)
実際にはSizeやLocation、Marginも自前で設定する必要があります。
Dim Panel1 As FlowLayoutPanel = New FlowLayoutPanel()
Dim btn1 As Button = New Button()
Dim btn2 As Button = New Button()
Panel1.Size = New Size(120, 40)
Panel1.FlowDirection = FlowDirection.LeftToRight
btn1.Text = "OK"
btn2.Text = "Cancel"
btn1.Size = New Size(32, 16)
btn2.Size = New Size(32, 16)
btn1.Margin = New Padding(8, 8, 8, 8)
btn2.Margin = New Padding(8, 8, 8, 8)
Panel1.Controls.Add(btn1)
Panel1.Controls.Add(btn2)
FlowLayoutPanelは自動で整列してくれるのでとても便利です。marginをきちんと設定してどんどん利用しましょう。
もちろん、更にFlowLayoutPanelをネストすることも可能です。
Dim Panel1 As FlowLayoutPanel = New FlowLayoutPanel()
Dim btn1 As Button = New Button()
Dim btn2 As Button = New Button()
Dim Panel2 As FlowLayoutPanel = New FlowLayoutPanel()
Dim btn3 As Button = New Button()
Dim btn4 As Button = New Button()
Dim btnSize1 As Size = New Size(80, 24)
Panel1.Size = New Size(400, 200)
Panel1.FlowDirection = FlowDirection.LeftToRight
btn1.Text = "OK"
btn2.Text = "Cancel"
btn1.Size = New Size(64, 24)
btn2.Size = New Size(64, 24)
btn1.Font = New Font("MS UI GOTHIC", 9)
btn1.Margin = New Padding(8, 8, 8, 8)
btn2.Margin = New Padding(8, 8, 8, 8)
Panel2.Size = New Size(100, 100)
Panel2.FlowDirection = FlowDirection.TopDown
Panel2.Margin = New Padding(0)
btn3.Text = "hoge"
btn4.Text = "huga"
btn3.Size = btnSize1
btn4.Size = btnSize1
btn3.Margin = New Padding(8, 8, 8, 8)
btn4.Margin = New Padding(8, 8, 8, 8)
Panel2.Controls.Add(btn3)
Panel2.Controls.Add(btn4)
Panel1.Controls.Add(btn1)
Panel1.Controls.Add(btn2)
Panel1.Controls.Add(Panel2)
Me.Controls.Add(Panel1)
起動してみるとこのような感じになります。
FlowLayoutPanel同士がネストされている様子は背景色を変えてみるとよく分かります。
どんなに複雑なレイアウトも入れ子にするだけで簡単に生成できる動的生成ですが、いかがでしょうか。Visual Studioのフォームエディターが結構優秀なので、見た目に分かりにくい動的生成はかなり大変かも知れませんが、実装上TextBoxを不特定多数配置することになったとか、使い道はきっとあると思います。
今回私は、テキストボックスをレイアウト毎使いまわすためにやり方を調べました。
久しぶりにWindowsでプログラミングしましたが、Visual Studioはよくできていますね。キーボードショートカットさえ覚えれば、そこそこ使えると思いましたがそれが一番問題です…。:-P


コメント
コメントを投稿