2010年5月19日水曜日

英字ドキュメント読み支援ツール その4

今回のお題は、メインメニュー、カスタムダイアログ、設定外部ファイル化、ユーザ設定永続化、ユーザ設定のリセット。
まず、設定外部ファイル化から。以下の画面から、



ソリューションエクスプローラのプロジェクトアイコンを右クリック→プロパティでプロジェクトのプロパティを開く。次に、設定タブをクリック。
設定で、
名前/型/スコープ/値を
Splitter1Distance/int/ユーザー/600
Splitter2Distance/int/ユーザー/800
Web1Url/string/ユーザー/PDFファイルパス
Web2Url/string/ユーザー/翻訳ページ1Url
Web3Url/string/ユーザー/翻訳ページ2Url

を設定した後、[Ctrl]+Sで保存(上のタブの*マーク(編集中)を外す。)


で、ユーザー設定が完了。
次はプログラムでこの設定を使います。

Form1の青いタイトルバーをダブルクリックして、Loadイベントハンドラを記述。ここで、ユーザ設定を利用して設定することにします。

private void Form1_Load(object sender, EventArgs e)
{
splitContainer1.SplitterDistance = Properties.Settings.Default.Splitter1Distance;
splitContainer2.SplitterDistance = Properties.Settings.Default.Splitter2Distance;
webBrowser1.Url = new Uri(Properties.Settings.Default.Web1Url);
webBrowser2.Url = new Uri(Properties.Settings.Default.Web2Url);
webBrowser3.Url = new Uri(Properties.Settings.Default.Web3Url);
}

後は、先回デザイナー画面で設定したWebBrower1,2,3のUrlを空にして実行してもそれなりに表示されることを確認。


続いて、メインメニューを追加。


Form1の青いタイトルバーをクリックし、Form1を選択した状態で、
ツールボックス→メニューとツールバー→MenuStripダブルクリック。


もし、WebBrower1の垂直スクロールバーの上の△がメニューに被っていたら、ドキュメントアウトラインを使って、以下の画面のように、SplitContainer2を、menuStrip1の上にくるようにドラッグ&ドロップ操作する。



メニューに「設定」を追加


プロパティウィンドウで、コントロール名(name)が「設定ToolStripMenuItem」と変な感じになっているので、「SettingMenuItem」に変更。



次に、設定ダイアログを作成します。

ソリューションエクスプローラのWindowsフォームプロジェクト(WindowsFormsApplication44)を右クリック→追加→Windowフォームをクリックする。



そのままFowm2.csを追加する。

Form2のウィンドウを引き延ばして、TextBoxを3つボタンを3つつける。
button1.Textを「設定初期化」button2.Textを「保存」、button3.Textを「キャンセル」にする。



Form2の青いタイトルバーをダブルクリックし、以下のコードを追加。

private void Form2_Load(object sender, EventArgs e)
{
textBox1.Text = Properties.Settings.Default.Web1Url;
textBox2.Text = Properties.Settings.Default.Web2Url;
textBox3.Text = Properties.Settings.Default.Web3Url;
}

「設定初期化」ボタンをダブルクリックして、以下のコードを追加。
private void button1_Click(object sender, EventArgs e)
{
Properties.Settings.Default.Reset();
textBox1.Text = Properties.Settings.Default.Web1Url;
textBox2.Text = Properties.Settings.Default.Web2Url;
textBox3.Text = Properties.Settings.Default.Web3Url;
DialogResult = DialogResult.OK;
}

「保存」ボタンをダブルクリックして、以下のコードを追加。
private void button2_Click(object sender, EventArgs e)
{
Properties.Settings.Default.Web1Url = textBox1.Text;
Properties.Settings.Default.Web2Url = textBox2.Text;
Properties.Settings.Default.Web3Url = textBox3.Text;
Properties.Settings.Default.Save();
DialogResult = DialogResult.OK;
}

「キャンセル」ボタンをダブルクリックして、以下のコードを追加。
private void button3_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.Cancel;
}

最後に、form2のパブリックプロパティに、以下のようにテキストボックスの内容を取れるようにします。
(今回は、スレッドを使わないので、スレッドセーフのようにはしません。)
public string GetUrl1
{
get { return textBox1.Text; }
}
public string GetUrl2
{
get { return textBox2.Text; }
}
public string GetUrl3
{
get { return textBox3.Text; }
}


続いて、Form1のメニューの「設定ボタン」を押すことにより、Form2を表示するようにします。
まず、以下のように、Form1のプライベートなインスタンス変数を追加します。
private Form2 form2;

Form1_Load()イベントハンドラに、以下を追加します。

form2=new Form2();


で、メニューの「設定」をダブルクリックして、クリックイベントハンドラを作成。
以下のようにします。
private void SettingMenuItem_Click(object sender, EventArgs e)
{
DialogResult dr = form2.ShowDialog();
if (dr == DialogResult.OK)
{
webBrowser1.Url = new Uri(form2.GetUrl1);
webBrowser2.Url = new Uri(form2.GetUrl2);
webBrowser3.Url = new Uri(form2.GetUrl3);
}
}

最後に、プログラム終了直前に、SplitterContainerの分離帯の位置を保存します。
Form1のプロパティウィンドウで、雷マークをクリックし、FormClosingの文字(以下の画像の反転している部分)をクリックする。


以下のイベントハンドラを追加する。
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
Properties.Settings.Default.Splitter1Distance = splitContainer1.SplitterDistance;
Properties.Settings.Default.Splitter2Distance = splitContainer2.SplitterDistance;
Properties.Settings.Default.Save();
}


今日はここまで。
次回は、大量データ保存に対応したものを使って、翻訳結果の保存を行います。

保存先に、SQL Server データベースファイル(...mdfファイル)を利用します。
感覚的には、SQL Serverというよりも、Accessといった感じの使い方です。
時間があれば、通知領域にアイコン(NotifyIcon)を出して、アイコン右クリックでContentsMenuStripを表示して、翻訳結果保存ページまでつなげてみます。(時間がなければ回を分けるかもしれないけど。)

0 件のコメント: