連載:VB 6ユーザーのための
|
|
|
■フォームを表示し、設定内容を取得するためのコード
ここまでで、既定のリソース・ファイルと英語用のリソース・ファイルが作成できた。かなり準備が長かったが、ようやくここからがダイアログ・ボックスとして利用するフォームの表示と、そのフォームでの設定に基づいて表示を変更するためのコードを書いていく。
フォームをダイアログ・ボックスとして表示するコードは簡単。
フォーム名.ShowDialog()
と書けばよい。このShowDialogメソッドはなかなか便利なメソッドで、表示されたフォームでどのような入力結果が得られたかを戻り値として返してくれる。これを図解すると、図10のようになるだろう。
図10 フォーム(ダイアログ・ボックス)を表示し、結果を取得する | ||||||||||||
表示されたフォームでどのような入力結果が得られたかをメインのフォームで受け取ることができる。
|
実は、ダイアログ・ボックスとして作成したフォームには、結果をMe.DialogResultプロパティに代入するためのコードもあらかじめ記述されている。このコードは以下のようなものとなっている。
| |
ダイアログ・ボックスでの操作の結果を設定し、フォームを閉じるコード | |
[OK]ボタンをクリックしたときのイベント・ハンドラと、[Cancel]ボタンをクリックしたときのイベント・ハンドラはあらかじめ記述されている。いずれも、ダイアログ・ボックスでの操作の結果を返す。 |
コードを見ても分かるように、これらはダイアログ・ボックスでの設定値を返すためのものではなく、[OK]ボタンをクリックした、あるいは[Cancel]ボタンをクリックした、といった操作の結果を返すためのものである。
従って、例えばダイアログ・ボックスのラジオ・ボタンの状態を知りたいときには、Visual Basic 6での方法と同じように、
If dlgOption.rbEnglish.Checked = True Then ……
といったコードをメインのフォーム側で書けばよい*。
* ShowDialogメソッドによりフォームを表示している場合には、Closeメソッドを呼び出してもフォームが非表示になるだけで破棄されない。よってダイアログ・ボックスが閉じられた後でも、そのメンバにはアクセス可能だ。ただし、Disposeメソッドでフォームを破棄した場合には、ダイアログ・ボックスのメンバにはアクセスできなくなるので、フォームを破棄する前に値を取得しておく必要がある。 |
以上のことを踏まえて、フォームをダイアログ・ボックスとして表示した後、設定内容を取得し、それに基づいてラベルの表示を変更するコードを書いてみよう。以下のコードは、メインのフォームのbtnOptionボタンをクリックしたときに実行されるイベント・ハンドラとして記述する。
| |||||||||||||||
ダイアログ・ボックスを表示し、結果を取得するコード | |||||||||||||||
|
フォームの位置を表すLocationプロパティは、Point構造体と呼ばれるデータ型でX位置とY位置をまとめて保持している。Location.X、Location.Yと記述すれば、それぞれX座標とY座標を取得できるが、これらの構造体のプロパティに直接代入することはできないので、メイン・フォームから30ピクセル右下の値を指定した新しいPoint構造体を作成し、それをLocationプロパティに設定している。
以上でプログラムの完成だ。実行してみると、最初に示した図2の実行例のようになる。
■補足 〜 プロパティを使ってフォームの設定を取得する
フォーム上に配置されたコントロールのプロパティは、すでに見たように、
フォーム名.コントロール名.プロパティ名
と記述すれば参照できる。しかし、変数の値などのそれ以外の設定値を、ほかのフォームから利用するにはこの方法は使えない。そのような場合には、Propertyプロシージャを記述し、新しいプロパティを定義しておくとよい。
上の例と同じ処理だが、rbEnglishラジオ・ボタンの選択状態をプロパティとして定義する方法を見ておこう。ダイアログ・ボックスとして利用するフォームのコード・ウィンドウを表示し、
Public Property プロパティ名() As データ型
の形式で入力すると、Propertyプロシージャに必要な記述が自動的に挿入される。
例えば、プロパティ名を“English”とし、データ型をBooleanとすれば、以下のコードのうち最初の1行を記述するだけで、残りのコードも挿入される。
| |||
プロパティを定義するためのコード | |||
|
なお、プロパティを読み出し専用にしたいのであれば、1行目の
Public Property
を
Public ReadOnly Property
に書き換え、SetからEnd Setまでを削除すればよい。今回の例でも、Englishプロパティは読み出し専用なので、最終的なコードは以下のように記述できる。
| |
[英語]が選択されているかどうかをプロパティとして返すコード | |
rbEnglishラジオ・ボタンのCheckedプロパティを返すだけでよい。Set 〜 End Setを書かない場合、ReadOnlyを忘れるとエラーになることに注意。 |
このプロパティを利用するコードは以下のようになる。メイン・フォームで、[オプション]ボタンをクリックしたときのイベント・ハンドラを書き換えるとよい。
| |||
ダイアログ・ボックスを表示し、プロパティを取得するコード | |||
|
プロパティを定義すれば、フォーム上のコントロールのプロパティだけでなく、どのような値を返すこともできるし、逆に値を設定することもできる。複数のフォームを連携させるときには、フォームの属性として位置付けられる値を、安易にグローバルな変数とせず、プロパティとして定義しておけば、コードもすっきりするし、保守もしやすくなる。
結び − ぜひとも応用を
今回は、リソースの利用と複数のフォームの利用という2つのテーマを軸に、カルチャの切り替えについても話を広げた。実際のところ、社内の業務に特化したプログラムであれば、多言語への対応は必要ないかもしれない。が、単純な方法では立ちゆかなくなったときにどのように解決するのか、という考え方を知ることはプラスになりこそすれ、無駄になることはないと思う。
ともあれ、リソースはプログラムの開発や保守に威力を発揮するし、少しばかり実用的なプログラムになると、複数のフォームを使うことは珍しいことではない。今回のプログラムはシンプルなものだけに、使い回しも利くと思われる。ステップアップのために活用していただければありがたい。
INDEX | ||
連載:VB 6ユーザーのためのこれならマスターできるVB 2005超入門 | ||
第7回 リソースを使ったマルチ・リンガルなVBアプリケーション | ||
1.サンプル・プログラム9(前半) − 文字列リソースの値を取得する | ||
2.サンプル・プログラム9(後半) − ダイアログの設定により、利用するリソースを変える | ||
3.フォームを表示し、設定内容を取得するためのコード | ||
「これならマスターできるVB 2005超入門」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|
- - PR -