時刻コントロールの主要機能である書式フィールドの設定とその活用方法について解説します。
時刻コントロールの書式には、入力用と表示用の2つがあり、それぞれ入力フィールドと表示フィールドを使って書式を設定します。
入力フィールドを設定するには、Fields プロパティが参照するTimeFieldCollection を使用します。TimeFieldCollection は、各入力フィールドを表すDateFieldのコレクションを保持するクラスです。
一方、表示フィールドを設定するには、DisplayFields プロパティが参照するTimeDisplayFieldCollection を使用します。TimeDisplayFieldCollection は、各表示フィールドを表すDateDisplayFieldのコレクションを保持するクラスです。
時刻コントロールの書式を設定するには、それぞれのコレクションのAdd メソッドもしくはAddRange メソッドを使用して直接フィールドオブジェクトを追加する方法と、AddRange メソッドのオーバーライドの1つを使用して、キーワード文字列によりフィールドを自動生成する方法があります。それぞれの方法による書式の設定方法については、以下のトピックを参照してください。
ShowLiterals プロパティを使えば、入力中にリテラル文字列を表示するかどうかを指定できます。
リテラル文字とは、DateLiteralField (リテラルフィールド)で定義された文字列をそのまま表示する文字列をいいます。
また、リテラルフィールド以外のフィールドには、プロンプト文字を設定することができます。プロンプト文字を使用することで、入力フィールドを明示的に表示したり入力文字数を視覚的に表すことができます。 プロンプト文字はコントロールのPromptChar プロパティを使用して設定できます。なお、各フィールドのPromptChar プロパティを設定するとフィールドごとに異なるプロンプト文字も設定できます。
(図)プロンプト文字("_")
(図)分フィールドのみ異なるプロンプト文字("*")
' キーワードから書式を設定します。 GcTime1.Fields.AddRange("HH:mm") ' RecommendedValueプロパティに非表示フィールドのデフォルト値を設定します。 GcTime1.RecommendedValue = New TimeSpan(23, 59, 59) ' ValueプロパティにNothingを設定します。 GcTime1.Value = Nothing
// キーワードから書式を設定します。 gcTime1.Fields.AddRange("yyyy/MM"); // RecommendedValueプロパティに非表示フィールドのデフォルト値を設定します。 gcTime1.RecommendedValue = new TimeSpan(23, 59, 59); // Valueプロパティにnullを設定します。 gcTime1.Value = null;
入力フィールドのコレクションを全て削除すると自由書式入力が可能になります。自由書式入力では、時刻に変換可能なあらゆる値を受けつけますが、無効な文字が入力されてもInvalidInput イベントは発生しません。文字列を時刻に変換できなかった場合、値はnull 参照 (Visual Basic では Nothing)になりますが、入力された値は次回フォーカス取得時まで保持されます。変換できない値をクリアしたり入力前の値に戻すためには、時刻検証コンポーネントを用いて値を検証します。
' 自由書式入力を行うために、入力フィールドを削除します。 GcTime1.Fields.Clear() ' 検証アイテムを作成 Dim GcTimeInvalidValue1 As New GrapeCity.Win.Editors.GcTimeValidator.InvalidValue() GcTimeValidator1.GetValidateItems(GcTime1).Add(GcTimeInvalidValue1) ' 検証アクション(値をクリア)を作成 Dim ValueProcess1 As New GrapeCity.Win.Editors.ValueProcess() ValueProcess1.ValueProcessOption = GrapeCity.Win.Editors.ValueProcessOption.Clear GcTimeValidator1.GetValidateActions(GcTime1).Add(ValueProcess1)
// 自由書式入力を行うために、入力フィールドを削除します。 gcTime1.Fields.Clear(); // 検証アイテムを作成 GrapeCity.Win.Editors.GcTimeValidator.InvalidValue gcTimeInvalidValue1 = new GrapeCity.Win.Editors.GcTimeValidator.InvalidValue(); gcTimeValidator1.GetValidateItems(gcTime1).Add(gcTimeInvalidValue1); // 検証アクション(値をクリア)を作成 GrapeCity.Win.Editors.ValueProcess valueProcess1 = new GrapeCity.Win.Editors.ValueProcess(); valueProcess1.ValueProcessOption = GrapeCity.Win.Editors.ValueProcessOption.Clear; gcTimeValidator1.GetValidateActions(gcTime1).Add(valueProcess1);
なお、自由書式入力に設定した場合は、次の各プロパティが無効になります。
DefaultActiveField プロパティを使用すると、コントロールがフォーカスを受け取ったときにキャレットを配置するフィールドを指定できます。現在キャレットが置かれているフィールドは、ActiveField プロパティで取得できます。
フィールドコレクション内の特定のフィールドにアクセスする場合、次のいずれかの方法を使うことができます。
コレクションのインデックスがわかっている場合は、インデックスを使ってフィールドを取得することができます。
次のサンプルはインデックスを使ってフィールドを取得する例です。ここでは時刻コントロールの3番目のフィールドを取得する例です。
Dim MyField As GrapeCity.Win.Editors.Fields.DateField = GcTime1.Fields(2)
GrapeCity.Win.Editors.Fields.DateField myField = gcTime1.Fields[2];
また、インデックスを使わず、設定したキー(文字列)を使って特定のフィールドにアクセスすることもできます。
キーは、各フィールドのName プロパティにキーとして文字列を設定します。
次のサンプルはキーを使ってフィールドを取得する例です。ここでは時刻コントロールの特定のフィールドのName プロパティに予め"Key1"という文字列が設定されていることを前提にしています。
Dim MyField As GrapeCity.Win.Editors.Fields.DateField = GcTime1.Fields("Key1")
GrapeCity.Win.Editors.Fields.DateField myField = gcTime1.Fields["Key1"];
コントロールには、フィールド間のキャレットの移動によって発生する2つのイベントが用意されています。
これらのイベントを使えば、フィールド毎に入力された値をチェックすることや、その値に応じた独自処理の実装など、フィールドを使った細やかな処理の実装を可能になります。
各フィールドクラスには、コントロールのFieldEnterとFieldLeaveと同様の機能を持つEnter とLeave イベントが提供されています。これらのイベントを使うことでも、ユーザーは同様の処理を実装することが可能です。しかし、フィールドクラスのイベントの場合、フィールド毎にイベントを実装する必要があることから、動的なフィールド操作や書式の仕様変更などに対しての処理が煩雑になる可能性があることや、デザインウィンドウ上からイベントハンドラを生成できないことなどのデメリットがあるためフィールドクラスのイベントよりもコントロールのイベントを使うことが推奨されます。 |