前章のプログラムでは、ダイアログボックスのテキストボックスに入力した内容は、ダイアログを閉じたときに、親フォームに反映されました。
この章では、テキストボックスのテキストが変化するたびに、親フォームに反映するようなプログラムを作ってみます。
前章では、テキストボックスが単一行でしたが、これを複数行可能なテキストボックスにします。
テキストボックスの内容が変化するごとに、親フォームにその内容を表示すればよいので、テキストボックスのTextChangedイベントを処理すればよいことがわかりますね。 TextChangedイベントは第33章で出てきました。
では、少しずつプログラムを見ていきましょう。
// dialog03.cs
using System;
using System.Drawing;
using System.Windows.Forms;
class dialog03
{
public static void Main()
{
MyForm form = new MyForm();
Application.Run(form);
}
}
これは、親フォームを作っています。いつも通りですね。
class MyForm : Form
{
public static string str = "";
public MyForm()
{
Text = "猫でもわかるC#プログラミング";
BackColor = SystemColors.Window;
MainMenu mm = new MainMenu();
MenuItem miFile = new MenuItem("ファイル(&F)");
mm.MenuItems.Add(miFile);
MenuItem miExit = new MenuItem("終了(&X)");
miExit.Click += new EventHandler(miExit_Click);
miFile.MenuItems.Add(miExit);
MenuItem miOption = new MenuItem("オプション(&O)");
mm.MenuItems.Add(miOption);
MenuItem miDialog = new MenuItem("ダイアログを出す(&D)");
miDialog.Click += new EventHandler(miDialog_Click);
miOption.MenuItems.Add(miDialog);
Menu = mm;
}
void miExit_Click(object sender, EventArgs e)
{
Close();
}
void miDialog_Click(object sender, EventArgs e)
{
MyDlg dlg = new MyDlg(this);
dlg.ShowDialog();
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics g = e.Graphics;
g.DrawString(str, Font, Brushes.Black, new PointF(10f, 10f));
}
}
親フォームのクラスです。strという、publicでstaticなフィールドがあることに注意してください。
よそのクラスから、直接MyForm.strでアクセスできるようにしています。
コンストラクタで、メニューを作っています。
メニューの「ダイアログを出す」が選択されると、miDialog_Clickメソッドが呼び出されます。ここでは、単に
MyDlg dlg = new MyDlg(this); dlg.ShowDialog();と、してダイアログボックスを表示しているだけです。
コンストラクタ呼び出しで、引数にthisを使っています。ダイアログにどこから呼ばれているかを知らせるためです。
Paintイベントが発生したら、クライアント領域にstrを表示しています。
class MyDlg : Form
{
Form parent;
public MyDlg(Form pform)
{
parent = pform;
Text = "オプション";
MaximizeBox = false;
MinimizeBox = false;
ShowInTaskbar = false;
FormBorderStyle = FormBorderStyle.FixedDialog;
ControlBox = false;
Button btnOK = new Button();
btnOK.Parent = this;
btnOK.Text = "OK";
btnOK.Location = new Point(
(ClientSize.Width - btnOK.Width) / 2,
ClientSize.Height - btnOK.Height - 5);
btnOK.TabIndex = 1;
btnOK.DialogResult = DialogResult.OK;
TextBox textbox = new TextBox();
textbox.Parent = this;
textbox.Multiline = true;
textbox.ScrollBars = ScrollBars.Vertical;
textbox.WordWrap = true;
textbox.Location = new Point(10, 10);
textbox.Width = ClientSize.Width - 20;
textbox.Height = ClientSize.Height - 25 - btnOK.Height;
textbox.AcceptsTab = true;
textbox.TabIndex = 0;
textbox.TextChanged += new EventHandler(textbox_TextChanged);
}
void textbox_TextChanged(object sender, EventArgs e)
{
TextBox tb = (TextBox)sender;
MyForm.str = tb.Text;
parent.Invalidate();
}
}
ダイアログボックスのクラスです。コンストラクタの引数は、誰から呼ばれたかを表しています。これを、このクラスのparentフィールドにコピーしておきます。
コンストラクタで、ダイアログボックスの用件を満たすよう、プロパティを設定しています。 MaximizeBox, MinimizeBox, ShowInTaskbar, ControlBoxをfalseに設定します。
FormBorderStyleは、FormBorderStyle.FixedDialogに設定します。
次に「OK」ボタンを作っています。
DialogResultプロパティをDialogResult.OKに設定して、このボタンが押されたらダイアログを閉じるようにしておきます。
次に、複数行テキストボックスを作っています。
Multilineプロパティをtrueにすると、複数行テキストボックスとなります。これは、すでに第33章で登場していますね。
ScrollBarsプロパティも設定しています。TextBox.ScrollBarsプロパティは次のように定義されています。
public public ScrollBars ScrollBars { get; set; } ScrollBars { get; set; }
プロパティ値のScrollBars列挙体のメンバと意味は次の通りです。
| メンバ | 意味 |
|---|---|
| Both | 水平・垂直スクロールバーの表示 |
| Horizontal | 水平スクロールバーの表示 |
| None | 表示しない |
| Vertical | 垂直スクロールバーの表示 |
なお、後述のWordWrapプロパティがtrueに設定されていると、水平スクロールバーは表示されません。
TextBoxBase.WordWrapプロパティは、複数行テキストボックスで、必要に応じて折り返しを行うかどうかを設定します。
さて、テキストボックスにTabを入力すると、フォーカスがテキストボックスから、次のコントロールに移動してしまいます。これを防ぐには、TextBoxBase.AcceptsTabプロパティをtrueに設定します。
この時、次のコントロールに移動したい場合は、Ctrl + Tabキーを押します。
テキストボックスのテキストが変更されたときのイベントハンドラもインストールしておきます。
textbox_TextChangedメソッドは、テキストが変更されたとき、呼び出されます。
ここでは、テキストを読み出し、MyForm.strにコピーしています。そこで、このダイアログを呼び出したフォーム(parent, コンストラクタからもらってきている)をInvalidateすれば、フォームにテキストが表示されます。
では、実行結果を見てみましょう。
ダイアログボックスのテキストボックスに入力した文字列は、確定するごとに親フォームのクライアント領域に表示されます。
Update 25/Nov/2006 By Y.Kumei