C# Programming

Image

辞書検索 XML Webサービスを使う

開発環境: Visual Studio 2003 

1.目次

2.目的

JTBビジネストラベル・パイロット版(http://net.est.co.jp/jtb/about/)に続いて、
辞書データのXML Webサービス試験サイトを発見してしまいました。
どうも、新しいものを見ると、使ってみないときがすまないので、ほかのところがやりかけなのに、つい手を出してしまう ^^;
今度は、JTBビジネストラベル・パイロット版と違って、I/Fの簡単な説明だけで詳細な作り方が書いてなかったので、
作り方を忘れないようにメモっておきます。

Image

 

注意
この例では、AxWebBrowserを使用していますが、このコンポーネントを使うためには、Microsoft.mshtml.dllアセンブリが必要です。このファイルがないと、ファイルまたはアセンブリ名 Microsoft.mshtml、またはその依存関係の1つが見つかりませんでした。というエラーになってしまいます。.NET SDKやVS.NETをインストールしてください。

3.参考書

(1) XML Webサービス対応 三省堂デイリーコンサイス 体験版
参考:
日経BPパソコン・ベストムック「Webサービス完全ガイド」p64-67にも解説記事が掲載されているそうです。

4.基本的な使い方

作り方

1.WebDictionary という Windows.Forms プロジェクトを作ります。

2.ソリューション エクスプローラを開き、参照設定から Web 参照の追加を選択します。
 Image

3.Web参照の追加ダイアログが開きます。ここでアドレスにインターフェース定義(WSDL)のURLを入力します。   すると、次のような画面が表示されると思います。
 Image 4.このダイアログで、参照の追加ボタンを押します。   すると、ソリューションエクスプローラに、次のような Web References が追加されます。

Image

5.名前空間を追加する。
  ここからは、Webサービスを利用するコードを実装する必要があります。
  そのためには、まず名前空間を宣言する必要があります。
  この場合は、名前空間 + Web Reference で、WebDictionary.jp.co.est.btonic となるので、
  次の1行を追加します。

名前空間を追加
using WebDictionary.jp.co.est.btonic;
6.Web辞書検索サービスのインスタンスを作成します。
Web辞書検索サービスのインスタンス
private NetDicV06 netDicV06 = new NetDicV06();

7.辞書には3種類(英和、和英、国語)があるので、その辞書リストを取得します。
辞書リストの取得
bool success = netDicV06.GetDicList(out dicInfoList, out errorMessage);
8.検索します。
 検索では、複数ヒットする可能性があるので、何番目から、何個を取得するか。またその内容を何個まで取るかを指定できます。
 
検索の例
bool success = netDicV06.SearchDicItem(
                                dicID,                          // 辞書ID。辞書リストから取得できます。
                                searchText,                     // 検索語
                                ScopeOption.HEADWORD,           // 見出し語検索(HEADWORD)/索引語検索(KEYWORD)/全文検索(ANYWHERE)
                                MatchOption.CONTAIN,            // 完全一致(EXACT)/部分一致(CONTAIN)/前方一致(STARTWITH)/後方検索(ENDWITH)
                                FormatOption.HTML,              // HTML形式(V06はこれのみ)
                                ResourceOption.URI,             // バイナリデータの取得方式指定 ハイパーリンク(URI)で指定(V06はこれのみ)
                                CharsetOption.UNICODE,          // 使用文字セット指定
                                reqItemIndex,                   // 取得する辞書項目の開始インデックス
                                reqItemTitleCount,              // 取得する辞書項目の数
                                reqItemContentCount,            // 内容も同時に取得する辞書項目の数

                                out itemCountTotal,             // 見つかった辞書項目数(出力)
                                out itemCountInList,            // 実際に取得した辞書項目数(出力)
                                out itemList,                   // 辞書項目の配列(出力)
                                out errorMessage                // エラーメッセージ(出力)
                        );


9.検索結果を表示します。
検索結果を表示
foreach(DicItem dicItem in itemList)
     dicItem から値を表示する。

5.シンプルな辞書検索 Windows.Forms アプリの作成

あまり、手を加えると何をしているのだかわかりにくくなってしまうので、次のような単純なアプリを作りました。
検索は、あまり負荷をかけても申し訳ないので、10件までしかとってません。

感想
感想としては、試してみようと言っているのでお試し版なのでしょうが、説明が不十分です。

たとえば、GetDicListメソッドのリターン値(bool)の意味の説明がない。 false だとエラー?
例外があがるのかどうかの説明がない。どうしたらいいの?
Web辞書検索サービスのインスタンスをどのように取得するのか解説がない。
インターフェース仕様が不明確ですね。

などなど、推測したり、デバッガで確認しないと、実装できないです。

また、検索時にネットワーク障害があり接続できない、あるいは検索に時間がかかっているような
タイムアウト処理は、どうすればいいんでしょう?

ちゃんとした仕様書は別にあるのでしょうが、これだけの情報で実装するのは困難です。

Image

6.シンプルな辞書検索 Windows.Forms アプリのソースコード

2002/9/15 Ver.1.0
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using WebDictionary.jp.co.est.btonic;

namespace WebDictionary
{
        /// <summary>
        /// Form1 の概要の説明です。
        /// </summary>
        public class Form1 : System.Windows.Forms.Form
        {
                private NetDicV06 netDicV06 = null;                     // Web Service インスタンス
                private DicInfo[] dicInfoList = null;           // 辞書情報の配列(出力)
                private DicInfo   currentDict = null;           // 辞書
                private DicItem[] itemList = null;                      // 辞書項目の配列(出力)
                private string errorMessage;                            // エラーメッセージ

                private System.Windows.Forms.ComboBox cbDicInfo;
                private System.Windows.Forms.TextBox tbSearchText;
                private System.Windows.Forms.Button bSearch;
                private System.Windows.Forms.ListBox listBox1;
                private System.Windows.Forms.RichTextBox richTextBox1;
                private System.Windows.Forms.Label labelMessage;
                private System.Windows.Forms.Label label1;         //エラーメッセージ(出力)

                /// <summary>
                /// 必要なデザイナ変数です。
                /// </summary>
                private System.ComponentModel.Container components = null;

                public Form1()
                {
                        //
                        // Windows フォーム デザイナ サポートに必要です。
                        //
                        InitializeComponent();
                }

                /// <summary>
                /// 使用されているリソースに後処理を実行します。
                /// </summary>
                protected override void Dispose( bool disposing )
                {
                        if( disposing )
                        {
                                if (components != null) 
                                {
                                        components.Dispose();
                                }
                        }
                        base.Dispose( disposing );
                }

                #region Windows Form Designer generated code
                /// <summary>
                /// デザイナ サポートに必要なメソッドです。このメソッドの内容を
                /// コード エディタで変更しないでください。
                /// </summary>
                private void InitializeComponent()
                {
                        this.cbDicInfo = new System.Windows.Forms.ComboBox();
                        this.tbSearchText = new System.Windows.Forms.TextBox();
                        this.bSearch = new System.Windows.Forms.Button();
                        this.listBox1 = new System.Windows.Forms.ListBox();
                        this.richTextBox1 = new System.Windows.Forms.RichTextBox();
                        this.labelMessage = new System.Windows.Forms.Label();
                        this.label1 = new System.Windows.Forms.Label();
                        this.SuspendLayout();
                        // 
                        // cbDicInfo
                        // 
                        this.cbDicInfo.Location = new System.Drawing.Point(16, 16);
                        this.cbDicInfo.Name = "cbDicInfo";
                        this.cbDicInfo.Size = new System.Drawing.Size(296, 20);
                        this.cbDicInfo.TabIndex = 0;
                        this.cbDicInfo.SelectedIndexChanged += new System.EventHandler(this.OnDictionaryChanged);
                        // 
                        // tbSearchText
                        // 
                        this.tbSearchText.Location = new System.Drawing.Point(16, 56);
                        this.tbSearchText.Name = "tbSearchText";
                        this.tbSearchText.Size = new System.Drawing.Size(296, 19);
                        this.tbSearchText.TabIndex = 1;
                        this.tbSearchText.Text = "";
                        // 
                        // bSearch
                        // 
                        this.bSearch.Location = new System.Drawing.Point(336, 56);
                        this.bSearch.Name = "bSearch";
                        this.bSearch.TabIndex = 2;
                        this.bSearch.Text = "検索";
                        this.bSearch.Click += new System.EventHandler(this.bSearch_Click);
                        // 
                        // listBox1
                        // 
                        this.listBox1.ItemHeight = 12;
                        this.listBox1.Location = new System.Drawing.Point(16, 168);
                        this.listBox1.Name = "listBox1";
                        this.listBox1.Size = new System.Drawing.Size(168, 124);
                        this.listBox1.TabIndex = 4;
                        this.listBox1.SelectedIndexChanged += new System.EventHandler(this.OnSelectedIndexChanged);
                        // 
                        // richTextBox1
                        // 
                        this.richTextBox1.Location = new System.Drawing.Point(200, 168);
                        this.richTextBox1.Name = "richTextBox1";
                        this.richTextBox1.Size = new System.Drawing.Size(288, 128);
                        this.richTextBox1.TabIndex = 5;
                        this.richTextBox1.Text = "";
                        // 
                        // labelMessage
                        // 
                        this.labelMessage.Location = new System.Drawing.Point(24, 96);
                        this.labelMessage.Name = "labelMessage";
                        this.labelMessage.Size = new System.Drawing.Size(456, 23);
                        this.labelMessage.TabIndex = 6;
                        // 
                        // label1
                        // 
                        this.label1.Location = new System.Drawing.Point(208, 144);
                        this.label1.Name = "label1";
                        this.label1.Size = new System.Drawing.Size(48, 16);
                        this.label1.TabIndex = 7;
                        this.label1.Text = "意味";
                        // 
                        // Form1
                        // 
                        this.AutoScaleBaseSize = new System.Drawing.Size(5, 12);
                        this.ClientSize = new System.Drawing.Size(504, 310);
                        this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                                                                                                  this.label1,
                                                                                                                                                  this.labelMessage,
                                                                                                                                                  this.richTextBox1,
                                                                                                                                                  this.listBox1,
                                                                                                                                                  this.bSearch,
                                                                                                                                                  this.tbSearchText,
                                                                                                                                                  this.cbDicInfo});
                        this.Name = "Form1";
                        this.Text = "Form1";
                        this.Load += new System.EventHandler(this.Form1_Load);
                        this.ResumeLayout(false);

                }
                #endregion

                /// <summary>
                /// アプリケーションのメイン エントリ ポイントです。
                /// </summary>
                [STAThread]
                static void Main() 
                {
                        Application.Run(new Form1());
                }

                private void Form1_Load(object sender, System.EventArgs e)
                {
                        // Web辞書検索サービスのインスタンスを作成する。
                        this.netDicV06 = new NetDicV06();

                        // 辞書のリストを取得する。
                        bool success = netDicV06.GetDicList(out dicInfoList, out errorMessage);
                        #region ComboBox に辞書リストを設定する。
                        if (success)
                        {
                                foreach (DicInfo dicInfo in dicInfoList)
                                {
                                        int index = this.cbDicInfo.Items.Add(dicInfo.FullName);
                                }
                                this.cbDicInfo.SelectedIndex = 0;
                        }
                        else
                        {
                                MessageBox.Show("接続に失敗しました。",
                                        this.Text,      // キャプション
                                        MessageBoxButtons.OK, 
                                        MessageBoxIcon.Error);
                                Close();
                        }
                        #endregion
                }

                private void bSearch_Click(object sender, System.EventArgs e)
                {
                        DicInfo d = this.currentDict;
                        int reqItemIndex = 0;                   // 取得する辞書項目の開始インデックス
                        int reqItemTitleCount = 10;     // 取得する辞書項目の数
                        int reqItemContentCount = 10;   // 内容も同時に取得する辞書項目の数

                        int itemCountTotal;                             // 見つかった辞書項目数(出力)
                        int itemCountInList;                    // 実際に取得した辞書項目数(出力)

                        Cursor cursor = this.Cursor;
                        this.Cursor = Cursors.WaitCursor;       // Wait Cursor にする。

                        bool success = netDicV06.SearchDicItem(
                                d.DicID,                                        // 辞書ID
                                this.tbSearchText.Text,         // 検索語
                                ScopeOption.HEADWORD,           // 見出し語検索(HEADWORD)/索引語検索(KEYWORD)/全文検索(ANYWHERE)
                                MatchOption.CONTAIN,            // 完全一致(EXACT)/部分一致(CONTAIN)/前方一致(STARTWITH)/後方検索(ENDWITH)
                                FormatOption.HTML,                      // HTML形式(V06はこれのみ)
                                ResourceOption.URI,                     // バイナリデータの取得方式指定 ハイパーリンク(URI)で指定(V06はこれのみ)
                                CharsetOption.UNICODE,          // 使用文字セット指定
                                reqItemIndex,                           // 取得する辞書項目の開始インデックス
                                reqItemTitleCount,                      // 取得する辞書項目の数
                                reqItemContentCount,            // 内容も同時に取得する辞書項目の数

                                out itemCountTotal,                     // 見つかった辞書項目数(出力)
                                out itemCountInList,            // 実際に取得した辞書項目数(出力)
                                out itemList,                           // 辞書項目の配列(出力)
                                out errorMessage                        // エラーメッセージ(出力)
                        );

                        
                        this.Cursor = cursor;   // Cursor を元に戻す。

                        this.labelMessage.Text = itemCountTotal.ToString() + "件みつかりました。最大10件まで表示します。";

                        this.listBox1.Items.Clear();
                        foreach(DicItem dicItem in itemList)
                        {
                                this.listBox1.Items.Add(dicItem.Title);
                        }
                }

                // 辞書が変更になった。
                private void OnDictionaryChanged(object sender, System.EventArgs e)
                {
                        this.currentDict = this.dicInfoList[this.cbDicInfo.SelectedIndex];
                }

                // 検索結果のリストをセレクトしたので、詳細を表示する。
                private void OnSelectedIndexChanged(object sender, System.EventArgs e)
                {
                        this.richTextBox1.Text = this.itemList[this.listBox1.SelectedIndex].Body.InnerText;
                }
        }
}

7.辞書検索 Windows.Forms アプリの作成

これだと、ちょっとWeb版にくらべて、だいぶみおとりするので、もうちょっと手を加えて、

見出し検索、キーワード検索、全文検索
辞書バナーの表示
XML形式で、もうちょっとかっこよい表示

を追加しました。でも、かっちょわり〜〜〜。

Image

8.辞書検索 Windows.Forms アプリのソース


日付バージョンコメント
2002/9/16V1.0初期バージョン。意味の表示を HTML 一時ファイルに落として表示する方法。
2002/9/28V1.1意味の表示を オンメモリで表示する方法に変更。

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using WebDictionary.jp.co.est.btonic;

namespace WebDictionary
{
        /// <summary>
        /// Form1 の概要の説明です。
        /// </summary>
        public class Form1 : System.Windows.Forms.Form
        {
                private NetDicV06 netDicV06 = null;                     // Web Service インスタンス
                private DicInfo[] dicInfoList = null;           // 辞書情報の配列(出力)
                private DicInfo   currentDict = null;           // 辞書
                private DicItem[] itemList = null;                      // 辞書項目の配列(出力)

                private System.Windows.Forms.ComboBox cbDicInfo;
                private System.Windows.Forms.TextBox tbSearchText;
                private System.Windows.Forms.Button bSearch;
                private System.Windows.Forms.ListBox listBox1;
                private AxSHDocVw.AxWebBrowser axWebBrowser1;
                private System.Windows.Forms.StatusBar statusBar1;
                private System.Windows.Forms.ComboBox cbScope;
                private System.Windows.Forms.Label label2;
                private System.Windows.Forms.Label label1;
                private System.Windows.Forms.Label label3;
                private AxSHDocVw.AxWebBrowser axWebBrowser2;
                private System.Windows.Forms.StatusBarPanel statusBarPanel1;         //エラーメッセージ(出力)

                /// <summary>
                /// 必要なデザイナ変数です。
                /// </summary>
                private System.ComponentModel.Container components = null;

                public Form1()
                {
                        //
                        // Windows フォーム デザイナ サポートに必要です。
                        //
                        InitializeComponent();
                }

                /// <summary>
                /// 使用されているリソースに後処理を実行します。
                /// </summary>
                protected override void Dispose( bool disposing )
                {
                        if( disposing )
                        {
                                if (components != null) 
                                {
                                        components.Dispose();
                                }
                        }
                        base.Dispose( disposing );
                }

                #region Windows Form Designer generated code
                /// <summary>
                /// デザイナ サポートに必要なメソッドです。このメソッドの内容を
                /// コード エディタで変更しないでください。
                /// </summary>
                private void InitializeComponent()
                {
                        System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Form1));
                        this.cbDicInfo = new System.Windows.Forms.ComboBox();
                        this.tbSearchText = new System.Windows.Forms.TextBox();
                        this.bSearch = new System.Windows.Forms.Button();
                        this.listBox1 = new System.Windows.Forms.ListBox();
                        this.axWebBrowser1 = new AxSHDocVw.AxWebBrowser();
                        this.cbScope = new System.Windows.Forms.ComboBox();
                        this.statusBar1 = new System.Windows.Forms.StatusBar();
                        this.statusBarPanel1 = new System.Windows.Forms.StatusBarPanel();
                        this.label2 = new System.Windows.Forms.Label();
                        this.label1 = new System.Windows.Forms.Label();
                        this.label3 = new System.Windows.Forms.Label();
                        this.axWebBrowser2 = new AxSHDocVw.AxWebBrowser();
                        ((System.ComponentModel.ISupportInitialize)(this.axWebBrowser1)).BeginInit();
                        ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel1)).BeginInit();
                        ((System.ComponentModel.ISupportInitialize)(this.axWebBrowser2)).BeginInit();
                        this.SuspendLayout();
                        // 
                        // cbDicInfo
                        // 
                        this.cbDicInfo.Location = new System.Drawing.Point(72, 16);
                        this.cbDicInfo.Name = "cbDicInfo";
                        this.cbDicInfo.Size = new System.Drawing.Size(360, 20);
                        this.cbDicInfo.TabIndex = 0;
                        this.cbDicInfo.SelectedIndexChanged += new System.EventHandler(this.OnDictionaryChanged);
                        // 
                        // tbSearchText
                        // 
                        this.tbSearchText.Location = new System.Drawing.Point(72, 48);
                        this.tbSearchText.Name = "tbSearchText";
                        this.tbSearchText.Size = new System.Drawing.Size(144, 19);
                        this.tbSearchText.TabIndex = 1;
                        this.tbSearchText.Text = "";
                        // 
                        // bSearch
                        // 
                        this.bSearch.Location = new System.Drawing.Point(8, 120);
                        this.bSearch.Name = "bSearch";
                        this.bSearch.Size = new System.Drawing.Size(208, 64);
                        this.bSearch.TabIndex = 2;
                        this.bSearch.Text = "検索";
                        this.bSearch.Click += new System.EventHandler(this.bSearch_Click);
                        // 
                        // listBox1
                        // 
                        this.listBox1.ItemHeight = 12;
                        this.listBox1.Location = new System.Drawing.Point(8, 200);
                        this.listBox1.Name = "listBox1";
                        this.listBox1.Size = new System.Drawing.Size(208, 124);
                        this.listBox1.TabIndex = 4;
                        this.listBox1.SelectedIndexChanged += new System.EventHandler(this.OnSelectedIndexChanged);
                        // 
                        // axWebBrowser1
                        // 
                        this.axWebBrowser1.Enabled = true;
                        this.axWebBrowser1.Location = new System.Drawing.Point(232, 48);
                        this.axWebBrowser1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axWebBrowser1.OcxState")));
                        this.axWebBrowser1.Size = new System.Drawing.Size(200, 136);
                        this.axWebBrowser1.TabIndex = 10;
                        // 
                        // cbScope
                        // 
                        this.cbScope.Items.AddRange(new object[] {
                                                                                                                 "見出し語検索",
                                                                                                                 "キーワード検索",
                                                                                                                 "全文検索"});
                        this.cbScope.Location = new System.Drawing.Point(72, 80);
                        this.cbScope.Name = "cbScope";
                        this.cbScope.Size = new System.Drawing.Size(144, 20);
                        this.cbScope.TabIndex = 11;
                        // 
                        // statusBar1
                        // 
                        this.statusBar1.Location = new System.Drawing.Point(0, 344);
                        this.statusBar1.Name = "statusBar1";
                        this.statusBar1.Panels.AddRange(new System.Windows.Forms.StatusBarPanel[] {
                                                                                                                                                                                  this.statusBarPanel1});
                        this.statusBar1.ShowPanels = true;
                        this.statusBar1.Size = new System.Drawing.Size(448, 22);
                        this.statusBar1.SizingGrip = false;
                        this.statusBar1.TabIndex = 12;
                        // 
                        // statusBarPanel1
                        // 
                        this.statusBarPanel1.Width = 400;
                        // 
                        // label2
                        // 
                        this.label2.Location = new System.Drawing.Point(8, 80);
                        this.label2.Name = "label2";
                        this.label2.Size = new System.Drawing.Size(56, 16);
                        this.label2.TabIndex = 13;
                        this.label2.Text = "検索範囲";
                        // 
                        // label1
                        // 
                        this.label1.Location = new System.Drawing.Point(8, 48);
                        this.label1.Name = "label1";
                        this.label1.Size = new System.Drawing.Size(56, 16);
                        this.label1.TabIndex = 14;
                        this.label1.Text = "検索語句";
                        // 
                        // label3
                        // 
                        this.label3.Location = new System.Drawing.Point(8, 16);
                        this.label3.Name = "label3";
                        this.label3.Size = new System.Drawing.Size(56, 16);
                        this.label3.TabIndex = 15;
                        this.label3.Text = "辞書選択";
                        // 
                        // axWebBrowser2
                        // 
                        this.axWebBrowser2.Enabled = true;
                        this.axWebBrowser2.Location = new System.Drawing.Point(232, 200);
                        this.axWebBrowser2.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axWebBrowser2.OcxState")));
                        this.axWebBrowser2.Size = new System.Drawing.Size(200, 128);
                        this.axWebBrowser2.TabIndex = 16;
                        this.axWebBrowser2.DocumentComplete += new AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEventHandler(this.OnDocumentComplete);
                        // 
                        // Form1
                        // 
                        this.AcceptButton = this.bSearch;
                        this.AutoScaleBaseSize = new System.Drawing.Size(5, 12);
                        this.ClientSize = new System.Drawing.Size(448, 366);
                        this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                                                                                                  this.axWebBrowser2,
                                                                                                                                                  this.label3,
                                                                                                                                                  this.label1,
                                                                                                                                                  this.label2,
                                                                                                                                                  this.statusBar1,
                                                                                                                                                  this.cbScope,
                                                                                                                                                  this.axWebBrowser1,
                                                                                                                                                  this.listBox1,
                                                                                                                                                  this.bSearch,
                                                                                                                                                  this.tbSearchText,
                                                                                                                                                  this.cbDicInfo});
                        this.Name = "Form1";
                        this.Text = "辞書検索 Web Service";
                        this.Load += new System.EventHandler(this.Form1_Load);
                        ((System.ComponentModel.ISupportInitialize)(this.axWebBrowser1)).EndInit();
                        ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel1)).EndInit();
                        ((System.ComponentModel.ISupportInitialize)(this.axWebBrowser2)).EndInit();
                        this.ResumeLayout(false);

                }
                #endregion

                /// <summary>
                /// アプリケーションのメイン エントリ ポイントです。
                /// </summary>
                [STAThread]
                static void Main() 
                {
                        Application.Run(new Form1());
                }

                private void Form1_Load(object sender, System.EventArgs e)
                {
                        // Web辞書検索サービスのインスタンスを作成する。
                        this.netDicV06 = new NetDicV06();

                        string errorMessage;                            // エラーメッセージ

                        // 辞書のリストを取得する。
                        bool success = netDicV06.GetDicList(out dicInfoList, out errorMessage);
                        #region ComboBox に辞書リストを設定する。
                        if (success)
                        {
                                foreach (DicInfo dicInfo in dicInfoList)
                                {
                                        int index = this.cbDicInfo.Items.Add(dicInfo.FullName);
                                }
                                this.cbDicInfo.SelectedIndex = 0;
                        }
                        else
                        {
                                this.statusBarPanel1.Text = errorMessage;
                                MessageBox.Show("接続に失敗しました。",
                                        this.Text,      // キャプション
                                        MessageBoxButtons.OK, 
                                        MessageBoxIcon.Error);
                                Close();
                        }
                        
                        this.cbScope.SelectedIndex = 0;
                        #endregion
                }

                private void bSearch_Click(object sender, System.EventArgs e)
                {
                        DicInfo d = this.currentDict;
                        int reqItemIndex = 0;                   // 取得する辞書項目の開始インデックス
                        int reqItemTitleCount = 10;             // 取得する辞書項目の数
                        int reqItemContentCount = 10;   // 内容も同時に取得する辞書項目の数

                        int itemCountTotal;                             // 見つかった辞書項目数(出力)
                        int itemCountInList;                    // 実際に取得した辞書項目数(出力)
                        string errorMessage;                    // エラーメッセージ

                        ScopeOption scopeOption = ScopeOption.HEADWORD;
                        switch (this.cbScope.SelectedIndex)
                        {
                                case 0:
                                        scopeOption = ScopeOption.HEADWORD;
                                        break;
                                case 1:
                                        scopeOption = ScopeOption.KEYWORD;
                                        break;
                                case 2:
                                        scopeOption = ScopeOption.ANYWHERE;
                                        break;
                        }

                        Cursor cursor = this.Cursor;
                        this.Cursor = Cursors.WaitCursor;       // Wait Cursor にする。

                        bool success = netDicV06.SearchDicItem(
                                d.DicID,                                        // 辞書ID
                                this.tbSearchText.Text,         // 検索語
                                scopeOption,                            // 見出し語検索(HEADWORD)/索引語検索(KEYWORD)/全文検索(ANYWHERE)
                                MatchOption.CONTAIN,            // 完全一致(EXACT)/部分一致(CONTAIN)/前方一致(STARTWITH)/後方検索(ENDWITH)
                                FormatOption.HTML,                      // HTML形式(V06はこれのみ)
                                ResourceOption.URI,                     // バイナリデータの取得方式指定 ハイパーリンク(URI)で指定(V06はこれのみ)
                                CharsetOption.UNICODE,          // 使用文字セット指定
                                reqItemIndex,                           // 取得する辞書項目の開始インデックス
                                reqItemTitleCount,                      // 取得する辞書項目の数
                                reqItemContentCount,            // 内容も同時に取得する辞書項目の数

                                out itemCountTotal,                     // 見つかった辞書項目数(出力)
                                out itemCountInList,            // 実際に取得した辞書項目数(出力)
                                out itemList,                           // 辞書項目の配列(出力)
                                out errorMessage                        // エラーメッセージ(出力)
                                );

                        if (success)
                                this.statusBarPanel1.Text = itemCountTotal.ToString() + "件みつかりました。最大10件まで表示します。";
                        else
                                this.statusBarPanel1.Text = errorMessage;

                        this.Cursor = cursor;   // Cursor を元に戻す。


                        this.listBox1.Items.Clear();
                        foreach(DicItem dicItem in itemList)
                        {
                                this.listBox1.Items.Add(dicItem.Title);
                        }
                }

                // 辞書が変更になった。
                private void OnDictionaryChanged(object sender, System.EventArgs e)
                {
                        this.currentDict = this.dicInfoList[this.cbDicInfo.SelectedIndex];
                        object flags = null;
                        object targetFrameName = null;
                        object postData = null;
                        object headers = null;

                        this.axWebBrowser1.Navigate(this.currentDict.LogoURL, ref flags, ref targetFrameName, ref postData, ref headers);
                }

                // 以下のコードは、C# メイリングリスト CS:02128 を参考にしてください。
                // 皆さんよく知ってますね!
                // ちょっとトリッキーだけど、一時ファイルに落とさないだけまし。
                //
                // Body.InnerXml で、単語の意味が HTML の body 部分が返される。
                // その文字列を AxSHDocVw.AxWebBrowser で、HTML 表示する。
                // このとき、HTML ストリングを一時ファイルに落とさず、メモリ上で処理する。
                //
                // mshtml.IHTMLDocument2 は参照の追加が必要です。
                // tlbiml を使う必要はなく、
                // 参照の追加より、C:\WINDOWS\system32\mshtml.tlb を追加すればOK。

                private mshtml.IHTMLDocument2 document;
                private string htmlString;
                // 検索結果のリストをセレクトしたので、詳細を表示する。
                private void OnSelectedIndexChanged(object sender, System.EventArgs e)
                {
                        htmlString = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">" +
                                        "<HTML><HEAD>" +
                                        "<META http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\">" +
                                        "</HEAD><BODY>" + 
                                        this.itemList[this.listBox1.SelectedIndex].Body.InnerXml + 
                                        "</BODY></HTML>";
                        
                        object o = null;
                        this.axWebBrowser2.Navigate("about:blank", ref o,ref o, ref o, ref o);
                        // Navigate ("about:blank"...) を呼び出し、OnDocumentComplete イベントを発生させる。
                        // OnDocumentComplete イベント中で、htmlString を IHTMLDocument2 インターフェースの 
                        // Document プロパティにライトすることにより、HTML ドキュメントを書き換えてしまう。
                }

                private void OnDocumentComplete(object sender, AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEvent e)
                {
                        document = (mshtml.IHTMLDocument2)this.axWebBrowser2.Document;
                        document.write(htmlString);
                }
        }
}