C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: メニューバーをコンパクトに書く方法


(過去ログ 138 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■81006 / inTopicNo.1)  メニューバーをコンパクトに書く方法
  
□投稿者/ すき家 (1回)-(2016/08/24(Wed) 18:43:15)

分類:[.NET 全般] 



VBで
http://blog.hiros-dot.net/?p=1982
このページに書かれている方法を使って
メニューバーを作りたいのですが、
項目が多い場合に


Dim menuFile As New ToolStripMenuItem 'ファイル(&F)
Dim menuFileNew As New ToolStripMenuItem '新規作成(&N)


'項目の設定
menuFile.Text = "ファイル(&F)"
menuFileNew.Text = "新規作成(&N)"

'項目に子項目を追加する
menuFile.DropDownItems.Add(menuFileNew)

'項目をメニューに追加する
MenuStrip1.Items.Add(menuFile)

というものをたくさん書く必要があります。


menuFileやmenuFileNewを配列として宣言したいのですが
As Newで宣言した変数は配列にできないそうです。
これはクラスなどを利用することでなんとか配列にできないでしょうか?





引用返信 編集キー/
■81014 / inTopicNo.2)  Re[1]: メニューバーをコンパクトに書く方法
□投稿者/ 真田昌幸 (51回)-(2016/08/25(Thu) 09:06:52)
No81006 (すき家 さん) に返信
> As Newで宣言した変数は配列にできないそうです。
> これはクラスなどを利用することでなんとか配列にできないでしょうか?

そんなことはありません。

http://jeanne.wankuma.com/tips/vb.net/array/new.html

とかを読みましょう。
引用返信 編集キー/
■81015 / inTopicNo.3)  Re[1]: メニューバーをコンパクトに書く方法
□投稿者/ shu (907回)-(2016/08/25(Thu) 09:28:04)
No81006 (すき家 さん) に返信

真田昌幸さんの提示されたリンク先にあるように配列することは可能です。
ただ動的にメニューつくるなら配列よりはList(Of ToolStripMenuItem)を使用された方が
使い勝手がよいかと思います。

また配列やリストにしたとしても各メニューの機能はそれぞれ異なるのでクリック時の処理は
それぞれ記述する必要があります。
引用返信 編集キー/
■81016 / inTopicNo.4)  Re[2]: メニューバーをコンパクトに書く方法
□投稿者/ 真田昌幸 (52回)-(2016/08/25(Thu) 09:56:52)
そもそも、画面デザインでの設定を使わず、
ソースでメニューを作っている理由はなんでしょう?

http://dobon.net/vb/dotnet/control/menustrip.html

とかにも確かにやり方の一つとして、ソースですべて書く方法も載ってますが、

標準で用意されているコントロールは画面デザイン通した方が
生産性も品質も上がる気がします。

.Net Frameworkになる前からVB(というよりVisual Stuido)はRAD開発環境なのですから。
基本はその良さを生かした方がよろしいかと思います。

ソースですべて書く場合の方法論は、
すき家 さんが書いているように色々とあると思います。
引用返信 編集キー/
■81031 / inTopicNo.5)  Re[3]: メニューバーをコンパクトに書く方法
□投稿者/ すき家 (3回)-(2016/08/25(Thu) 16:43:57)
メニューバーにプログラム内の変数を表示するようにしたいため
ソースで表示するようにしています、

もし画面デザインでプログラム内の変数を使う方法があれば教えていただけますでしょうか?
 
引用返信 編集キー/
■81032 / inTopicNo.6)  Re[4]: メニューバーをコンパクトに書く方法
□投稿者/ すき家 (5回)-(2016/08/25(Thu) 17:14:02)
shu さんのご回答通りListを試してみたのですが

Dim menuFile00 As New List(Of ToolStripMenuItem)

menuFile00.Add("ビルド日時")
menuFile00.Add(Format(Now, "yyyy年MM月dd日HH時mm分ss秒"))

としてみてもエラーが出てしまいます。
menuFile00.Text.Add("ビルド日時")
menuFile00.Text.Add(Format(Now, "yyyy年MM月dd日HH時mm分ss秒"))

とやってもエラーが出ます。どうすれば良いでしょうか?

真田昌幸 さんのご回答通り、配列でやろうとしてみました。



Dim menuFile0(,) = New ToolStripMenuItem(1, 1) {}


menuFile0(0, 0).Text = "ビルド日時"
menuFile0(0, 1).Text = Format(Now, "yyyy年MM月dd日HH時mm分ss秒")


オブジェクト参照がオブジェクトインスタンスに設定されていません。
というエラーがでてビルドすることができません。
どうすれば良いでしょうか?
 
引用返信 編集キー/
■81035 / inTopicNo.7)  Re[5]: メニューバーをコンパクトに書く方法
□投稿者/ 魔界の仮面弁士 (843回)-(2016/08/25(Thu) 17:40:26)
No81032 (すき家 さん) に返信
> Dim menuFile00 As New List(Of ToolStripMenuItem)
この場合、menuFile00 は、ToolStripMenuItem 型に対するコレクションとなります。


> menuFile00.Add("ビルド日時")
menuFile00 に String 値を Add していますね。

Add するのは文字列のインスタンスではなく、
ToolStripMenuItem のインスタンスですよ。

例:
 menuFile00.Add(New ToolStripMenuItem("ビルド日時"))



> Dim menuFile0(,) = New ToolStripMenuItem(1, 1) {}
ちなみに
 Dim menuFile0(1, 1) As ToolStripMenuItem
と書いても同じ結果が得られます。

で、この場合は menuFile0(0, 0) 〜 menuFile0(1, 1) までの
4 つの要素を持つ 2 次元配列を用意しているだけであり、
それぞれの要素の中身は、まだ Nothing の状態です。


> menuFile0(0, 0).Text = "ビルド日時"
これは要するに、
 Dim txt As TextBox
 txt.Text = "あいうえお"
がエラーになるのと同じ理由です。

menuFile0(0, 0) や txt が Nothing のままなので、
.Text プロパティへのアクセスが失敗しています。

たとえば上記の例であれば、
 Dim txt As TextBox
 txt = Me.TextBox1 'デザイン時に作成したインスタンスをセット
 txt.Text = "あいうえお"
あるいは
 Dim txt As TextBox
 txt = New TextBox() '実行時にインスタンスを作成
 txt.Text = "あいうえお"
 Me.Controls.Add(txt)
のように、TextBox のインスタンスをセットしてからでないと
.Text プロパティを読み書きする事はできません。


配列の場合も同様です。

現在は各要素が Nothing のままなので、それぞれの要素に
ToolStripMenuItem クラス(または ToolStripMenuItem の派生クラス)の
インスタンスをセットしておく必要があります。

 menuFile0(0, 0) = New ToolStripMenuItem()
 menuFile0(0, 0).Text = "ビルド日時"
引用返信 編集キー/
■81037 / inTopicNo.8)  Re[6]: メニューバーをコンパクトに書く方法
□投稿者/ すき家 (6回)-(2016/08/25(Thu) 17:49:26)
魔界の仮面弁士 さん ありがとうございます。


配列を使いたい場合、
 menuFile0(0, 0) = New ToolStripMenuItem()
 menuFile0(0, 1) = New ToolStripMenuItem()
 menuFile0(1, 0) = New ToolStripMenuItem()
 menuFile0(1, 1) = New ToolStripMenuItem()
・・・
のようにそれぞれの要素に対して宣言する必要があるのでしょうか?
配列をまとめて宣言できる方法があれば教えていただけないでしょうか?
 
引用返信 編集キー/
■81038 / inTopicNo.9)  Re[4]: メニューバーをコンパクトに書く方法
□投稿者/ 真田昌幸 (53回)-(2016/08/25(Thu) 17:52:38)
No81031 (すき家 さん) に返信
> メニューバーにプログラム内の変数を表示するようにしたいため
> ソースで表示するようにしています、
>
> もし画面デザインでプログラム内の変数を使う方法があれば教えていただけますでしょうか?
>  

別にすべてをデザインでやれとは言ってません。

http://dobon.net/vb/dotnet/control/menustrip.html

の「自分でコードを書く方法」でいくと、
通常.Designer.vbに記載されるコードを全部自分で書くことになるので、
.vbのコード量も増えるしバグの温床になりやすいと言っているだけです。

.Designer.vbはMSの技術者が散々テスト・検証をして結果のコードがかかれるわけだから、
一般論として、プログラマが各コードより品質は高いと思います。

一旦コレクションとか基本部分のCreateは画面デザインでやっておいて、
メニュー名称とか可変で変えたいところだけ画面起動時等で書くようにしてはどうですか?
もっと汎用的にするなら、変数の値自体を、iniファイルとかXMLから読むようにするとか。

引用返信 編集キー/
■81039 / inTopicNo.10)  Re[4]: メニューバーをコンパクトに書く方法
□投稿者/ 魔界の仮面弁士 (844回)-(2016/08/25(Thu) 18:34:44)
No81031 (すき家 さん) に返信
> もし画面デザインでプログラム内の変数を使う方法があれば教えていただけますでしょうか?

画面デザインでプログラム内の変数を使うのではなく、
プログラムから画面デザインのメニューを操作します。


'MenuStrip に、String または ToolStripItem を追加する
Me.MenuStrip1.Items.Add("項目1")
Me.MenuStrip1.Items.Add("項目2")

'ToolStripItem のテキストを書き変える
Me.ToolStripMenuItem1.Text = "アイテム1"
Me.ToolStripMenuItem2.Text = "アイテム2"



追加した項目のイベントは、親要素で拾えます。

Private Sub MenuStrip1_ItemClicked(sender As System.Object, e As System.Windows.Forms.ToolStripItemClickedEventArgs) Handles MenuStrip1.ItemClicked
  '「項目1」「項目2」など、最上位項目のクリックが拾える
  Label1.Text = e.ClickedItem.Text
End Sub

Private Sub ToolStripMenuItem2_Click(sender As Object, e As System.EventArgs) Handles ToolStripMenuItem2.Click
  'ToolStripMenuItem2 自身のクリックを拾える
  Label2.Text = "ToolStripMenuItem2"
End Sub

Private Sub ToolStripMenuItem2_DropDownItemClicked(sender As System.Object, e As System.Windows.Forms.ToolStripItemClickedEventArgs) Handles ToolStripMenuItem2.DropDownItemClicked
  'ToolStripMenuItem2 の子階層である「アイテム2」などのクリックを拾える
  Label3.Text = e.ClickedItem.Text
End Sub


大抵の場合、上記の方法で十分に対応できると思います。


もしも、より複雑なメニュー構成…たとえば子階層だけでなく、
孫階層まで動的に作成する必要がある場合は、
ToolStripMenuItem を必要な数だけ New していき、
ToolStripMenuItem の DropDown.Items に Add していくことで
下位の階層に追加することになります。


'ToolStripItem のサブメニューを作りなおす
Me.ToolStripMenuItem2.DropDown.Items.Clear()
Me.ToolStripMenuItem2.DropDown.Items.Add("サブアイテム1")
Me.ToolStripMenuItem2.DropDown.Items.Add("サブアイテム2")


'子要素が必要な場合は、DropDownItems に Add していく
Dim menu3 As New ToolStripMenuItem("項目3")
Dim menu4 As New ToolStripMenuItem("項目3−1")
Dim menu5 As New ToolStripMenuItem("項目3−1−1")
menu4.BackColor = Color.Cyan
menu5.Checked = True
menu4.DropDownItems.Add(menu5)
menu3.DropDownItems.Add(menu4)
Me.MenuStrip1.Items.Add(menu3)


上記では ToolStripMenuItem を Add していますが、
分割線を表す ToolStripSeparator であるとか、
ToolStripComboBox 、ToolStripTextBox についても、
同様に動的に生成することができます。


なお、深い階層まで動的に作成した場合に、クリック時のイベントを
拾いたいのであれば、AddHandler ステートメントを試してみて下さい。
引用返信 編集キー/
■81040 / inTopicNo.11)  Re[7]: メニューバーをコンパクトに書く方法
□投稿者/ すき家 (7回)-(2016/08/25(Thu) 18:36:16)
= {{New ToolStripMenuItem(), New ToolStripMenuItem()}, {New ToolStripMenuItem(), New ToolStripMenuItem()}}

でうまくいきました。
 
引用返信 編集キー/
■81041 / inTopicNo.12)  Re[5]: メニューバーをコンパクトに書く方法
□投稿者/ すき家 (9回)-(2016/08/25(Thu) 18:45:05)

ありがとうございます。

配列での操作の仕方が分かりました。
 
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -