メニューを動的作成する関数?


たかみちえ  URL  2001-08-20 23:01:00  No: 74777  IP: [192.*.*.*]

動的に作っていくメニューを作ろうと思います。
それ自体はできるんですけど、けっこういっぱい使うことになりそうなので、関数にしたいと思うんです。
でも、こういうふうに書くとうまく行かないみたい。
事前にメニューには、Indexを指定してあります。
ので、関数にしなければ、あのままでメニューはロードできるはずです。
(「配列を指定して」とコンパイルエラーが出ます)

Public Sub Loadmenu(menu() as menu,Section as string)
    For i = 0 To UBound(Keylist(Section))
        Load menu(i)
        menu(i).Visible = False
        Line Input #1, Text
        menu(i).Caption = Text
        menu(i).Visible = True
        If menu(i).Caption = "" Then menu(i).Visible = False
    Loop
End Sub

  あ、えっと、中の関数、Keylistは、iniファイルのセクションの中身のキーをナル区切りで区切って配列にする関数です。
(そういえばSplit関数がなくても、Layer-8に代替関数が公開されてました、VB5以前でもできますね)

編集 削除
たかみちえ  2001-08-20 23:03:39  No: 74778  IP: [192.*.*.*]

あ、コードにムダを見つけました^^;
本当はもともと、テキストをいちぎょうずつ読みこんで、リストにくわえてくのをコピーしただけなので^^;
(textが空っぽならばキャプションを非表示にしておくつもりでした)

編集 削除
こころ  URL  2001-08-21 01:30:34  No: 74779  IP: [192.*.*.*]

昔、同じ様なことでつまづいた経験のあるこころです。
どうも、このmenu型がくせ者のようで、
配列ではないようなんですね。

メニューエディタで配列にした場合、menuを複数持つ、
別のデータ型みたいなのができるようなんですが
この正体が結局わからず、断念した記憶があります。

関数化するには、API等でメニューを生成していく方向で
検討してみてはどうでしょうか。

編集 削除
たかみちえ  2001-08-22 08:41:38  No: 74780  IP: [192.*.*.*]

それって、Createmenuとかですか?
んー、サブクラスかはあんまりしたくないんですけど…。
(とくに開発中、エラーが起こっただけで気を使わなきゃいけないし、そうでなくてもよくページ違反で落ちるから、あんまり見たくない^^;)
コンパイルごとに保存してくれるから、データ面では問題ないんですけど…。
(でもサブクラスなんて必要あるのかな…。Createmenu単体使うだけならそんなことないかな…)

  まあとりあえず、APIは使わずいろいろデータ型を入れてみます。
うまく行けばいいですね^^;

編集 削除
たかみちえ  2001-08-22 12:31:15  No: 74781  IP: [192.*.*.*]

なんと、現行のままでうまく行きました!
"バリアント型"って、これだとちょっと掟破りっぽいですけど、
オブジェクト型でいいみたい。(結局掟破りや^^;)
ちなみにコードは下のとおりです。Gettitleとかはあんまり気にしないで^^;
Public Enum LoadmenumenuStyle
    Filepath = 0
    pathandgettitleext = 1
    Freestring = 2
End Enum
Public Sub Loadmenu(menu As Object, Section As String, Optional Style As LoadmenumenuStyle = Freestring)
    On Error Resume Next
    Dim i As Integer
    For i = 0 To UBound(Split(Keylist(Section), Chr(0)))
        Load menu(i)
        Select Case Style
        Case Filepath: menu(i).Caption = GetTitle(Inir(Section, i + 1))
        Case pathandgettitleext: menu(i).Caption = GetTitleExt(Inir(Section, i + 1))
        Case Freestring: menu(i).Caption = Inir(Section, i + 1)
        End Select
        If menu(i).Caption = "" Then menu(i).Visible = False Else menu(i).Visible = True
    Next
End Sub

編集 削除
こころ  URL  2001-08-23 01:16:36  No: 74782  IP: [192.*.*.*]

Object型かぁ・・・。
そういえば、それは試してなかったような・・・。
今度作るときは参考にさせて頂きます。

編集 削除