プロシージャにコントロールの配列を渡すには

解決


しろうと  2005-09-28 08:29:57  No: 125776

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


しろうと  2005-09-28 08:40:36  No: 125777

すみません、書き忘れです。 
usrMenuItem()はファイルからロードしたユーザーメニューの
必要項目の入った配列です。


しろうと  2005-09-28 18:32:53  No: 125778

その後オブジェクト変数でコントロール名を参照する事を思いつき、
試してるうちに変更前の状態に戻せなくなりパニクリましたが、
結局以下の様なコードに落ち着きました。

まだ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


我龍院忠太  2005-09-28 18:55:23  No: 125779

'サブメニュー用
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
こんなユーザー定義型を作って、設定データーを取り込めば
もっとスマートにいくような気がするのですが。


しろうと  2005-09-28 19:41:47  No: 125780

我龍院忠太さん、早速のご指導有難うございます。
プログラムするのは稀で、この様なメニューの作成も初めてです。
データファイルの読込みからメニュー、ツールバーや他の設定まで
同じプロシージャでコーディングしてました。
ご掲示のコードを参考に学習させて頂きます。
有難うございました。


しろうと  2005-09-28 20:17:03  No: 125781

追伸
メインメニューとはメニュータイトルで、サブメニューとはその下に出るアイテム(項目)のことですよね?
実はユーザー定義型の配列をそれぞれ容易してたのですが、ご掲示のコードとは逆というか、
サブメニュー(多分アイテム?)の方を主にして取扱っていました。
ど素人で時間掛かりますが、挑戦してみます。
我龍院忠太さん大変参考になりました。有難うございます。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加