はじめに
アプリケーションやWebページなどでは、住所や氏名データを入力する際に自動的にふりがなを入力したり、郵便番号から住所を検索して表示したりするものがあります。
このような機能を自分のプログラムに実装したいと思っていましたが、簡単にはできないことが分かり諦めていたところ、InputMan for Windows Forms 5.0Jのコンポーネントの中に、これらの機能を手軽に組み込めるものがあることが分かりました。
そこで、GcTextBox、GcIme、GcAddressコンポーネントを使い、住所と氏名を入力する際に、ふりがなの自動入力と郵便番号から住所を検索して入力するフォームを作成してみました。
対象読者
Visual Basic 2005またはVisual C# 2005を使ってプログラムを作ったことのある人。
必要な環境
Visual Basic 2005またはVisual C# 2005、Visual Studio 2005でプログラムが作れる環境。
なお、本プログラムはWindows Vista上で動作するVisual Studioを使用して作成し動作確認を行っています。
プログラム実行時の注意事項
InputMan for Windows Forms 5.0Jを使って作成したアプリケーションを配布する場合、InputMan for Windows Forms 5.0Jのアセンブリファイルを添付する必要があります。これは、Common Language RuntimeのDLLをアプリケーションと一緒に配布するのと同じです。アプリケーションを正常に動作させるためには、次の4つのファイルをインストールする必要があります。
- GrapeCity.Framework.InputMan.v20.dll…フレームワークアセンブリ
- GrapeCity.Win.Editors.V50.dll…本体コンポーネント
- GrapeCity.Framework.InputMan.v20.resources.dll…フレームワークアセンブリのサテライトリソース
- GrapeCity.Win.Editors.V50.resources.dll…本体コンポーネントのサテライトリソース
これらのファイルを、プログラムを実行するBinフォルダに格納します。 .NET Framework 2.0から追加されたクラスやメンバを使用しているので、.NET Framework 2.0がインストールされていることが必須条件です。
また、今回は郵便番号から住所を検索する機能を使うため、住所検索コンポーネントの検索機能および辞書は、株式会社システム・ビットの製品「DB Entry」を利用しています。
この「DB Entry」を利用できるようにするために、『DB Entry .NET』のランタイムファイルと辞書ファイルをインストールする必要があります。また、動作対象のコンピュータごとに、DB Entry環境設定(SystemBit.DBEInit.v10.exe)を使い、ライセンス情報と辞書ファイル設定のレジストリ登録を行う必要があります。
そこで、バイナリ実行ファイルに同梱されているフォルダ「DBENET20」を、プログラムを実行するBinフォルダに格納します。このフォルダには、次のファイルが格納されています。
1.BINフォルダ-検索エンジン
- SystemBit.DBETel.v20.dll…電話番号検索エンジン
- SystemBit.DBEZip.v20.dll…市外市内局番・郵便番号検索エンジン
- SystemBit.DBEInit.v20.exe…DB Entry .NET 環境設定プログラム
2.DICフォルダ-辞書ファイル
- 市外市内局番・郵便番号辞書
- 電話番号辞書
フォルダをコピーしたら、DB Entry.NET 環境設定プログラム「SystemBit.DBEInit.v20.exe」を起動し、辞書ファイルのパス名を設定してください。
コンポーネントのインストール
はじめてInputMan for Windows Forms 5.0Jを使用する方は、プロジェクトにInputMan for Windows Forms 5.0Jをインストールする必要があります。
インストーラは、グレープシティのWebページからダウンロードできますので、ここからダウンロードしてインストールしてください。製品ページ左側の[ダウンロード]-[トライアル版]をクリックし、ダウンロード方法([FTP]または[HTTP])を選択すれば入手できます。ファイルはZip形式で圧縮されています。
有償のコンポーネントですが、プロダクトキーを入力せずにインストールすることで、トライアル版として使用できます。制限事項などの詳細については、インストーラに同梱されているリリースノートを参照ください。
コントロールの追加
InputMan for Windows Forms 5.0Jをインストールしたら、ツールボックスに専用のタブを作成し、InputMan for Windows Forms 5.0Jコンポーネントを追加します。今回追加するコンポーネントは、「.NET Frameworkコンポーネント」の「名前空間」が「GrapeCity.Win.Editors」で始まる名前空間のコンポーネント「GcTextBox」「GcIme」「GcAddress」です。
GUIの作成
今回は、2つのフォームを利用します。
1
最初のフォーム[Form1]には、画面にあるコンポーネントと、[GcIme][GcAddress]を配置します。これらのコンポーネントは、ユーザーとの対話機能は持たず、プロセスだけを提供します。
2
[GcTextBox]の場合は、タスクトレイを開き、「サイドボタンの編集」メニューを選びます。ダイアログが表示されるので、[追加]ボタンを押してサイドボタンを追加し、[Text]プロパティでボタンの文字を、[ButtonWidth]プロパティでボタンの幅を設定しておきます。
3
フォーム[Form2]はラベルとボタンを配置しておきます。
ふりがな(半角のカタカナ)自動入力機能の設定
ふりがな自動入力機能は、GcImeコンポーネントが担当します。このコンポーネントは、InputMan for Windows Forms 5.0Jのコンポーネントはもちろん、標準のコントロールやサードパーティ製のコントロールに対し、自動ふりがな入力機能を提供します。
例えば、GcTextBoxコンポーネントを配置し、さらにGcImeコンポーネントをフォームに配置すると、GcTextBoxコンポーネントに「ReadingStringOutput」プロパティが追加されます。このプロパティを展開し、「TargetControl」でふりがなを入力したいコントロールを指定すると、指定されたコントロールに半角カタカナのふりがなが自動的に入力されます。
このプログラムでは、「氏名」を入力するGcTextBoxコンポーネント「GcTextBox2」の「ReadingStringOutput」プロパティに、ふりがなを表示するコンポーネントとして「GcTextBox1」を指定します。
すると、「GcTextBox2」に漢字で氏名を入力していくと、漢字が確定した時点でふりがなが「GcTextBox1」に入力されていきます。
このように、プロパティで入力対象のコンポーネントを指定するだけで、自動的にふりがなを入力してくれます。
なお、OutputModeプロパティを使用すると、ふりがなの入力方法を設定できます。デフォルトはAppendです。
項目 | 設定内容 |
Append | コントロールの内容の末尾にふりがなを追加します |
Replace | コントロールの内容を上書きしてふりがなを表示します |
GcTextBoxコンポーネントのサイドボタン機能の設定
GcTextBoxコンポーネントには、入力フィールドにボタンやスピンボタン、ドロップダウンボタンを設定することができます。今回は、「氏名」入力用のGcTextBoxコンポーネントにサイドボタンを1つ設定し、入力内容をクリアする処理を組み込んでみました。
サイドボタンのイベントハンドラを使うには、フォームエディタ上でサイドボタンをダブルクリックします。Clickイベントハンドラが作成されるので、ここに処理を記述します。
Imports GrapeCity.Win.Editors Public Class Form1 Private Sub SideButton1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles SideButton1.Click Me.GcTextBox1.Text = "" Me.GcTextBox2.Text = "" End Sub
private void sideButton1_Click(object sender, EventArgs e) { gcTextBox1.Text = ""; gcTextBox2.Text = ""; }
郵便番号-住所変換機能の設定
今度は、郵便番号を入力すると自動的に住所に変換して入力する機能を設定します。これも、プロパティを設定するだけで簡単に実現できます。さらに、プロパティの設定によって、住所にもふりがなを自動的に入力できます。使い方はとっても簡単で、GcAddressコンポーネントをフォームに配置すると、InputMan for Windows Forms 5.0Jの各入力コンポーネントに、「GcAddress1のFindAddressSetting」というプロパティが追加されます。
このプロパティを展開し、「AddressOutput」プロパティで変換した住所を出力するコンポーネントを指定し、「AddressReadStringOutput」プロパティにそのふりがなを出力するコンポーネントを指定するだけです。
また、「FindAddressMode」プロパティを使用すると、住所検索を郵便番号、電話番号、全国地方公共団体コード(JIS X 0401)のどれで行うのかを指定できます。
値 | 内容 |
0 | ByZipCode 郵便番号をキーとして使用 |
1 | ByPhoneNumber 電話番号をキーとして使用 |
2 | ByCityCode 全国地方公共団体コード(JIS X 0401)をキーとして使用 |
なお、「住所」用GcTextBoxコンポーネント(GcTextBox5)には、「クリア」サイドボタンに加え、「転送」サイドボタンを追加しています。
このボタンでは、名前と住所の入力内容をフォームForm2のラベルで表示する処理を組み込んでいます。
Private Sub SideButton2_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles SideButton2.Click Form2.Label2.Text = Me.GcTextBox1.Text Form2.Label3.Text = Me.GcTextBox2.Text Form2.Label5.Text = Me.GcTextBox3.Text Form2.Label7.Text = Me.GcTextBox4.Text Form2.Label9.Text = Me.GcTextBox5.Text Form2.Show() End Sub Private Sub SideButton3_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles SideButton3.Click Me.GcTextBox3.Text = "" Me.GcTextBox4.Text = "" Me.GcTextBox5.Text = "" End Sub
private void sideButton2_Click(object sender, EventArgs e) { Form2 fm2 = new Form2(); fm2.label2.Text = gcTextBox1.Text; fm2.label3.Text = gcTextBox2.Text; fm2.label5.Text = gcTextBox3.Text; fm2.label7.Text = gcTextBox4.Text; fm2.label9.Text = gcTextBox5.Text; fm2.Show(); } private void sideButton3_Click(object sender, EventArgs e) { gcTextBox3.Text = ""; gcTextBox4.Text = ""; gcTextBox5.Text = ""; }
郵便番号-住所の連続変換処理の作成
大量の住所データを処理するなら、コードから変換処理をした方が圧倒的に効率的だろうと思い、今度はコードからGcAddressコンポーネントを作成し、複数の郵便番号を一括して住所に変換し、リストボックスで表示する処理を作成してみました。
GetCustomerInfoFromZipNumberメソッドの実行
ここでは、サブプロシージャ(独自のメソッド)「search」を作成し、郵便番号の連続変換を行うようにしています。メソッドの引数は1つで、郵便番号を文字列で指定します。
郵便番号から住所を検索するには、GcAddressクラスのGetCustomerInfoFromZipNumberメソッドを使用します。第1引数に郵便番号を指定すると、検索結果を第2引数に指定した構造体「GcAddress.CustomerInfo」クラスのメンバに格納します。
メソッドの実行に成功するとTrueを、失敗するとFalseを返してきます。
Private Sub search(ByVal zipcode As String) Dim jusyo As GcAddress.CustomerInfo Dim result As Boolean Dim GcAddress2 As New GcAddress() Dim data As String = "" jusyo = New GcAddress.CustomerInfo() result = GcAddress2.GetCustomerInfoFromZipNumber(zipcode, jusyo)
private void search(String zipcode){ GcAddress.CustomerInfo jusyo; Boolean result; GcAddress gcAddress2 = new GcAddress(); String data = ""; jusyo = new GcAddress.CustomerInfo(); result = gcAddress2.GetCustomerInfoFromZipNumber(zipcode, ref jusyo);
取得した住所データを取り出す処理
住所が検索されると、CustomerInfoクラスのZipCodeフィールドには郵便番号が、Addressフィールド(構造体)には住所データが格納されます。
Address構造体では、以下のフィールドに別れてデータが格納されるので、これを取り出してリストボックスに組み込みます。
Prefecture | 都道府県名 |
City | 市 |
Town | 町 |
If result = False Then data = "住所がみつかりません: 〒" + zipcode Else data = "〒" & jusyo.ZipCode.Substring(0, 3) & "-" & _ jusyo.ZipCode.Substring(3) & " " & _ jusyo.Address.Prefecture & _ jusyo.Address.City & _ jusyo.Address.Town End If Me.ListBox1.Items.Add(data)
if(result == false){ data = "住所がみつかりません: 〒" + zipcode; }else{ data = "〒" + jusyo.ZipCode.Substring(0, 3) + "-" + jusyo.ZipCode.Substring(3) + " " + jusyo.Address.Prefecture + jusyo.Address.City + jusyo.Address.Town; } listBox1.Items.Add(data);
サブプロシージャ(メソッド)searchの実行
後は、ボタンのClickイベントハンドラでサブプロシージャ(メソッド)searchを実行します。このとき、郵便番号は「xxx-xxxx」と前3桁と後4桁を「-」(半角のハイフン)で区切り、空白が入らないように指定します。郵便番号に空白が入ると、正しい検索が行われませんので注意してください。
なお、サンプルプログラムでは、動作確認のためにエラー用データも入れて検索を実行しています。
Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click '郵便番号に空白を入れないこと Call search("000-0000") 'エラー用データ Call search("617-0814") Call search("245-0001") Call search("173-0004") Call search("657-0053") Call search("540-0036") Call search("812-0068") Call search("722-0221") End Sub
private void button1_Click(object sender, EventArgs e) { //郵便番号に空白を入れないこと search("000-0000"); //エラー用データ search("617-0814"); search("245-0001"); search("173-0004"); search("657-0053"); search("540-0036"); search("812-0068"); search("722-0221"); }
まとめ
ふりがなと住所の自動入力機能は、業務用アプリケーションに組み込むととてもユーザーフレンドリーな操作性を提供しますので、ぜひ取り入れたい機能ですが、自作するとなるとかなり大変です。
GcAddressコンポーネントであれば、住所データベースもセットで簡単に使えます。また、GcImeコンポーネントであれば、標準コントロールも含めてふりがな入力機能を実現できるようになります。大幅に開発工数を削減することもできますので、利用しない手はないでしょう。