継承コントロールの作成方法(1):デザイン機能を無効にして実行時に設定する方法

文書番号 : 29280     文書種別 : 使用方法     最終更新日 : 2010/06/23
文書を印刷する
対象製品
InputMan for Windows Forms 6.0J
詳細
InputMan for Windows Forms 6.0Jでは、Service Pack 1以降、2つの継承コントロールを作成する方法を提供しています。ひとつは「デザイン機能を無効にして実行時に設定する方法」、もうひとつは「デフォルトを設定する方法」です。
このFAQでは、これらの作成方法のうち、「デザイン機能を無効にして実行時に設定する方法」を説明します。

・デザイン機能を無効にして実行時に設定する方法
デザイン機能を無効にして実行時に設定する方法は、InputMan for Windows Forms 5.0Jや初版のInputMan for Windows Forms 6.0Jで提供していた継承コントロールの作成方法です。この方法では、各機能が自動に追加されるデザイン機能を無効にし、実行時にフィールドやサイドボタン、ショートカット機能を設定します。

[継承クラス作成の際の注意点]
  1. 引数のないコンストラクタと、IContainerを引数に取るコンストラクタの両方を実装する。
    1. 引数なしのコンストラクタのみが実装されている場合、継承コントロールを配置したアプリケーションを実行すると例外が発生する場合があります。
  2. 基底クラスでフィールドやサイドボタンをあらかじめ追加しておく場合は、以下の点に留意する。
    1. 継承クラスのInitializeComponentメソッド内にはフィールドやサイドボタンを追加するコードを記述しない。これらのコードは「initializeCollections」等の別名のメソッド内に記述し、このメソッドをコンストラクタから呼び出す。
    2. 引数のないコンストラクタには、最初にフィールドとサイドボタンを消去する処理を記述する。
    3. 以下のメソッドを実装して継承クラスのデザイン機能が動作しないように設定する。(注意:これらのメソッドを実装した場合、継承クラスのフィールドやサイドボタンをプロパティページやスマートタグから編集することはできなくなります。)
      1. Fields / ShouldSerializeFields
      2. DisplayFields / ShouldSerializeDisplayFields
      3. SideButtons / ShouldSerializeSideButtons
    4. 注意:継承クラスをフォームに配置した時にサイドボタンやフィールドが一部不正になることがありますが、アプリケーション実行時には正しく表示されます。
[継承クラスの実装例]
以下の実装例では、GcDate, GcTimeSpan, GcNumber, GcComboBoxのそれぞれのコントロールについて、基底クラスであらかじめフィールドやサイドボタンを実装する実装例を紹介しています。

日付コントロール(GcDate)

[Visual Basic]
Imports GrapeCity.Win.Editors
Imports GrapeCity.Win.Editors.Fields
Imports System.ComponentModel

' ライセンス属性を設定します。
<LicenseProviderAttribute(GetType(LicenseProvider))> _
Public Class GcDateX
Inherits GcDate

  Public Sub New()

    ' 引数なしのコンストラクタでは、最初にフィールドなどを消去します。
    Me.Fields.Clear()
    Me.DisplayFields.Clear()
    Me.SideButtons.Clear()

    ' フィールドなどを初期化します。
    initializeCollections()

  End Sub

  Public Sub New(ByVal container As IContainer)

    MyBase.New(container)

    ' フィールドなどを初期化します。
    initializeCollections()

  End Sub

  ' フィールドなどを初期化します。
  Private Sub initializeCollections()

    Me.Fields.AddRange("yyyy/MM/dd")
    Me.DisplayFields.AddRange("yyyy/M/d")
    Me.SideButtons.Add(New DropDownButton())

  End Sub

  ' 以下の2つのメソッドを実装することにより、
  ' 継承コントロールをフォームにドロップした時にコントロールに
  ' 入力フィールドが追加される動作を無効にします。
  Public Overloads ReadOnly Property Fields() As DateFieldCollection

    Get
      Return MyBase.Fields
    End Get

  End Property

  Private Function ShouldSerializeFields() As Boolean

    Return False

  End Function

  ' 以下の2つのメソッドを実装することにより、
  ' 継承コントロールをフォームにドロップした時にコントロールに
  ' 表示フィールドが追加される動作を無効にします。
  Public Overloads ReadOnly Property DisplayFields() As DateDisplayFieldCollection

    Get
      Return MyBase.DisplayFields
    End Get

  End Property

  Private Function ShouldSerializeDisplayFields() As Boolean

    Return False

  End Function

  ' 以下の2つのメソッドを実装することにより、
  ' 継承コントロールをフォームにドロップした時にコントロールに
  ' サイドボタンが追加される動作を無効にします。
  Public Overloads ReadOnly Property SideButtons() As SideButtonCollection

    Get
      Return MyBase.SideButtons
    End Get

  End Property

  Private Function ShouldSerializeSideButtons() As Boolean

    Return False

  End Function

End Class

[C#]
using GrapeCity.Win.Editors;
using GrapeCity.Win.Editors.Fields;
using System.ComponentModel;

// ライセンス属性を設定します。
[LicenseProviderAttribute( typeof( LicenseProvider ) )]
public class GcDateX : GcDate
{
  public GcDateX()
  {
    // 引数なしのコンストラクタでは、最初にフィールドなどを消去します。
    this.Fields.Clear();
    this.DisplayFields.Clear();
    this.SideButtons.Clear();
    
    // フィールドなどを初期化します。
    initializeCollections();
  }

  public GcDateX( IContainer container ) : base( container )
  {
    // フィールドなどを初期化します。
    initializeCollections();
  }

  // フィールドなどを初期化します。
  private void initializeCollections()
  {
    this.Fields.AddRange( "yyyy/MM/dd" );
    this.DisplayFields.AddRange( "yyyy/M/d" );
    this.SideButtons.Add( new DropDownButton() );
  }
  
  // 以下の2つのメソッドを実装することにより、
  // 継承コントロールをフォームにドロップした時にコントロールに
  // 入力フィールドが追加される動作を無効にします。
  public new DateFieldCollection Fields
  {
    get{ return base.Fields; }
  }
  
  private bool ShouldSerializeFields()
  {
    return false;
  }

  // 以下の2つのメソッドを実装することにより、
  // 継承コントロールをフォームにドロップした時にコントロールに
  // 表示フィールドが追加される動作を無効にします。
  public new DateDisplayFieldCollection DisplayFields
  {
    get{ return base.DisplayFields; }
  }
  
  private bool ShouldSerializeDisplayFields()
  {
    return false;
  }

  // 以下の2つのメソッドを実装することにより、
  // 継承コントロールをフォームにドロップした時にコントロールに
  // サイドボタンが追加される動作を無効にします。
  public new SideButtonCollection SideButtons
  {
    get{ return base.SideButtons; }
  }
  
  private bool ShouldSerializeSideButtons()
  {
    return false;
  }
}

タイムスパンコントロール(GcTimeSpan)

[Visual Basic]
Imports GrapeCity.Win.Editors
Imports GrapeCity.Win.Editors.Fields
Imports System.ComponentModel

' ライセンス属性を設定します。
<LicenseProviderAttribute(GetType(LicenseProvider))> _
Public Class GcTimeSpanX
Inherits GcTimeSpan

  Public Sub New()

    ' 引数なしのコンストラクタでは、最初にフィールドなどを消去します。
    Me.Fields.Clear()
    Me.DisplayFields.Clear()
    Me.SideButtons.Clear()

    ' フィールドなどを初期化します。
    initializeCollections()

  End Sub

  Public Sub New(ByVal container As IContainer)

    MyBase.New(container)

    ' フィールドなどを初期化します。
    initializeCollections()

  End Sub

  ' フィールドなどを初期化します。
  Private Sub initializeCollections()

    Me.Fields.AddRange("h/m/s", 2, "."c, "", "", "-", "")
    Me.DisplayFields.AddRange("hh/mm/ss", 2, "."c, "", "", "-", "")
    Me.SideButtons.Add(New SpinButton())

  End Sub

  ' 以下の2つのメソッドを実装することにより、
  ' 継承コントロールをフォームにドロップした時にコントロールに
  ' 入力フィールドが追加される動作を無効にします。
  Public Overloads ReadOnly Property Fields() As TimeSpanFieldCollection

    Get
      Return MyBase.Fields
    End Get

  End Property

  Private Function ShouldSerializeFields() As Boolean

    Return False

  End Function

  ' 以下の2つのメソッドを実装することにより、
  ' 継承コントロールをフォームにドロップした時にコントロールに
  ' 表示フィールドが追加される動作を無効にします。
  Public Overloads ReadOnly Property DisplayFields() As TimeSpanDisplayFieldCollection

    Get
      Return MyBase.DisplayFields
    End Get
  End Property

  Private Function ShouldSerializeDisplayFields() As Boolean

    Return False

  End Function

  ' 以下の2つのメソッドを実装することにより、
  ' 継承コントロールをフォームにドロップした時にコントロールに
  ' サイドボタンが追加される動作を無効にします。
  Public Overloads ReadOnly Property SideButtons() As SideButtonCollection

    Get
      Return MyBase.SideButtons
    End Get

  End Property

  Private Function ShouldSerializeSideButtons() As Boolean

    Return False

  End Function
End Class

[C#]
using GrapeCity.Win.Editors;
using GrapeCity.Win.Editors.Fields;
using System.ComponentModel;

// ライセンス属性を設定します。
[LicenseProviderAttribute( typeof( LicenseProvider ) )]
public class GcTimeSpanX : GcTimeSpan
{
  public GcTimeSpanX()
  {
    // 引数なしのコンストラクタでは、最初にフィールドなどを消去します。
    this.Fields.Clear();
    this.DisplayFields.Clear();
    this.SideButtons.Clear();

    // フィールドなどを初期化します。
    initializeCollections();
  }

  public GcTimeSpanX( IContainer container ) : base( container )
  {
    // フィールドなどを初期化します。
    initializeCollections();
  }

  // フィールドなどを初期化します。
  private void initializeCollections()
  {
    this.Fields.AddRange( "h/m/s", 2, '.', "", "", "-", "" ) ;
    this.DisplayFields.AddRange( "hh/mm/ss", 2, '.', "", "", "-", "" );
    this.SideButtons.Add( new SpinButton() );
  }

  // 以下の2つのメソッドを実装することにより、
  // 継承コントロールをフォームにドロップした時にコントロールに
  // 入力フィールドが追加される動作を無効にします。
  public new TimeSpanFieldCollection Fields
  {
    get{ return base.Fields; }
  }
  
  private bool ShouldSerializeFields()
  {
    return false;
  }

  // 以下の2つのメソッドを実装することにより、
  // 継承コントロールをフォームにドロップした時にコントロールに
  // 表示フィールドが追加される動作を無効にします。
  public new TimeSpanDisplayFieldCollection DisplayFields
  {
    get{ return base.DisplayFields; }
  }
  
  private bool ShouldSerializeDisplayFields()
  {
    return false;
  }

  // 以下の2つのメソッドを実装することにより、
  // 継承コントロールをフォームにドロップした時にコントロールに
  // サイドボタンが追加される動作を無効にします。
  public new SideButtonCollection SideButtons
  {
    get{ return base.SideButtons; }
  }
  
  private bool ShouldSerializeSideButtons()
  {
    return false;
  }
}

数値コントロール(GcNumber)

[Visual Basic]
Imports GrapeCity.Win.Editors
Imports GrapeCity.Win.Editors.Fields
Imports System.ComponentModel

<LicenseProviderAttribute(GetType(LicenseProvider))> _
Public Class GcNumberX
Inherits GcNumber

  Public Sub New()

    ' 引数なしのコンストラクタでは、最初にフィールドなどを消去します。
    Me.DisplayFields.Clear()
    Me.SideButtons.Clear()

    ' フィールドなどを初期化します。
    initializeCollections()

  End Sub

  Public Sub New(ByVal container As IContainer)

    MyBase.New(container)

    ' フィールドなどを初期化します。
    initializeCollections()

  End Sub

  ' フィールドなどを初期化します。
  Private Sub initializeCollections()

    Me.Fields.SetFields("#0.00", "", "", "-", "")
    Me.DisplayFields.AddRange("#0.##", "", "", "-", "")
    Me.SideButtons.Add(New SpinButton())

  End Sub

  ' 以下の2つのメソッドを実装することにより、
  ' 継承コントロールをフォームにドロップした時にコントロールに
  ' 入力フィールドが設定される動作を無効にします。
  Public Overloads ReadOnly Property Fields() As NumberFields

    Get
      Return MyBase.Fields
    End Get

  End Property

  Private Function ShouldSerializeFieilds() As Boolean

    Return False

  End Function

  ' 以下の2つのメソッドを実装することにより、
  ' 継承コントロールをフォームにドロップした時にコントロールに
  ' 表示フィールドが追加される動作を無効にします。
  Public Overloads ReadOnly Property DisplayFields() As NumberDisplayFieldCollection

    Get
      Return MyBase.DisplayFields
    End Get

  End Property

  Private Function ShouldSerializeDisplayFields() As Boolean

    Return False

  End Function

  ' 以下の2つのメソッドを実装することにより、
  ' 継承コントロールをフォームにドロップした時にコントロールに
  ' サイドボタンが追加される動作を無効にします。
  Public Overloads ReadOnly Property SideButtons() As SideButtonCollection

    Get
      Return MyBase.SideButtons
    End Get

  End Property

  Private Function ShouldSerializeSideButtons() As Boolean

    Return False

  End Function

End Class

[C#]
using GrapeCity.Win.Editors;
using GrapeCity.Win.Editors.Fields;
using System.ComponentModel;

// ライセンス属性を設定します。
[LicenseProviderAttribute( typeof( LicenseProvider ) )]
public class GcNumberX : GcNumber
{
  public GcNumberX()
  {
    // 引数なしのコンストラクタでは、最初にフィールドなどを消去します。
    this.DisplayFields.Clear();
    this.SideButtons.Clear();

    // フィールドなどを初期化します。
    initializeCollections();
  }

  public GcNumberX( IContainer container ) : base( container )
  {
    // フィールドなどを初期化します。
    initializeCollections();
  }

  // フィールドなどを初期化します。
  private void initializeCollections()
  {
    this.Fields.SetFields( "#0.00", "", "", "-", "" );
    this.DisplayFields.AddRange( "#0.##", "", "", "-", "" );
    this.SideButtons.Add( new SpinButton() );
  }

  // 以下の2つのメソッドを実装することにより、
  // 継承コントロールをフォームにドロップした時にコントロールに
  // 入力フィールドが設定される動作を無効にします。
  public new NumberFields Fields
  {
    get{ return base.Fields; }
  }
  
  private bool ShouldSerializeFields()
  {
    return false;
  }

  // 以下の2つのメソッドを実装することにより、
  // 継承コントロールをフォームにドロップした時にコントロールに
  // 表示フィールドが追加される動作を無効にします。
  public new NumberDisplayFieldCollection DisplayFields
  {
    get{ return base.DisplayFields; }
  }
  
  private bool ShouldSerializeDisplayFields()
  {
    return false;
  }

  // 以下の2つのメソッドを実装することにより、
  // 継承コントロールをフォームにドロップした時にコントロールに
  // サイドボタンが追加される動作を無効にします。
  public new SideButtonCollection SideButtons
  {
    get{ return base.SideButtons; }
  }
  
  private bool ShouldSerializeSideButtons()
  {
    return false;
  }

コンボコントロール(GcComboBox)

[Visual Basic]
Imports GrapeCity.Win.Editors
Imports GrapeCity.Win.Editors.Fields
Imports System.ComponentModel

<LicenseProviderAttribute(GetType(LicenseProvider))> _
Public Class GcComboBoxX
Inherits GcComboBox

  Public Sub New()

    ' 引数なしのコンストラクタでは、最初にサイドボタンを消去します。
    Me.SideButtons.Clear()

    ' サイドボタンを初期化します。
    initializeCollections()

  End Sub

  Public Sub New(ByVal container As IContainer)

    MyBase.New(container)

    ' サイドボタンを初期化します。
    initializeCollections()

  End Sub

  ' サイドボタンを初期化します。
  Private Sub initializeCollections()

    Me.SideButtons.Add(New SpinButton())

  End Sub

  ' 以下の2つのメソッドを実装することにより、
  ' 継承コントロールをフォームにドロップした時にコントロールに
  ' サイドボタンが追加される動作を無効にします。
  Public Overloads ReadOnly Property SideButtons() As SideButtonCollection

    Get
      Return MyBase.SideButtons
    End Get

  End Property

  Private Function ShouldSerializeSideButtons() As Boolean

    Return False

  End Function

End Class

[C#]
using GrapeCity.Win.Editors;
using GrapeCity.Win.Editors.Fields;
using System.ComponentModel;

// ライセンス属性を設定します。
[LicenseProviderAttribute( typeof( LicenseProvider ) )]
public class GcComboBoxX : GcComboBox
{
  public GcComboBoxX()
  {
    // 引数なしのコンストラクタでは、最初にサイドボタンを消去します。
    this.SideButtons.Clear();
    
    // サイドボタンを初期化します。
    initializeCollections();
  }

  public GcComboBoxX( IContainer container ) : base( container )
  {
    // サイドボタンを初期化します。
    initializeCollections();
  }

  // サイドボタンを初期化します。
  private void initializeCollections()
  {
    this.SideButtons.Add( new SpinButton() );
  }

  // 以下の2つのメソッドを実装することにより、
  // 継承コントロールをフォームにドロップした時にコントロールに
  // サイドボタンが追加される動作を無効にします。
  public new SideButtonCollection SideButtons
  {
    get{ return base.SideButtons; }
  }
  
  private bool ShouldSerializeSideButtons()
  {
    return false;
  }
}

この文書は、以前は次のFAQ IDで公開されていました : 13261