マスクコントロールの主要機能である入力フィールドの設定とその活用方法について解説します。
マスクコントロールの入力領域はフィールドから構成されており、フィールドによって書式の設定やスタイルを定義することが可能です。フィールドを設定するには、Fields プロパティが参照するMaskFieldCollection を使用します。MaskFieldCollection は、コントロール内の各フィールドを表すMaskField のコレクションを保持するクラスです。
マスクコントロールの書式を設定するには、MaskFieldCollection のAdd メソッド、もしくはAddRange メソッドを使用して直接フィールドオブジェクトを追加する方法と、AddRange メソッドのオーバーライドの1つを使用して、キーワード文字列によりフィールドを自動生成する方法があります。それぞれの方法による書式の設定方法については、以下のトピックを参照してください。
マスクコントロールは、リテラル文字列を設定し表示させることができます。リテラル文字とは、リテラルフィールド(MaskLiteralField クラス)で定義された文字列をそのまま表示する文字列をいいます。 ShowLiterals プロパティを使えば、入力中にリテラル文字列を表示するかどうかを指定できます。
また、パターンフィールド(MaskPatternField クラス)には、プロンプト文字を設定することができます。プロンプト文字を使用することで、入力フィールドを明示的に表示したり入力文字数を視覚的に表すことができます。 プロンプト文字はコントロールのPromptChar プロパティを使用して設定します。なお、各パターンフィールドのPromptChar プロパティを設定するとフィールドごとに異なるプロンプト文字も設定できます。
(図)プロンプト文字("_")
(図)2つ目のパターンフィールドのみ異なるプロンプト文字("*")
AutoConvert プロパティをTrueに設定すると、Fields プロパティが参照するフィールドコレクションのパターンフィールド(MaskPatternField.Pattern)で設定された書式に基づいて、変換可能な文字はすべて自動的に変換されます。例えば、書式が \A{8} のように設定されていると、小文字を入力しても自動的に大文字に変換されます。また、全角文字だけが許可されている場合は、入力された半角文字は全角文字に変換されます。
コントロール内部で行われる自動変換の手順を以下に示します。
半角カタカナ、全角カタカナ、およびひらがなは、次のように変換されます。
Fields プロパティのパターンフィールドに"^\V"が設定された場合、IVS(Ideographic Variation Sequence)文字およびIVSの親となる漢字(以下、親字)は以下のように変換されます。
"^\V"(IVS文字を除外する) | |
---|---|
IVS | 親字に変換されます |
親字 | そのまま入力されます |
DefaultActiveField プロパティを使用すると、コントロールがフォーカスを受け取ったときにキャレットを配置するフィールドを指定できます。現在キャレットが置かれているフィールドは、ActiveField プロパティで取得できます。
フィールドコレクション内の特定のフィールドにアクセスする場合、次のいずれかの方法を使うことができます。
コレクションのインデックスがわかっている場合は、インデックスを使ってフィールドを取得することができます。
次のサンプルコードはインデックスを使ってフィールドを取得する例です。ここではマスクコントロールの2番目のフィールドを取得する例です。
Dim MyField As GrapeCity.Win.Editors.Fields.MaskField = GcMask1.Fields(2)
GrapeCity.Win.Editors.Fields.MaskField myField = gcMask1.Fields[2];
また、インデックスを使わず、設定したキー(文字列)を使って特定のフィールドにアクセスすることもできます。 キーは、各フィールドのNameプロパティにキーとして文字列を設定します。
次のサンプルコードはキーを使ってフィールドを取得する例です。ここではマスクコントロールの特定のフィールドのNameプロパティに予め"Key1"という文字列が設定されていることを前提にしています。
Dim MyField As GrapeCity.Win.Editors.Fields.MaskField = GcMask1.Fields("Key1")
GrapeCity.Win.Editors.Fields.MaskField myField = gcMask1.Fields["Key1"];
MaskPatternField クラスとMaskEnumerationField クラスにはFocus メソッドが提供されています。このFocus メソッドを使用すれば、特定のフィールドにフォーカス(キャレット)を設定することができます。
次のサンプルコードはキーを使って取得したフィールドをフォーカスする例です。上の例と同様、特定のフィールドのNameプロパティに予め"Key1"という文字列が設定されていることを前提にしています。
Dim MyField As GrapeCity.Win.Editors.Fields.MaskField = GcMask1.Fields("Key1") MyField.Focus()
GrapeCity.Win.Editors.Fields.MaskField myField = gcMask1.Fields["Key1"];
myField.Focus();
コントロールには、フィールド間のキャレットの移動によって発生する2つのイベントが用意されています。
これらのイベントを使えば、フィールド毎に入力された値をチェックすることや、その値に応じた独自処理の実装など、フィールドを使った細やかな処理の実装を可能になります。
各フィールドクラスには、コントロールのFieldEnterとFieldLeaveと同様の機能を持つEnterとLeaveイベントが提供されています。これらのイベントを使うことでも、ユーザーは同様の処理を実装することが可能です。しかし、フィールドクラスのイベントの場合、フィールド毎にイベントを実装する必要があることから、動的なフィールド操作や書式の仕様変更などに対しての処理が煩雑になる可能性があることや、デザインウィンドウ上からイベントハンドラを生成できないことなどのデメリットがあるためフィールドクラスのイベントよりもコントロールのイベントを使うことが推奨されます。 |
次のサンプルコードは、2つの列挙型フィールドを持ったマスクコントロールで、最初の列挙型フィールドの値に応じて2番目の列挙型フィールドの内容を変更する例です。
Imports GrapeCity.Win.Editors.Fields ' 列挙型文字列を定義します。 Dim Item0 As String() = New String() {"東北", "関東", "中部"} Dim Item1 As String() = New String() {"青森県", "岩手県", "秋田県", "宮城県", "山形県", "福島県"} Dim Item2 As String() = New String() {"茨城県", "栃木県", "群馬県", "埼玉県", "千葉県", "東京都", "神奈川県"} Dim Item3 As String() = New String() {"新潟県", "富山県", "石川県", "福井県", "山梨県", "長野県", "岐阜県", "静岡県", "愛知県"} ' フィールドオブジェクトを作成します。 Dim Mef1 As MaskEnumerationField = New MaskEnumerationField() Dim Mlf1 As MaskLiteralField = New MaskLiteralField("地方 ") Dim Mef2 As MaskEnumerationField = New MaskEnumerationField() Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 列挙型フィールドにキーを設定します。 Mef1.Name = "Enumf1" ' 列挙型フィールドのドロップダウン機能を有効にします。 Mef1.AutoDropDown = True Mef1.DropDownEnabled = True Mef2.AutoDropDown = True Mef2.DropDownEnabled = True ' フィールドをコレクションに追加してコントロールに書式を設定します。 GcMask1.Fields.AddRange(New MaskField() {Mef1, Mlf1, Mef2}) Mef1.Items = Item0 End Sub Private Sub GcMask1_FieldLeave(ByVal sender As System.Object, ByVal e As GrapeCity.Win.Editors.FieldEventArgs) Handles GcMask1.FieldLeave ' 最初の列挙型フィールドのとき、値に応じて2番目の列挙型フィールド ' の内容を変更します。 If e.Field.Name = "Enumf1" Then Select GcMask1.Fields("Enumf1").Text Case "東北" Mef2.Items = Item1 Case "関東" Mef2.Items = Item2 Case "中部" Mef2.Items = Item3 Case Else Mef1.Items = New String() {" "} End Select End If End Sub
using GrapeCity.Win.Editors.Fields; // 列挙型文字列を定義します。 string[] item0 = new string[] { "東北", "関東", "中部" }; string[] item1 = new string[] { "青森県", "岩手県", "秋田県", "宮城県", "山形県", "福島県" }; string[] item2 = new string[] { "茨城県", "栃木県", "群馬県", "埼玉県", "千葉県", "東京都", "神奈川県" }; string[] item3 = new string[] { "新潟県", "富山県", "石川県", "福井県", "山梨県", "長野県", "岐阜県", "静岡県", "愛知県" }; // フィールドオブジェクトを作成します。 MaskEnumerationField mef1 = new MaskEnumerationField(); MaskLiteralField mlf1 = new MaskLiteralField("地方 "); MaskEnumerationField mef2 = new MaskEnumerationField(); private void Form1_Load(object sender, EventArgs e) { // 列挙型フィールドにキーを設定します。 mef1.Name = "Enumf1"; // 列挙型フィールドのドロップダウン機能を有効にします。 mef1.AutoDropDown = true; mef1.DropDownEnabled = true; mef2.AutoDropDown = true; mef2.DropDownEnabled = true; // フィールドをコレクションに追加してコントロールに書式を設定します。 gcMask1.Fields.AddRange(new MaskField[] { mef1, mlf1, mef2 }); mef1.Items = item0; } private void gcMask1_FieldLeave(object sender, GrapeCity.Win.Editors.FieldEventArgs e) { // 最初の列挙型フィールドのとき、値に応じて2番目の列挙型フィールド // の内容を変更します。 if (e.Field.Name == "Enumf1") { switch (gcMask1.Fields["Enumf1"].Text) { case "東北": mef2.Items = item1; return; case "関東": mef2.Items = item2; return; case "中部": mef2.Items = item3; return; default: mef1.Items = new string[]{" "}; return; } } }
(図) 上記サンプルコードを適用したコントロール