もくじ へ

3. ちょっとしたカレンダーが欲しい

 ソフトウエアによるカレンダーと言うのも良いのだが、CDサイズの紙のカレンダーを机に置いて、ちょっとしたメモが書き込めるようになっていれば、これだけで結構便利なものである。
 でも「手作り」と言うのは苦手である。字がへたと言うこともあるが、どんな単純なデザインであれ、作ってみて気に入らなかった時に、1からやり直しと言うのが耐えられないのである。設計をちょっと変えるのは人間だが、後は全自動でやり直して欲しいのだ。
 カレンダーを作ることは、私の趣味でも仕事でもないので、だからこだわるつもりは全くなくて、何の装飾もいらない。でも決して自分の美感を損ねるものであってはならない。簡単なようでわがままなのがカレンダーである。それなら自分でちょいとパソコンで作れないかと考えるのは、私のような人間には実に自然な発想である。

 それではCocoaでちょっとした紙のカレンダーを作って見ましょう。
 独自のViewを作って描画するソフトを作るわけですからCocoaはヤッパリ!のONLINEの記事の「6. 図形を描画しよう」くらいまでは読んでいて、概略知っていることを前提としてこの先の話を進めます。

設 計

 どんな「ちょっとしたプログラム」でも、何をしたいかが明確で無ければ始められない。プログラミングとは自分の「思想」や「意志」を記号化する作業だからである。
 このサンプルプログラムの場合、見た目は以下のようになるものとする。

 「Cocoaはヤッパリ!」の最初に述べられているように、とにかくウインドウ上に何かを表示できさえすれば、それにボタンを配線するだけで、何のコーディングも無く印刷が出来たり、PDF形式で保存して配付することができる(PDFのサンプル)と言う、素晴らしい機能をそのまま使わせて頂きます。
 前にも言ったように、「表計算ソフト」のようなものを持っているなら、確かにこの程度のカレンダーが作れます。でも2002年の例で言えば2月のように5行しか無い月には、下のように半マスずらすと言うなワザは、本格的なプログラム言語を使う恩恵と言えるでしょう。

コーディングの前に

 今回は、Model - View - Controllerの設計にはなっていません。メモリーリークもあると思いますが、印刷したら終了してしまうソフトなので気にしないことにします。

「View部」の作成

 「Interface Builder」でさささっと作るだけです。NSViewのサブクラスに「RakuGaki」と言うクラスを作り、何月かを見るためのアウトレットと何月かが変更された時のアクションを追加します(これは後でポップアップボタンと双方向に配線します)。そしてコードのひな形を作成します。
 「CustomView」を貼付けて、そのAttributesとしてRakuGakiクラスを選びます。つまり、「CustomView」はRakuGakiクラスのインスタンスとしてここでウインドウに張り付きましたので、手動でインスタンス化する必要はありません。
 「View部」の作成で面倒なのは、「CustomView」のサイズをちょうどCDのサイズに合わせることです。理論的なやり方があるのかも知れませんが、私の場合は一回適当な大きさで印刷して、実際のCDケースの大きさとのレートを測定して修正しました。
 「1 (Jan)」とか言う見出しの文字列は、ポップアップボタンに書き込んだ文字列をそのまま利用します。

RakuGakiクラスのコーディング

 自作のプログラム部から表立って呼ばれなくても、「drawRect」と言う名前のメソッドを作っておくと、これが描画処理の目的で自動的に呼ばれると言う仕組みになっていますから、「drawRect」と言う名前のメソッドを作って、その中に描画処理を全て書き込みます。
 ポップアップボタンで何月かが変更された場合のように、人間が書き直しのタイミングを知らせる必要がある場合には、自作のアクション(ここではchanged)の中に「[ self setNeedsDisplay : YES ];」と書いておくことになっています。
 言い遅れましたが、このクラスは自動的にインスタンス化されても、変数の初期化は自分でやることになっていて、「initWithFrame」と言う名前のメソッドを作って、その中に初期化処理を書いておくと自動的に呼ばれます。

 「drawRect」メソッドの中のカレンダー描画ソフトに関しては、プログラム中のコメントを参照して頂くと言うことで、詳しくは説明しません。全体をライトグレーに塗りつぶしたあとで、変数 i のループによって、必要なマス目を白で塗りつぶして行くだけです。
 どこが必要なマス目なのかは、自動計算ではなく、データとして12か月分入っています。2003年以降のカレンダーを印刷したい時には、Yahooのカレンダーでも見て自分でデータを変更して下さい。こう言う無責任なことが言えるのも、ソース公開のフリーソフトならではですね。

サンプルソフトのダウンロード

 そこそこの内容のあるソフトなのですが、やっぱり たったの12KB! ソースのみですので「Project Builder」でコンパイルして下さい。
 どうせそれぞれの人に好みがあるでしょうから、好きなように書き直して使って下さい。

おまけサンプルソフトのダウンロード

 もしも小さいお子さんがいて、子供に漢字の練習をさせなければいけないと思っているなら、似たようなソフトでこんなのはどうでしょうか? 印刷はA4横にするため、印刷ボタンを押す前に、FileメニューのPageSetup...で横にして下さい。
 最後の方で文字を正確にセンタリングさせるコツが入っていますので、何かの参考になるかも知れません。もう一つ言うと、うっかり忘れて「initWithFrame」メソッドを作っていないのですが、問題なく動いちゃっています。
 当然と言うか、やっぱり たったの12KB! ソースのみですので「Project Builder」でコンパイルして下さい。

2002.1.14