連載:VB 6ユーザーのための
これならマスターできるVB 2005超入門

第7回 リソースを使ったマルチ・リンガルなVBアプリケーション

羽山 博
2007/03/13
Page1 Page2 Page3

■フォームを表示し、設定内容を取得するためのコード

 ここまでで、既定のリソース・ファイルと英語用のリソース・ファイルが作成できた。かなり準備が長かったが、ようやくここからがダイアログ・ボックスとして利用するフォームの表示と、そのフォームでの設定に基づいて表示を変更するためのコードを書いていく。

 フォームをダイアログ・ボックスとして表示するコードは簡単。

フォーム名.ShowDialog()

と書けばよい。このShowDialogメソッドはなかなか便利なメソッドで、表示されたフォームでどのような入力結果が得られたかを戻り値として返してくれる。これを図解すると、図10のようになるだろう。


図10 フォーム(ダイアログ・ボックス)を表示し、結果を取得する
表示されたフォームでどのような入力結果が得られたかをメインのフォームで受け取ることができる。
  ShowDialogメソッドを使ってフォームを表示する。
  DialogResultプロパティに結果を代入する。
  Closeメソッドを使ってフォームを閉じる。
  DialogResultプロパティの値がShowDialogメソッドの戻り値として返される。

 実は、ダイアログ・ボックスとして作成したフォームには、結果をMe.DialogResultプロパティに代入するためのコードもあらかじめ記述されている。このコードは以下のようなものとなっている。

Private Sub OK_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click
  Me.DialogResult = System.Windows.Forms.DialogResult.OK
  Me.Close()
End Sub

Private Sub Cancel_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancel.Click
  Me.DialogResult = System.Windows.Forms.DialogResult.Cancel
  Me.Close()
End Sub
ダイアログ・ボックスでの操作の結果を設定し、フォームを閉じるコード
[OK]ボタンをクリックしたときのイベント・ハンドラと、[Cancel]ボタンをクリックしたときのイベント・ハンドラはあらかじめ記述されている。いずれも、ダイアログ・ボックスでの操作の結果を返す。

 コードを見ても分かるように、これらはダイアログ・ボックスでの設定値を返すためのものではなく、[OK]ボタンをクリックした、あるいは[Cancel]ボタンをクリックした、といった操作の結果を返すためのものである。

 従って、例えばダイアログ・ボックスのラジオ・ボタンの状態を知りたいときには、Visual Basic 6での方法と同じように、

If dlgOption.rbEnglish.Checked = True Then ……

といったコードをメインのフォーム側で書けばよい*

* ShowDialogメソッドによりフォームを表示している場合には、Closeメソッドを呼び出してもフォームが非表示になるだけで破棄されない。よってダイアログ・ボックスが閉じられた後でも、そのメンバにはアクセス可能だ。ただし、Disposeメソッドでフォームを破棄した場合には、ダイアログ・ボックスのメンバにはアクセスできなくなるので、フォームを破棄する前に値を取得しておく必要がある。

 以上のことを踏まえて、フォームをダイアログ・ボックスとして表示した後、設定内容を取得し、それに基づいてラベルの表示を変更するコードを書いてみよう。以下のコードは、メインのフォームのbtnOptionボタンをクリックしたときに実行されるイベント・ハンドラとして記述する。

Private Sub showOption(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOption.Click
  dlgOption.Location = New Point(Me.Location.X + 30, Me.Location.Y + 30)
  If dlgOption.ShowDialog() = Windows.Forms.DialogResult.OK Then
    If dlgOption.rbEnglish.Checked = True Then
      My.Application.ChangeUICulture("en")
    Else
      My.Application.ChangeUICulture("")
    End If
    lblMessage.Text = My.Resources.Msg1
    End If
End Sub
ダイアログ・ボックスを表示し、結果を取得するコード
  フォームの表示位置を決める。
  フォームをダイアログ・ボックスとして表示し、その戻り値を調べる。[OK]ボタンがクリックされたときのみ、以下のコードを実行する。
  [英語]ボタンが選択されているかどうかを調べる。選択されている場合のみ、以下のコードを実行する
  カルチャを“en”にする
  ラベルに文字列リソースの値を代入する

 フォームの位置を表すLocationプロパティは、Point構造体と呼ばれるデータ型でX位置とY位置をまとめて保持している。Location.X、Location.Yと記述すれば、それぞれX座標とY座標を取得できるが、これらの構造体のプロパティに直接代入することはできないので、メイン・フォームから30ピクセル右下の値を指定した新しいPoint構造体を作成し、それをLocationプロパティに設定している。

 以上でプログラムの完成だ。実行してみると、最初に示した図2の実行例のようになる。

■補足 〜 プロパティを使ってフォームの設定を取得する

 フォーム上に配置されたコントロールのプロパティは、すでに見たように、

フォーム名.コントロール名.プロパティ名

と記述すれば参照できる。しかし、変数の値などのそれ以外の設定値を、ほかのフォームから利用するにはこの方法は使えない。そのような場合には、Propertyプロシージャを記述し、新しいプロパティを定義しておくとよい。

 上の例と同じ処理だが、rbEnglishラジオ・ボタンの選択状態をプロパティとして定義する方法を見ておこう。ダイアログ・ボックスとして利用するフォームのコード・ウィンドウを表示し、

Public Property プロパティ名() As データ型

の形式で入力すると、Propertyプロシージャに必要な記述が自動的に挿入される。

 例えば、プロパティ名を“English”とし、データ型をBooleanとすれば、以下のコードのうち最初の1行を記述するだけで、残りのコードも挿入される。

Public Property English() As Boolean
  Get

  End Get
  Set(ByVal value As Boolean)

  End Set
End Property
プロパティを定義するためのコード
  の行を入力するだけで、残りの行が自動的に挿入される。

 なお、プロパティを読み出し専用にしたいのであれば、1行目の

Public Property

Public ReadOnly Property

に書き換え、SetからEnd Setまでを削除すればよい。今回の例でも、Englishプロパティは読み出し専用なので、最終的なコードは以下のように記述できる。

Public ReadOnly Property English() As Boolean
  Get
    Return rbEnglish.Checked
  End Get
End Property
[英語]が選択されているかどうかをプロパティとして返すコード
rbEnglishラジオ・ボタンのCheckedプロパティを返すだけでよい。Set 〜 End Setを書かない場合、ReadOnlyを忘れるとエラーになることに注意。

 このプロパティを利用するコードは以下のようになる。メイン・フォームで、[オプション]ボタンをクリックしたときのイベント・ハンドラを書き換えるとよい。

Private Sub showOption(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOption.Click
  dlgOption.Location = New Point(Me.Location.X + 30, Me.Location.Y + 30)
  If dlgOption.ShowDialog() = Windows.Forms.DialogResult.OK Then
    If dlgOption.English = True Then
      My.Application.ChangeUICulture("en")
    Else
      My.Application.ChangeUICulture("")
    End If
      lblMessage.Text = My.Resources.Msg1
  End If
End Sub
ダイアログ・ボックスを表示し、プロパティを取得するコード
  以外の記述はすでに示したものと同じ。 でdlgOptionフォームのEnglishプロパティを利用している。

 プロパティを定義すれば、フォーム上のコントロールのプロパティだけでなく、どのような値を返すこともできるし、逆に値を設定することもできる。複数のフォームを連携させるときには、フォームの属性として位置付けられる値を、安易にグローバルな変数とせず、プロパティとして定義しておけば、コードもすっきりするし、保守もしやすくなる。

結び − ぜひとも応用を

 今回は、リソースの利用と複数のフォームの利用という2つのテーマを軸に、カルチャの切り替えについても話を広げた。実際のところ、社内の業務に特化したプログラムであれば、多言語への対応は必要ないかもしれない。が、単純な方法では立ちゆかなくなったときにどのように解決するのか、という考え方を知ることはプラスになりこそすれ、無駄になることはないと思う。

 ともあれ、リソースはプログラムの開発や保守に威力を発揮するし、少しばかり実用的なプログラムになると、複数のフォームを使うことは珍しいことではない。今回のプログラムはシンプルなものだけに、使い回しも利くと思われる。ステップアップのために活用していただければありがたい。End of Article


 INDEX
  連載:VB 6ユーザーのためのこれならマスターできるVB 2005超入門
  第7回 リソースを使ったマルチ・リンガルなVBアプリケーション
    1.サンプル・プログラム9(前半) − 文字列リソースの値を取得する
    2.サンプル・プログラム9(後半) − ダイアログの設定により、利用するリソースを変える
  3.フォームを表示し、設定内容を取得するためのコード
 
インデックス・ページヘ  「これならマスターできるVB 2005超入門」


Insider.NET フォーラム 新着記事
  • 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH