VB6(SP6)Windows98_SE、Visual Studio TM6.0(SP6)でやってます。
素人の趣味のプログラミングです。
良ければご指導お願いします。
デザイン用と再現用のプログラムを作成し、ユーザーが簡単なシュミレーションを作成出来るソフトを開発しています。
デザイン時に以下のメニューを作成しておいて、再現用プログラム側でファイルから配列に情報をロードして、ユーザー設定メニューを作成、表示します。
目的のメニューは作成出来たのですが、コーディングが冗長な気がします。
プロシージャの引数にコントロールの配列を渡す方法をネットの検索で知り、
試しましたがうまく行きません。
一応目的のメニューやツールバー(メニュー項目と同じ)等設定し、動作確認出来ていますが、気の利いたコーディングのご指導お願いします。
デザイン時のメニュー設定(名前)
mnuTitle(0)
|...mnuItm0(0)
mnuTitle(1)
|...mnuItem1(0)
mnuTitle(2)
|...mnuItem2(0)
mnuTitle(3)
|...mnuItem3(0)
mnuTitle(4)
|...mnuItem4(0)
'mnuTitle()はメニュータイトルControlの配列
'mnuItem0()〜mnuItem4()は各メニュータイトル毎のアイテムControlの配列
'usrItemCount() はmnuTitle()毎のアイテムの数
'usrMenuTitle() はmnuTitle()毎のキャプション
現状は以下の様なコードをメニュータイトルの数だけ繰返し書いています。
If usrItemCount(0) <> 0 Then
'メニュータイトルを変更
mnuTitle(0).Caption = usrMenuTitle(0)
'項目を追加する
For i = 1 To usrItemCount(0) - 1
Load mnuItem0(mnuItem0.Count)
'↑------の部分がネック----------
Next
'項目名を変える
For i = 0 To usrItemCount(0) - 1
mnuItem0(i).Caption = usrMenuItem(i).caption
'↑------の部分がネック-------------------------
Next
'メニューを表示する
mnuTitle(0).Visible = True
End If
すみません、書き忘れです。
usrMenuItem()はファイルからロードしたユーザーメニューの
必要項目の入った配列です。
その後オブジェクト変数でコントロール名を参照する事を思いつき、
試してるうちに変更前の状態に戻せなくなりパニクリましたが、
結局以下の様なコードに落ち着きました。
まだmnuItem0、mnuItem1.....mnuItem4の(0,1...4)を文字型変数か数値変数で
表せればFor〜Nextでもうちょっと簡潔に出来るのにとど素人の空想ですが。無理
でしょうね。
他に気の利いたコーディングがあればご指導お願いします。
Private Sub CsvRead()
'ユーザーのファイルメニュー操作により
'*.csvファイルから設定データを各配列変数に読込む
:
;
Dim mitem As Object
If usrItemCount(0) <> 0 Then
Set mitem = mnuItem0()
AddMenuItem mitem, 0
End If
If usrItemCount(1) <> 0 Then
Set mitem = mnuItem1()
AddMenuItem mitem, 1
End If
If usrItemCount(2) <> 0 Then
Set mitem = mnuItem2()
AddMenuItem mitem, 2
End If
If usrItemCount(3) <> 0 Then
Set mitem = mnuItem3()
AddMenuItem mitem, 3
End If
If usrItemCount(4) <> 0 Then
Set mitem = mnuItem4()
AddMenuItem mitem, 4
End If
Set mitem = Nothing
;
;
'メニュー、ツールバー表示
'ソース画像をロード
'ホットスポットを設定
'画面を更新、表示する
End Sub
Private Sub AddMenuItem(mitem As Object, tnum As Integer)
Dim i As Integer
Static n As Integer '追加したItem数の累計
'tnumタイトルナンバー(0〜4)
mnuTitle(tnum).caption = usrMenuTitle(tnum) 'タイトルをユーザー設定に変更
For i = 1 To usrItemCount(tnum) - 1
Load mitem(mitem.Count) 'タイトル毎のアイテム数を追加
Next
For i = 0 To usrItemCount(tnum) - 1
mitem(i).caption = usrMenuItem(i + n).caption 'アイテムのキャプションを変える
Next
mnuTitle(tnum).Visible = True 'メニューを表示する
n = n + usrItemCount(tnum) '追加アイテム数の累計を更新
End Sub
'サブメニュー用
Private Type ssubmenu1
caption As String
name As String
End Type
'メインメニュー用
Private Type smainmenu
caption As String
name As String
submenu1() As ssubmenu1
End Type
Dim menu(4) As smainmenu
こんなユーザー定義型を作って、設定データーを取り込めば
もっとスマートにいくような気がするのですが。
我龍院忠太さん、早速のご指導有難うございます。
プログラムするのは稀で、この様なメニューの作成も初めてです。
データファイルの読込みからメニュー、ツールバーや他の設定まで
同じプロシージャでコーディングしてました。
ご掲示のコードを参考に学習させて頂きます。
有難うございました。
追伸
メインメニューとはメニュータイトルで、サブメニューとはその下に出るアイテム(項目)のことですよね?
実はユーザー定義型の配列をそれぞれ容易してたのですが、ご掲示のコードとは逆というか、
サブメニュー(多分アイテム?)の方を主にして取扱っていました。
ど素人で時間掛かりますが、挑戦してみます。
我龍院忠太さん大変参考になりました。有難うございます。
ツイート | ![]() |