金宏 和實(かねひろ かずみ)

 富山県高岡市 株式会社イーザー副社長。春になって血圧が上がった。上が150,下が100を越えるようになったので,通院し,薬を飲むようになった。そうすると,素直な体なのか,血圧はストーンと下がった。それは良いことなのだろうがしんどいのだ。夕方になるとガクンとだるくなる。高血圧に慣れていたせいか,朝晩はたちくらみがする。いつになったら慣れるのだろうか?

 ネットでの衝動買いがたたってか,筆者の財布は今月もプア感が漂っています。読者の皆さんはいかがですか? 余計なお世話かもしれませんが,今回はASP.NETのリッチコントロールを説明して,少しリッチな気分になっていただきましょう。Calendarコントロールと,広告バナーを表示するAdRotatorコントロールを紹介します。

 さて,本連載ではASP.NET 3.5を使った,Visual Basic(VB)2008によるWebプログラミングの解説をしています。切り口として,高機能で,パッと見にはどこで何をしているのかわかりにくいASP.NETを,シンプルなPHPプログラムと比較することで,理解していただこうと企んでいます。

 突然ですが「実は,日経ソフトウエア誌にPHPの連載企画を持ち込んだのは私だ」という,古い自慢話から始めましょう。日経ソフトウエア2002年6月号に,カレンダを表示するPHPのプログラムを紹介しました。あのころ,私は若かった。いや,私だけでなく,矢沢久雄さんも,中條達雄さんも若かった。このお二人は日経ソフトウエアの最新刊にも記事を書いておられるようです。年齢を重ねるごとに個性が際立ってきて,とてもおもしろい記事だと思います。

 日経ソフトウエアには,PHPやVBの記事もいまだに掲載されています。PHPとVBは,開発環境やプログラムの作成方法は違いますが,どちらも必要なアプリケーション(以下,アプリ)をなるべく手間をかけないで作成するという面では似ていますね。

カレンダを表示するPHPプログラム

 リスト1リスト2は,カレンダを表示するPHPのプログラムです。実行環境のバージョンが違うので,リスト2のプログラム(mcalen.php)を$_GET配列を使うように修正しましたが,それ以外は日経ソフトウエア2002年6月号に掲載したプログラムと同じです(実はそのとき,CalendarのスペルをCalenderと間違えたことは内緒にしておきましょう)。

<?
class mcalendar{
  var $year;
  var $month;
  var $today;
  var $caleAry = array();
  var  $youbiAry = array("日","月","火","水","木","金","土");
  //-------------
  //  bgcolor
  //-------------
  var $bgctoday = " bgcolor = yellow ";
  var $bgcsatday =" bgcolor = cyan ";
  var $bgcsunday =" bgcolor = red ";
  var $bgcweekday = " bgcolor = white ";
  //-------------
  //  font color
  //-------------
  var $fctoday = "<font color = black>";
  var $fcsatday ="<font color = white>";
  var $fcsunday ="<font color = white>";
  var $fcweekday = "<font color = black>";

  //----------------------------------------
  //  コンストラクタ
  //----------------------------------------
  function mcalendar($year, $month) {
    $this->today = getdate();      //今日の日付を取得
    $this->year = $year; 
    $this->month = $month; 
  }
  //----------------------------------------
  //  配列にカレンダーを作成
  //----------------------------------------
  function set_calen() {
    $set_day = 1;
    $set_wday = date("w",mktime(0,0,0,$this->month,$set_day,$this->year));  
    $days = date("t",mktime(0,0,0,$this->month,$set_day,$this->year));
    for($i = 0; $i <= 5; $i++) {    //  週0から5
      for($j = 0; $j <= 6; $j++) {  //  日0から6
        if (($i == 0)&&($j < $set_wday)) {
          $this->caleAry[$i][$j] = "";
        } else {
          if ($set_day <= $days) {
            $this->caleAry[$i][$j] = $set_day++;
          } else {
            $this->caleAry[$i][$j] = "";
          }
        }
      }
    }
  }
  //----------------------------------------
  //  カレンダーを表示
  //----------------------------------------
  function disp_calen() {
    print( "<table border=2 bordercolor='green'> \n"); 
    print( "<tr> \n");
    print( "<th colspan=7>$this->year 年 $this->month 月</th></tr> \n");
    print( "</tr> \n");
    print( "<tr> \n");
    foreach ($this->youbiAry as $youbi) {
        print( "<td>$youbi</td>");
    }
    print( "</tr> \n");
    foreach ($this->caleAry as $week) {
      print( "<tr> \n");
      $j=0;
      foreach ($week as $draw_day) {
        print($this->set_string($draw_day,$j));
        $j++;
      }
      print( "</tr> \n");
    }
    print( "</table> \n"); 
  }
  //----------------------------------------
  //  bgcolor & font colorをセット
  //----------------------------------------
  function set_string($dday,$youbi) {
    if (($dday == $this->today["mday"])&&($this->month == $this->today["mon"])
      &&($this->year == $this->today["year"])) {
        return ("<td" . $this->bgctoday . "align=right>" 
            .$this->fctoday . $dday . "</font></td> \n");
    }
    if (empty($dday)) {
        return ("<td" . $this->bgcweekday . "align=right>" 
            .$this->fcweekday . $dday . "</font></td> \n");
    }
    switch ($youbi) {  // wday:曜日(0~6:日から土)
      case 0:      // 日曜日
        return ("<td" . $this->bgcsunday . "align=right>" 
            .$this->fcsunday . $dday . "</font></td> \n");
      case 6:      // 土曜日
        return ("<td" . $this->bgcsatday . "align=right>" 
            .$this->fcsatday .  $dday . "</font></td> \n");
      default:
        return ("<td" . $this->bgcweekday . "align=right>" 
            .$this->fcweekday . $dday . "</font></td> \n");
    }
  }
}
リスト1●月間のカレンダを生成するクラスmcalender

<?php
require_once("mcalendar.php");
?>
<script language="JavaScript">
function fwdym(year,month) {
  if ( month < 12 ) {
    month++;
  } else {
    year++;
    month=1;
  }
  url = "mcalen.php";
  url = url + "?year=" + year;
  url = url + "&month=" + month;
  location.href = url;
}
function backym(year,month) {
  if ( month < 2 ) {
    year--;
    month=12;
  } else {
    month--;
  }
  url = "mcalen.php";
  url = url + "?year=" + year;
  url = url + "&month=" + month;
  location.href = url;
}
</script>
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html;CHARSET=EUC-JP">
<TITLE>予定表</TITLE>
</HEAD>
<?php 
if (isset($_GET['year'])) {
  $year=$_GET['year'];
  $month=$_GET['month'];  
} else {
  $today = getdate();    //今日の日付を取得
  $year = $today['year'];
  $month = $today['mon'];
}
print("<form> \n");
print("<input type='button' value='前月へ' onclick='backym($year,$month)'>");
print("<input type='button' value='次月へ' onclick='fwdym($year,$month)'> \n");
$mcalendar = new mcalendar($year,$month);
$mcalendar->set_calen();
$mcalendar->disp_calen();
print("</form> \n");
?>
</body>
</html>
リスト2●mcalenderクラスを使ってカレンダを表示するプログラム

図1●カレンダを表示
図1●カレンダを表示

 リスト1はカレンダを配列として作成し,表示するクラスです。一方,リスト2は,mcalendarクラスのインスタンスを生成し,メソッドを呼び出してカレンダを表示させるプログラムです。前月へ,次月へというボタンがクリックされたら,JavaScriptで月を変更して,URLパラメータに積んでいます。url = url + "?year=" + year;以降の部分です。location.href = urlとすることで月が変更できるわけですね。

 このプログラムを作ったときは,それなりに便利だと思ったのですが,たかがカレンダの表示のために,こんなにコードを書かなくてはいけないのは大変ですよね。

 ITproのPHP TIPSという連載にあるように,PEARのCalendarクラスを使えばだいぶ簡単になります。しかし,それでも,ループを回して,ゴリッ,ゴリッとカレンダを描画する必要があります。

 これに対して,ASP.NETにはリッチコントロールとして,Calendarコントロールが用意されています。早速,試してみましょう。