エンタープライズ:特集 2003/07/18 11:58:00 更新
C Magazine

[C Magazine連載]プログラムのレシピ(第1回)
デスクトップメモを作る (8/9)

C MAGAZINE 2002年9月号より転載

日程管理機能

 続いて、スケジュールを管理する機能を作りましょう。といっても簡単なもので、当日または翌日の日付が書き込まれたメモを、アクティブ状態にするというだけです。

 このような仕様にした理由は2つあります。1つは使い勝手をよくするためです。日付入力用のユーザインタフェイスが不要なので、操作がシンプルになります。

 もう1つの理由は、実装が簡単になるからです。「実装に都合がいい仕様にする」というのも大事なプログラミングテクニックです。なお「実装上の都合でこんな仕様にしたんです」という事情は伏せておくのが賢いプログラマです(笑)。

 さて、「明日と今日の予定だけをアクティブ状態にする」処理は、簡単に実装できます。それにはまず、日付の書き方を「○月△日」と「○/△」に限定します。するとたとえば今日が8月18日なら、今日を表す文字列は、

「8月18日」
「8/18」

だけです。また明日を表す文字列は、

「8月19日」
「8/19」

だけになります。したがって計4パターンの文字列が、メモの中に書き込まれているかどうかをチェックすればいいのです。いずれかのパターンが含まれていたら、メモをアクティブ状態にします。

●プログラム例

 List 11は、日付の書き込みに従ってメモをアクティブ状態にするプログラムです。List 11-(1)が1枚のメモをアクティブにする処理で、List 11-(6)はすべてのメモをアクティブにする処理です。List 11-(6)は、単にすべてのメモに関してList 11-(1)の処理を呼び出しているだけです。

List 11 メモをアクティブ状態にする(UConsoleForm.cpp)

//============================================================= (1)
// メモのアクティブ化
// 指定したメモを、ActivationPolicyに従ってアクティブ化する
// ActivationPolicyの値が、
// 0のとき→今日と明日の予定をアクティブ化
// 1のとき→今日の予定をアクティブ化
// 2のとき→アクティブ化しない(元の状態を維持する)
void TConsoleForm::ActivateMemo(TMemoForm* memo) {
   AnsiString text;
   AnsiString month, day, today0, today1,
       yesterday0, yesterday1;

   //========================================================= (2)
   // 今日の日付の文字列を作成
   TDateTime date=TDateTime::CurrentDate();
   month=date.FormatString("m");
   day=date.FormatString("d");
   today0=month+"/"+day;
   today1=month+"月"+day+"日";

   //========================================================= (3)
   // 明日の日付の文字列を作成
   date++;
   month=date.FormatString("m");
   day=date.FormatString("d");
   yesterday0=month+"/"+day;
   yesterday1=month+"月"+day+"日";
   text=memo->Memo->Text;

   switch (ActivationPolicy) {

       //===================================================== (4)
       // 今日と明日の予定をアクティブ化する。
       // 今日または明日の日付がテキストに含まれていたら、
       // アクティブ化する
       case 0:
           memo->ActiveMemo=
               text.Pos(today0)>0 || text.Pos(today1)>0 ||
               text.Pos(yesterday0)>0 || text.Pos(yesterday1)>0;
           break;

       //===================================================== (5)
       // 今日の予定をアクティブ化する。
       // 今日の日付がテキストに含まれていたら、
       // アクティブ化する
       case 1:
           memo->ActiveMemo=
               text.Pos(today0)>0 || text.Pos(today1)>0;
           break;

   }
}

//============================================================= (6)
// 全てのメモを、ActivationPolicyに従ってアクティブ化する
void TConsoleForm::ActivateMemos() {
   TMemoForm* memo;
   int i;
   for (i=0; i<MemoFormList->Count; i++) {
       ActivateMemo((TMemoForm*)MemoFormList->Items[i]);
   }
}

 List 11-(2)では、今日の日付の文字列を作成します。今日が8月18日ならば、「8月18日」と「8/18」という2つの文字列を作ります。次のList 11-(3)は、明日の日付の文字列を作る処理です。

 今日の日付を得るには、TDateTimeクラスのCurrentDateメソッドを使います。Win32 APIの場合にはGetSystemTime関数などが利用できます。

 List 11-(4)は、今日と明日の予定をアクティブ状態にする処理です。今日と明日の日付の文字列がメモに含まれている場合、メモをアクティブにします。List 11-(5)は今日の予定だけをアクティブにします。アクティブ化のルールをどちらにするかは、設定フォームで切り替えられるようにしました。

[C Magazine連載]プログラムのレシピ(第1回)
(1)連載のはじめに
(2)どんな機能を作るか
(3)作成のポイント
(4)タスクトレイの操作
(5)メモの作成と表示
(6)メモデータの保存と読み込み
(7)タブ画像の選択
(8)日程管理機能
(9)まとめ
・実行ファイル/リソース一式(.lzh形式/1.32MB)
・リスト(.lzh形式/5.45KB)

関連リンク
▼C MAGAZINE
▼定期購読のご案内
▼バックナンバー一覧
▼バックナンバー販売協力店
▼ひぐぺん工房
▼「デスクトップマスコットを作ろう」紹介ページ
▼「デスクトップマスコットを作ろう」著者ページ

前のページ | 1 2 3 4 5 6 7 8 9 | 次のページ

[松浦健一郎(ひぐぺん工房),C MAGAZINE]