フォーカスを制限して制御データを検証する
Validate イベントと CausesValidation プロパティは、ユーザーがコントロールからフォーカスを移動できるようにする前に、コントロールへの入力を確認するために並行して使用されます。例: 複数のテキスト ボックスと [ヘルプ] ボタンがあるアプリケーションを考えてみましょう。各テキスト ボックスがフォーカスを受け取ったときに、テキスト ボックスの特別な検証基準が満たされるまでユーザーがフォーカスを移動できないようにしたいとします。ユーザーは、テキスト ボックスがフォーカスを受け取ったときに、いつでもフォーカスを移動できます。これを行うには、Validate イベントで検証基準を設定し、[ヘルプ] ボタンの CausesValidation プロパティを False に設定します。このプロパティが True (デフォルト設定) に設定されている場合、最初のコントロールで Validate イベントが発生します。このプロパティが False に設定されている場合、最初のコントロールの Validate イベントが最初に発生します。
LostFocus イベントは (定義上) フォーカスが移動した後に発生するため、Validate イベントは LostFocus イベントよりもデータ エントリの検証に適しています。代わりに、Validate イベントを使用すると、検証ルールが満たされるまでフォーカスが別のコントロールに移動するのを防ぐことができます。
可能な用途
データ入力アプリケーションは、MaskedEdit コントロールによって提供される検証やビジネス ルールで行われる検証よりも複雑なデータ入力検証を実行する必要があります。
フォームでは、フィールドにデータが入力されるまで、ユーザーが TAB キーまたはアクセラレータ キーを使用してコントロールを移動できないようにする必要があります。
Internet Explorer で実行される ActiveX ドキュメントには、スクリプトがプログラムによってフォーカスを移動する前に、ユーザーがフォームでの作業を終了する方法が必要です。
Validate イベントのコントロール フォーカス
Validate イベントには keepfocus パラメータが含まれています。このパラメータが True に設定されている場合、コントロールはフォーカスを保持します。これにより、ユーザーが他のコントロールをクリックすることが効果的に防止されます。
コントロールの配列の使用
コントロール配列は、共通の名前とタイプを持つコントロールのグループです。彼らの成り行きも同じだ。コントロール配列には少なくとも 1 つの要素が必要です。要素の数は、システム リソースとメモリの許容範囲内で増やすことができます。配列のサイズは、各コントロールが必要とするメモリと Windows リソースにも依存します。コントロール配列で使用できる最大インデックス値は 32767 です。同じコントロール配列内の要素には、独自のプロパティ設定があります。コントロール配列の一般的な用途には、メニュー コントロールやオプション ボタンのグループ化の実装が含まれます。
Visual Basic には、実行時に参照されていないコントロールを Controls コレクションに動的に追加する機能が含まれていることに注意してください。このトピックでは、デザイン時にフォームにコントロールをカット アンド ペーストすることによって追加される参照コントロールのみについて説明します。実行時にコントロールを追加する方法の詳細については、リファレンス トピック「Add メソッド (Controls コレクション)」および「Add メソッド (Licenses コレクション)」を参照してください。
コントロール配列を使用する理由
デザイン時に、コントロール配列を使用してコントロールを追加すると、同じ種類の複数のコントロールをフォームに直接追加するよりも、消費するリソースが少なくなります。コントロール配列は、複数のコントロールでコードを共有する場合にも役立ちます。たとえば、3 つのオプション ボタンを含むコントロール配列を作成した場合、どのボタンがクリックされたかに関係なく、同じコードが実行されます。
実行時にコントロールの新しいインスタンスを作成するには、新しいコントロールがコントロール配列のメンバーである必要があります。コントロールの配列を使用する場合、新しい各メンバーは配列のパブリック イベント プロシージャを継承します。
新しいコントロールはそれぞれ、配列用に作成されたイベント プロシージャを継承するため、コントロール配列メカニズムを使用して実行時に新しいコントロールを作成することはできません。たとえば、フォーム上に複数のテキスト ボックスがあり、各テキスト ボックスが日付値を受け入れる場合、すべてのテキスト ボックスが同じ検証コードを共有するようにコントロールの配列を作成できます。
サンプルアプリケーション: Calc.vbp
図 7.2 に示す Calculator サンプル アプリケーション (Samples!Alink(vbsamples) ディレクトリにリストされている) には、数値ボタンとアクション ボタンという 2 つのコントロール配列が含まれています。
この例では、object(index) 構文を使用して各コントロールを参照していることに注目してください。コントロールの作成時にインデックス値を指定します。実際、設計時にコントロールに任意のインデックスを指定すると、コントロールが配列の一部になります。
Index プロパティは、コントロール配列内の要素を区別します。配列内のコントロールがイベントを認識すると、Visual Basic はパブリック イベント プロシージャを呼び出し、パラメーター (Index プロパティの値) を渡して、どのコントロールがイベントを認識したかを識別します。
たとえば、Number_Click イベント プロシージャのコードの最初の行は次のようになります。
PRivateSubNumber_Click(IndexAsInteger)
Number(0) がイベントを識別する場合、VisualBasic はインデックス パラメーターとして 0 を渡し、Number(1) がイベントを識別する場合、VisualBasic はインデックス パラメーターとして 1 を渡します。インデックス値とは異なり、実行された Number_Click コードの残りの部分は、Number(0) から Number(9) まで同じです。
設計時にコントロール配列を作成する
設計時にコントロール配列を作成するには、次の 3 つの方法があります。
1. 複数のコントロールに同じ名前を付けます。
2. 既存のコントロールをコピーし、フォームに貼り付けます。
3. コントロールの Index プロパティを Null 以外の値に設定します。
メニュー コントロール配列はメニュー エディターで作成する必要があることに注意してください。この操作の詳細については、第 6 章「ユーザー インターフェイスの作成」の「実行時のメニューの作成と変更」を参照してください。
コントロール名を変更してコントロール配列要素を追加するには:
1. コントロール配列に追加するコントロールを描画し (同じタイプのコントロールである必要があります)、どのコントロールが配列の最初の要素になるかを決定します。
2. コントロールを選択し、そのコントロールの名前設定値を配列の最初の要素の名前設定値に変更します。
3. 配列内のコントロールの既存の名前を入力すると、Visual Basic によって、コントロール配列を作成するかどうかを確認するダイアログ ボックスが表示されます。この時点で「OK」を選択して操作を確認します。
たとえば、コントロール配列の最初の要素の名前が cmdCtlArr の場合、コマンド ボタンを選択して配列に追加し、その名前を cmdCtlArr に設定します。このとき、次のメッセージが表示されます。「'cmdCtlArr' という名前のコントロールです。」はすでに存在します。コントロールの配列を作成しますか? [OK] を選択して操作を確認します。
この方法で追加されたコントロールは、Name プロパティとコントロール タイプのみを共有します。他のプロパティは、コントロールが最初に描画されたときと同じ値を持ちます。
既存のコントロールをコピーしてコントロール配列要素を追加するには、次の手順を実行します。
1. コントロール配列にコントロールを描画します。
2. コントロールにフォーカスが当たったら、「編集」メニューの「コピー」コマンドを選択します。
3. [編集]メニューで[貼り付け]コマンドを選択します。 Visual Basic では、コントロール配列の作成を確認するかどうかを尋ねるダイアログ ボックスが表示されます。 [OK] を選択して操作を確認します。コントロールに割り当てられるインデックス値は 1 です。描画された最初のコントロールのインデックス値は 0 です。
新しい各配列要素のインデックス値は、制御配列に追加された順序と同じです。このようなコントロールを追加すると、高さ、幅、色などのほとんどの視覚プロパティが配列内の最初のコントロールから新しいコントロールにコピーされます。
実行時にコントロール配列を追加
実行時に、Load ステートメントと Unload ステートメントを使用して、コントロール配列にコントロールを追加したり、コントロール配列からコントロールを削除したりできます。ただし、追加されたコントロールは既存のコントロール配列の要素である必要があります。 (ほとんどの場合) 設計時に Index プロパティを 0 にしてコントロールを作成し、実行時に次の構文を使用する必要があります。
コントロール配列の新しい要素を読み込むとき、ほとんどのプロパティ設定は、最小の添え字を持つ配列内の既存の要素 (この場合はインデックス 0 の要素) からコピーされます。 Visible、Index、および TabIndex プロパティの設定はコントロール配列内の新しい要素に自動的にコピーされないため、新しく追加されたコントロールを表示するには、その Visible プロパティを True に設定する必要があります。
配列内に既に存在するインデックス値に対して Load ステートメントを使用しようとすると、Visual Basic によってエラーが生成されることに注意してください。
重要な点は、 Unload ステートメントを使用して、Load ステートメントによって作成されたすべてのコントロールを削除できることです。ただし、Unload は、コントロール配列の一部であるかどうかに関係なく、デザイン時に作成されたコントロールを削除することはできません。
コントロール スキーム: コントロール配列内のコントロールの追加と削除
実行時にコントロールを追加および削除する方法は、コントロールがオプション ボタンであるコントロール配列の例で示されています。この例によれば、ユーザーはオプション ボタンを追加して、画像ボックスの背景色を変更できます。
図 7.3 に示すように、フォームを開始し、ピクチャ ボックス、ラベル、2 つのオプション ボタン、および 3 つのコマンド ボタンをその上に描画します。
アレイアプリケーションイベントの制御
次に、オプション ボタンとコマンド ボタンのイベント プロシージャを追加する必要があります。フォーム宣言を追加した後、アプリケーションを起動します。
DimMaxIdAsInteger
すべてのオプション ボタンは Click イベント プロシージャを共有します。
PrivateSuboptButton_Click(IndexAsInteger)
picDisplay.BackColor=QBColor(インデックス 1)
EndSub
「追加」コマンド ボタンの Click イベント プロシージャを使用して、新しいオプション ボタンを追加します。この例では、Load ステートメントを実行する前に、コードはロードされているオプション ボタンが 10 個以下であることを確認します。コントロールが読み込まれた後、その Visible プロパティを True に設定する必要があります。
PrivateSubcmdAdd_Click()
IfMaxId=0ThenMaxId=1 'すべてのオプション ボタンを設定します。
IfMaxId>8ThenExitSub ' 使用できるボタンは 10 個のみです。
MaxId=MaxId 1 'ボタン数が増加します。
LoadoptButton(MaxId) '新しいボタンを作成します。
optButton(0).SetFocus 'ボタンのオプションをリセットします。
' 新しいボタンを前のボタンの下に配置します。
optButton(MaxId).Top=optButton(MaxId-1)._
トップ400
optButton(MaxId).Visible=True '新しいボタンを表示します。
optButton(MaxId).Caption=オプション&MaxId 1
EndSub
オプション ボタンを削除するには、[削除] コマンド ボタンの Click イベント プロシージャを使用します。
PrivateSubcmdDelete_Click()
IfMaxId<=1ThenExitSub '最初の 2 つのボタンを保持します。
UnloadoptButton(MaxId) '最後のボタンを削除します。
MaxId=MaxId-1 'ボタン数が減少します。
optButton(0).SetFocus 'ボタンのオプションをリセットします。
EndSub
[閉じる] ボタンの Click イベント プロシージャを通じてアプリケーションを終了します。
PrivateSubcmdClose_Click()
アンロードミー
EndSub
->