お世話になります。
コンボボックスが配置されたユーザーコントロールを作成し、
画面デザイン時、ユーザーコントロールに内包するコンボボックスへ渡す為の
ListプロパティやItemDataプロパティをユーザーコントロールのプロパティウィンドウに
表示したいのですがうまく出来ません
実現方法や情報等ありましたらご教示ください。
よろしくお願いします。
難しいですねぇ。どうやったらプロパティに『(リスト)』の状態になるのか
調べ切れませんでした。共通処理がなんかありそうですけどねぇ…公開されて
いない内部的なものかもしれません。
代替案ですが、プロパティページにリストボックスでも貼り付けて、そちらを
制御すれば、それっぽいコントロールは作れそうです。…ってゆーか[VB6.0]
の話でいいんですよね?
ユーザコントロールにあるのって、コンボボックスだけですか?
もし、それだけで、VB.NETならコンポーネントを作成し、
インスタンスにComboBoxを設定して、使うというのはどうでしょうか?
ユーザーコントロールを構成するコントロールを "内在コントロール" と呼びますが、
これらのコントロールは、通常はプライベートとして宣言されます。で、外部から
操作を許可するプロパティのみ公開する形にします。コントロールのインスタンス
そのものを公開(設定)する事は避けます。それにはもちろん理由があります。内在
コントロールをパブリック宣言で公開すると、利用者はそのコントロールを自由に
設定できます。これは一見便利そうに見えますが、ユーザーコントロール作成者の側
から見た時はどうでしょう?。作成者がユーザコントロール内で独自の設定をしてても、
それを無視して利用者が設定を変更できてしまいます。…この事は、場合によっては、
そのユーザコントロールを壊す事になります。この事は気をつけておかないといけません。
>作成者がユーザコントロール内で独自の設定をしてても、
>それを無視して利用者が設定を変更できてしまいます。…この事は、場合によっては、
>そのユーザコントロールを壊す事になります。
たしかに壊してしまう可能性がありますね。
今まで、知りませんでした。
もし、プロパティウィンドウに任意に登録?みたいなものをしたかったら、
コンポーネントの場合は
Private a as Integer
Public Property a() as Integer
・・・・
・・・・
・・・・
・・・・
End Property
でプロパティウィンドウに追加できます。
もしかしたら、ユーザコントロールも同様にこれで追加できるかもしれません。
返事が遅くなり申し訳ありませんでした。
投稿から2〜3日はレスがつくのを監視していたのですが
反応が無かったのであきらめていました。
#ちなみに5/13は私の誕生日(=13日の金曜日)
解決には至らないもののご意見を参考にさせていただき
プログラミングを進めていきたいと思います。
ありがとうございました。
とりあえず、下記の No.5389 & No.5392 を参考に。
http://www.bcap.co.jp/hanafusa/VBdengon/log_5351to5400.htm
# 問題解決の手助けになるかどうかは保証しませんけど。
http://www.vbaccelerator.com/home/VB/Code/Controls/UserControl_OLE_Extensions/IPerPropertyBrowse/article.asp
特攻隊長まるるうさん、マグさん、魔界の仮面弁士さん
ありがとうございます。
結論から言うと「あきらめました」(T-T)
代わりに次のような方法で同様の結果を得ることが出来ましたので
報告致します。
目的は、フォームデザイン時、ユーザーコントロールのコンボボッ
クス内容を設定するということ
1、まずパブリックプロパティでList及びItemDataを作成します。
属性はどちらもStringです。
キモは設定したい項目をセミコロンで区切って設定することです。
ex.)"aaa;bbb;ddd" , "0;1;2"
2、受け取った値をプロパティ用プライベート変数m_List、m_ItemData
に保存します。
3、次のような関数で内在コントロールのコンボボックスに設定します。
Private Function Set_List() As Boolean
Const conSTR_SEMICOLON As String = ";"
Const conSTR_ZERO As String = "0"
Dim strBuf_List() As String
Dim strBuf_ItemData() As String
Dim i As Integer
Set_List = False
bIsPaint = True '意図しないClickEventの回避用
If Trim(m_List) = vbNullString Then
m_ItemData = vbNullString
GoTo EXT
End If
strBuf_List() = Split(m_List, conSTR_SEMICOLON)
strBuf_ItemData() = Split(m_ItemData, conSTR_SEMICOLON)
ReDim Preserve strBuf_ItemData(UBound(strBuf_List()))
For i = LBound(strBuf_ItemData()) To UBound(strBuf_ItemData())
strBuf_ItemData(i) = Trim(strBuf_ItemData(i))
If Not IsNumeric(strBuf_ItemData(i)) Then
strBuf_ItemData(i) = conSTR_ZERO
End If
Next
With Combo1
.Clear
For i = LBound(strBuf_List()) To UBound(strBuf_List())
.AddItem strBuf_List(i), i
.ItemData(i) = CLng(strBuf_ItemData(i))
Next
.ListIndex = m_ListIndex
End With
Set_List = True
EXT:
bIsPaint = False
End Function
#おもいっきりソース載せちゃってすいません。
以上のような方法で実装することにしました。
こうしてみるとコード量は増えたものの使い勝手は
かえっていいかもと思えてきました。
色々アドバイスありがとうございました。
ツイート | ![]() |