動的に作っていくメニューを作ろうと思います。
それ自体はできるんですけど、けっこういっぱい使うことになりそうなので、関数にしたいと思うんです。
でも、こういうふうに書くとうまく行かないみたい。
事前にメニューには、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以前でもできますね)
あ、コードにムダを見つけました^^;
本当はもともと、テキストをいちぎょうずつ読みこんで、リストにくわえてくのをコピーしただけなので^^;
(textが空っぽならばキャプションを非表示にしておくつもりでした)
昔、同じ様なことでつまづいた経験のあるこころです。
どうも、このmenu型がくせ者のようで、
配列ではないようなんですね。
メニューエディタで配列にした場合、menuを複数持つ、
別のデータ型みたいなのができるようなんですが
この正体が結局わからず、断念した記憶があります。
関数化するには、API等でメニューを生成していく方向で
検討してみてはどうでしょうか。
それって、Createmenuとかですか?
んー、サブクラスかはあんまりしたくないんですけど…。
(とくに開発中、エラーが起こっただけで気を使わなきゃいけないし、そうでなくてもよくページ違反で落ちるから、あんまり見たくない^^;)
コンパイルごとに保存してくれるから、データ面では問題ないんですけど…。
(でもサブクラスなんて必要あるのかな…。Createmenu単体使うだけならそんなことないかな…)
まあとりあえず、APIは使わずいろいろデータ型を入れてみます。
うまく行けばいいですね^^;
なんと、現行のままでうまく行きました!
"バリアント型"って、これだとちょっと掟破りっぽいですけど、
オブジェクト型でいいみたい。(結局掟破りや^^;)
ちなみにコードは下のとおりです。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
Object型かぁ・・・。
そういえば、それは試してなかったような・・・。
今度作るときは参考にさせて頂きます。
ツイート | ![]() |