スケジューラの作成
タブページが作成できたら、この上にスケジューラ用のLabelとTextBoxコントロールを作成します。各コントロールの作成処理は専用のプロシージャ(メソッド)にし、各ページに配置できるようにします。
曜日の見出し用ラベルの作成
この処理は、専用のプロシージャ(メソッド)「setweeklabel」を作成します。引数は1つで、タブページのページ番号を指定するようにします。Labelコントロールは、曜日の見出し用に1列に作成し、曜日名を設定します。Labelコントロールをデータ型とする配列を用意し、コードから作成してプロパティを設定していきます。
Labelコントロールが作成できたら、GcTabControlコントロールのControlsコレクションのAddメソッドを使用して、各タブページに組み込んでいきます。
Private Sub setweeklabel(ByVal pagenum As Integer)
'曜日ラベルの作成と配置
Dim weeklb(6) As Label
Dim col As Integer
For col = 0 To 6
weeklb(col) = New Label()
weeklb(col).Width = 90
weeklb(col).Height = 20
weeklb(col).Location = New Point(30 + col * 94, 30)
weeklb(col).AutoSize = False
weeklb(col).BorderStyle = BorderStyle.Fixed3D
weeklb(col).TextAlign = ContentAlignment.MiddleCenter
weeklb(col).BackColor = Color.White
'Gcタブコントロールへの組み込み
Me.GcTabControl1.TabPages(pagenum).Controls.Add(weeklb(col))
Next
'曜日文字の設定
weeklb(0).Text = "Mon"
weeklb(1).Text = "Tue"
weeklb(2).Text = "Wed"
weeklb(3).Text = "Thu"
weeklb(4).Text = "Fri"
weeklb(5).Text = "Sat"
weeklb(5).BackColor = Color.Blue
weeklb(5).ForeColor = Color.White
weeklb(6).Text = "Sun"
weeklb(6).BackColor = Color.Red
weeklb(6).ForeColor = Color.White
End Sub
private void setweeklabel(int pagenum)
{
//曜日ラベルの作成と配置
Label[] weeklb = new Label[7];
int col;
for(col=0;col<=6;col++)
{
weeklb[col] = new Label();
weeklb[col].Width =90;
weeklb[col].Height = 20;
weeklb[col].Location = new Point(30 + col * 94, 30);
weeklb[col].AutoSize = false;
weeklb[col].BorderStyle = BorderStyle.Fixed3D;
weeklb[col].TextAlign = ContentAlignment.MiddleCenter;
weeklb[col].BackColor = Color.White;
//Gcタブコントロールへの組み込み
gcTabControl1.TabPages[pagenum].Controls.Add(weeklb[col]);
}
//曜日文字の設定
weeklb[0].Text = "Mon";
weeklb[1].Text = "Tue";
weeklb[2].Text = "Wed";
weeklb[3].Text = "Thu";
weeklb[4].Text = "Fri";
weeklb[5].Text = "Sat";
weeklb[5].BackColor = Color.Blue;
weeklb[5].ForeColor = Color.White;
weeklb[6].Text = "Sun";
weeklb[6].BackColor = Color.Red;
weeklb[6].ForeColor = Color.White;
}
日付用ラベルの作成
次に、日付用ラベルのLabelコントロールを作成します。これは、専用のプロシージャ(メソッド)「createday」を作成します。引数は2つで、各ページの開始日を決める「startday」と、タブページのページ番号です。
まず先に、月ごとに1カ月の日数を決めます。また、最初のLabel・TextBoxコントロールを配置するLocationプロパティの位置を決めます。そして、Labelコントロールをデータ型とする2次元配列を用意し、ここにLabelコントロールを作成して組み込んでいきます。スケジューラは横7列縦5列に並べるので、その分の配列を用意します。
作成したLabelコントロールは、GcTabControlコントロールのControlsコレクションのAddメソッドを使用して、各タブページに組み込んでいきます。
Private Sub createday(ByVal startday As Integer, ByVal pagenum As Integer)
Dim col, row As Integer
Dim pty1, pty2 As Integer
Dim daylb(6, 4) As Label
Dim tb(6, 4) As TextBox
Dim lastday As Integer = 0
Dim labelday As Integer = 0
Dim daynum As Integer = 0
'1か月の日数の決定
Select Case pagenum + 1
Case 1, 3, 5, 7, 8, 10, 12
lastday = 31
Case 2
lastday = 28
Case 4, 6, 9, 11
lastday = 30
End Select
pty1 = -12 '最初のラベルが70から始まるように初期化
pty2 = 8 '最初のテキストボックスが90から始まるように初期化
For row = 0 To 4
pty1 += 80 '行間を80にセット
pty2 += 80
For col = 0 To 6
'日付用ラベルの作成
daylb(col, row) = New Label()
daylb(col, row).BackColor = Color.Transparent
daylb(col, row).Width = 90
daylb(col, row).Height = 20
daylb(col, row).Location = New Point(30 + col * 94, pty1)
daylb(col, row).AutoSize = False
daylb(col, row).BorderStyle = BorderStyle.Fixed3D
daylb(col, row).TextAlign = ContentAlignment.MiddleLeft
'日付の設定
labelday = startday + daynum
If labelday >= lastday Then
startday = startday - lastday
End If
daynum += 1
daylb(col, row).Text = labelday
'Gcタブコントロールへの組み込み
Me.GcTabControl1.TabPages(pagenum).Controls.Add(daylb(col, row))
private void createday(int startday, int pagenum)
{
int col, row ;
int pty1, pty2 ;
Label[,] daylb = new Label[7, 5];
TextBox[,] tb = new TextBox[7, 5];
int lastday = 0;
int labelday = 0;
int daynum = 0;
//'1か月の日数の決定
switch(pagenum + 1)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
lastday = 31;
break;
case 2:
lastday = 28;
break;
case 4:
case 6:
case 9:
case 11:
lastday = 30;
break;
}
pty1 = -12; //最初のラベルが70から始まるように初期化
pty2 = 8; //最初のテキストボックスが90から始まるように初期化
for(row=0;row<=4;row++)
{
pty1 += 80; //コントロールの間隔を80にセット
pty2 += 80;
for(col=0;col<=6;col++)
{
//日付用ラベルの作成
daylb[col, row] = new Label();
daylb[col, row].BackColor = Color.Transparent;
daylb[col, row].Width = 90;
daylb[col, row].Height = 20;
daylb[col, row].Location = new Point(30 + col * 94, pty1);
daylb[col, row].AutoSize = false;
daylb[col, row].BorderStyle = BorderStyle.Fixed3D;
daylb[col, row].TextAlign = ContentAlignment.MiddleLeft;
//日付の設定
labelday = startday + daynum;
if(labelday>=lastday)
{
startday = startday - lastday;
}
daynum += 1;
daylb[col, row].Text = labelday.ToString();
//Gcタブコントロールへの組み込み
gcTabControl1.TabPages[pagenum].Controls.Add(daylb[col, row]);
スケジュール入力用テキストボックスの作成
次に、日付用ラベルの下にスケジュール入力用のテキストボックスを作成します。テキストボックスは、MultilineプロパティをTrueにして四角形で配置できるようにします。
また、データが入力された場合に目立つよう背景色を変えるため、専用のイベントハンドラ「Cange_Text」を作成して、関連付けていきます。イベントハンドラ「Cange_Text」では、TextBoxコントロールのTextChangedイベントを利用し、Textプロパティにデータがあれば背景色を「Violet」に、文字の入力がない、または削除されれば背景色を白色にするようにします。これで、できあがりです。
'テキストボックスの作成
tb(col, row) = New TextBox()
tb(col, row).Width = 90
tb(col, row).Height = 40
tb(col, row).Location = New Point(30 + col * 94, pty2)
tb(col, row).Multiline = True
tb(col, row).ImeMode = Windows.Forms.ImeMode.On
'イベントハンドラの結合
AddHandler tb(col, row).TextChanged, AddressOf Cange_Text
'Gcタブコントロールへの組み込み
Me.GcTabControl1.TabPages(pagenum).Controls.Add(tb(col, row))
Next
Next
End Sub
' イベントハンドラの作成
Private Sub Cange_Text(ByVal sender As System.Object, ByVal e As System.EventArgs)
If sender.text <> "" Then
sender.backcolor = Color.Violet '文字が入力されると背景色を変更
Else
sender.backcolor = Color.White
End If
End Sub
//テキストボックスの作成
tb[col, row] = new TextBox();
tb[col, row].Width = 90;
tb[col, row].Height = 40;
tb[col, row].Location = new Point(30 + col * 94, pty2);
tb[col, row].Multiline = true;
tb[col, row].ImeMode = ImeMode.On;
tb[col,row].Width = 90;
//イベントハンドラの結合
tb[col, row].TextChanged += new EventHandler(Cange_Text);
//Gcタブコントロールへの組み込み
gcTabControl1.TabPages[pagenum].Controls.Add(tb[col, row]);
}
}
}
// イベントハンドラの作成
private void Cange_Text(object sender, EventArgs e)
{
TextBox tb = new TextBox();
tb = (TextBox)sender;
if (tb.Text != "")
{
tb.BackColor = Color.Violet; //文字が入力されると背景色を変更
}
else
{
tb.BackColor = Color.White;
}
}

まとめ
とにかく機能が豊富なGcTabControlコントロールですが、本稿のサンプルで示したようにデザイン性に優れ、タブのドラッグ&ドロップやコマンドアイコンなど、標準のタブコントロールが持っていない機能を使うことができます。タブ形式のアプリケーションが続々とリリースされてきている今、このコンポーネントを使わない手はないでしょう。
また、本稿のようにVisual BasicとC#で同じプログラムを作成する場合に、Visual Basicでデザインした内容をもう一度C#でデザインすることなく、プロパティデータのインポート/エクスポートで簡単に再現できるため、xmlによる設定プロパティのインポート/エクスポートは大変便利な機能であり、開発効率の向上につながります。

