ユーザーコントロールにListプロパティを設置するには?

解決


Seraph  2005-05-10 00:29:20  No: 121528

お世話になります。

コンボボックスが配置されたユーザーコントロールを作成し、
画面デザイン時、ユーザーコントロールに内包するコンボボックスへ渡す為の
ListプロパティやItemDataプロパティをユーザーコントロールのプロパティウィンドウに
表示したいのですがうまく出来ません

実現方法や情報等ありましたらご教示ください。
よろしくお願いします。


特攻隊長まるるう  2005-05-13 21:42:35  No: 121529

難しいですねぇ。どうやったらプロパティに『(リスト)』の状態になるのか
調べ切れませんでした。共通処理がなんかありそうですけどねぇ…公開されて
いない内部的なものかもしれません。

代替案ですが、プロパティページにリストボックスでも貼り付けて、そちらを
制御すれば、それっぽいコントロールは作れそうです。…ってゆーか[VB6.0]
の話でいいんですよね?


マグ  2005-05-13 22:11:06  No: 121530

ユーザコントロールにあるのって、コンボボックスだけですか?
もし、それだけで、VB.NETならコンポーネントを作成し、
インスタンスにComboBoxを設定して、使うというのはどうでしょうか?


特攻隊長まるるう  2005-05-13 22:36:42  No: 121531

ユーザーコントロールを構成するコントロールを "内在コントロール" と呼びますが、
これらのコントロールは、通常はプライベートとして宣言されます。で、外部から
操作を許可するプロパティのみ公開する形にします。コントロールのインスタンス
そのものを公開(設定)する事は避けます。それにはもちろん理由があります。内在
コントロールをパブリック宣言で公開すると、利用者はそのコントロールを自由に
設定できます。これは一見便利そうに見えますが、ユーザーコントロール作成者の側
から見た時はどうでしょう?。作成者がユーザコントロール内で独自の設定をしてても、
それを無視して利用者が設定を変更できてしまいます。…この事は、場合によっては、
そのユーザコントロールを壊す事になります。この事は気をつけておかないといけません。


マグ  2005-05-13 23:26:13  No: 121532

>作成者がユーザコントロール内で独自の設定をしてても、
>それを無視して利用者が設定を変更できてしまいます。…この事は、場合によっては、
>そのユーザコントロールを壊す事になります。

たしかに壊してしまう可能性がありますね。
今まで、知りませんでした。

もし、プロパティウィンドウに任意に登録?みたいなものをしたかったら、
コンポーネントの場合は
Private a as Integer
Public Property a() as Integer
・・・・
・・・・
・・・・
・・・・
End Property

でプロパティウィンドウに追加できます。
もしかしたら、ユーザコントロールも同様にこれで追加できるかもしれません。


Seraph  2005-05-20 03:18:27  No: 121533

返事が遅くなり申し訳ありませんでした。
投稿から2〜3日はレスがつくのを監視していたのですが
反応が無かったのであきらめていました。
#ちなみに5/13は私の誕生日(=13日の金曜日)

解決には至らないもののご意見を参考にさせていただき
プログラミングを進めていきたいと思います。

ありがとうございました。


魔界の仮面弁士  2005-05-20 04:32:29  No: 121534

とりあえず、下記の 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


Seraph  2005-05-21 00:15:17  No: 121535

特攻隊長まるるうさん、マグさん、魔界の仮面弁士さん
ありがとうございます。

結論から言うと「あきらめました」(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

#おもいっきりソース載せちゃってすいません。

以上のような方法で実装することにしました。
こうしてみるとコード量は増えたものの使い勝手は
かえっていいかもと思えてきました。

色々アドバイスありがとうございました。


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

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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