- PR -

拡張プロバイダの実装について

1
投稿者投稿内容
ぱむ。
会議室デビュー日: 2006/07/16
投稿数: 3
投稿日時: 2006-07-21 13:07
はじめて投稿させて頂きます。 ぱむ。と申します。

VB6.0でしばらく主に業務アプリを開発してきたのですが、
この度、開発環境をVS2005(VB)に移行することになり、試行錯誤の毎日を過ごしております。

早速ですが、VB6.0で開発時、コントロールのフォーカス取得の際に、
入力のガイダンス(『数字9桁で入力してください。』…等)を、ステータスバーに表示していました。
それぞれのコントロールのGotFocusとLostFocusのイベントに、
ステータスバーにコメントを表示/クリアする共通処理をCallするコードを記述していたのですが、
これがかなり大変でした。

そこで今回、VS2005(VB)移行にあたり、『拡張プロバイダを実装』するという方法があることを知り、
StatusTripにこの機能が実装できればと思いつつ、
MSDNライブラリの『方法:HelpLabel拡張プロバイダを実装する』のサンプルを見ながら、勉強をしているところです。
とりあえず、試してみようということで、HelpLabelコントロールを作成し、(ほとんどコピペですが)
ビルドは成功しました。
その後、新しいプロジェクトでWindowsアプリケーションを選択、
ツールボックスに先ほど作成したHelpLabelコントロールを追加し、フォームに追加したのですが、
以下のコンパイルエラーになってしまいます。
'TrackSelection' は 'Microsoft.Samples.WinForms.Vb.HelpLabel.HelpLabel' のメンバではありません。

もともとのHelpLabelコントロールのソースの内容がほとんど理解できていないので(というか出来ませんでした)、
エラーの対処方法が全く分かりません。
何卒ご教授願えればと思います。

また、これ以外に『拡張プロバイダ』に関するサンプル等ありましたら、ご紹介頂きたいと思います。
いろいろ探してはみたのですが、見当たりませんでした。
ゆくゆくはStatusTripに実装させていきたいので、そこらへんのサンプルもあれば…と思います。
図々しいお願いですが、どうぞ宜しくお願いします。

追記:MSDNライブラリの『方法:HelpLabel拡張プロバイダを実装する』へのリンクを追加しました。
http://msdn2.microsoft.com/ja-jp/library/ms229066.aspx

[ メッセージ編集済み 編集者: ぱむ。 編集日時 2006-07-21 14:04 ]

[ メッセージ編集済み 編集者: ぱむ。 編集日時 2006-07-21 14:05 ]
なおこ(・∀・)
大ベテラン
会議室デビュー日: 2004/04/08
投稿数: 174
お住まい・勤務地: 東京都
投稿日時: 2006-07-21 16:40
お世話になります。

引用:

ぱむ。さんの書き込み (2006-07-21 13:07) より:
以下のコンパイルエラーになってしまいます。
'TrackSelection' は 'Microsoft.Samples.WinForms.Vb.HelpLabel.HelpLabel' のメンバではありません。


Namespace ステートメント
こちらをご参照下さい。
_________________
なおこ(・∀・) @ わんくま同盟
主婦と.NETと犬の記録
主婦と.NETと犬のぶろぐ
イワ
会議室デビュー日: 2007/09/22
投稿数: 3
投稿日時: 2007-09-22 13:47
引用:--------------------------------------------------
いろいろ探してはみたのですが、見当たりませんでした。
--------------------------------------------------------

確かに少ないですね(^^;
私も同じ事で困って結局ココに検索で辿りついてしまいましたw

同じようにまたココにたどり着く人がいると思うので解った事をココに記しておきます。



TrackSelectionも原因の一つではあるんですが・・・
諸悪の根源はHelpLabelクラスの方の↓こいつです。

Protected Overrides Sub OnPaint(ByVal pe As PaintEventArgs)
  If Not (activeControl Is Nothing) Then
    Dim myText As String = CStr(helpTexts(activeControl))
      :
      :
      :
  End If
End If

まず、

If Not (activeControl Is Nothing) Then



If activeControl IsNot Nothing AndAlso helpTexts.Contains(activeControl) Then

に修正します。


次にHelpLabelDesignerクラスの方でTrackSelectionプロパティをHelpLabelクラスに
追加する部分ですがTrackSelectionプロパティが何かというとデザイン時にも
コントロールのSelection変更をHelpLabelに伝えて動きを確認するかどうか程度の
プロパティなのでそんなの当然と思うならPreFilterPropertiesのオーバーライド
部分ごと削っちゃって構わないです!


でもちゃんとサンプルが意図する動きが確認したいというならば


Protected Overrides Sub PreFilterProperties(ByVal properties As IDictionary)
      :
      :
      :
  properties("TrackSelection") = TypeDescriptor.CreateProperty( _
    Me.GetType(), _
    "TrackSelection", _
    GetType(Boolean), _
    New Attribute() {CategoryAttribute.Design})
End Sub



New Attribute() {CategoryAttribute.Design} ←ココが属性の追加不足!



New Attribute() {CategoryAttribute.Design, _
         DesignerSerializationVisibilityAttribute.Hidden}

にして DesignerSerializationVisibilityAttribute.Hidden を更に追加します。

ただしコレだとHelpLabelのTrackSelectionプロパティをFalseにして
フォームを一旦閉じて開き直してもシリアライズ対象にしないという属性
を付け加えたので当然ながらまた初期値のTrueに戻ってしまいます。

それが嫌ならワザワザHelpLabelDesignerでプロパティを追加する仕様に
する必要はなくてHelpLabelクラス自身にTrackSelectionプロパティを持て
ば済む話です。ただこのTrackSelectionプロパティ自体デザイン時にしか
意味がないのでHelpLabelクラスにTrackSelectionプロパティを持つなら
<DesignOnly(True), EditorBrowsable(EditorBrowsableState.Never)> _
などの属性をつけとけばいいと思います。


- 以上 -
1

スキルアップ/キャリアアップ(JOB@IT)