AFsoft WebSite(エーエフソフト・ウェブサイト)
 

オペレーティング・システムについて

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
DelphiXE3 [FMX] カレンダーアプリケーション 2014/08/11
 
前回は簡単なアナログ方式の時計アプリケーションを作ってみました。今回はカレンダーのアプリケーションを作ってみます。
 
Delphi FireMonkey(FMX)には、カレンダー・コンポーネントが標準実装されていますので、これを使います。
  カレンダー(Calendar)
 
しかし VCLと比べても機能が若干少ないし、カレンダー上にマークを付ける事が出来ないのが残念です。日の位置を取得する事も不明です。そのため、

のように、カレンダー上にイメージを載せて、イメージのキャンバスで日付の位置に楕円等を描画させて、それっぽく見せてみよう、と思ったのですが、これまた残念ながら、

というように、表示される第1週が1段目とは限らない、しかもその法則性も分からないため、1日の曜日が分かったとしても、任意の日付の位置が確定出来ないため、キャンバスに楕円等を描く等のようなプログラミングを行う事が出来ません。仕方がないので諦めました。

どうしてもやりたい場合は、例えば、使用するであろう前後10年程の各月の状態をみてデータ化しておき、それを元に位置を確定する、等という余り美しくない手法も有り得ますし、また、カレンダーコンポーネントを使用せず、1から、カレンダー描画を行うプログラムを作成するという手法も有り得ますが、やめておきます。
 
 
カレンダーコンポーネントを1つ置くだけでは、別段、面白くもありません。左右にも同じくカレンダーコンポーネントを配置し、中央がメインとし、中央の月を変更すると、左右もこれに連動して前月・次月となるようプログラミングします。また、それだけでも面白くありませんので、各日にメモを付けれるようにします。

 
左(Calendar1)、右(Calendar2)、中央(Calendar3) とし、左右はプログラム実行時に月をセットします。
procedure TForm1.FormCreate(Sender: TObject);
begin
   NowDay := Now;
   Calendar1.Date := IncMonth(NowDay, -1);   // 左
   Calendar2.Date := IncMonth(NowDay,  1);   // 右
   Calendar3.Date := NowDay;  // 中央
変数 NowDay は、Form1の Private変数として宣言しており、現在の日時として扱っています。
 
中央の日を操作しても何もしませんが、年月を操作したら、左右の年月も変更するようにします、
// 中央カレンダーの年月を変更
//    左右カレンダーを前後に変更
procedure TForm1.Calendar3Change(Sender: TObject);
var
   m1,m2 : Word;
begin
   m1 := GetMonth(NowDay);
   m2 := GetMonth(Calendar3.Date);
   NowDay := Calendar3.Date;
   if (m1 <> m2) then begin
      Calendar1.Date := IncMonth(NowDay, -1);
      Calendar2.Date := IncMonth(NowDay,  1);
   end;
関数 GetMonth は
// 月を取得
function GetMonth(d:TDateTime) : Word;
var
   d1,d2,d3 : Word;
begin
   DecodeDate(d, d1,d2,d3);
   Result := d2;
end;

// 日を取得
function GetDay(d:TDateTime) : Word;
var
   d1,d2,d3 : Word;
begin
   DecodeDate(d, d1,d2,d3);
   Result := d3;
end;
等のように作ってしまいましたが、こんなことをせずとも、System.DateUtils内にルーチンが既にあったかもしれません・・・。
 
 
カレンダーの下には、左側に ListBox1 を、右側に Edit1 及び Memo1 を配置しています。Edit1 には題名を、Memo1 には内容を記入するようにして、日記やスケジュール等のように使えるようにします。カレンダーにマークを付ける事が出来ないため、それを補うために、ListBox1 には月内の題名の一覧を表示するようにします。
 
題名・内容を登録出来るようにするには、ファイル読み書きをしないといけない、という事になりますが、ここでは、SQLite を使っています。そのため、[dbExpress]内の TSQLConnection を配置し、Driver プロパティを「sqlite」に指定しています。
 
データベースファイルは、実行プログラムと同じフォルダ内に生成することとし、ファイル名は実行プログラム名と同じ名前で拡張子を「.s3db」とします。データベースのテーブルは「diary」とし、その内容は
N INTEGER
(NOT NULL UNIQUE)
登録番号(自動付加)
1,2,3,・・・
HIDUKETEXT日付 yyyymmdd形式
DAIMEITEXT題名
NAIYOUTEXT内容
とします。
 
登録番号 N は、自動的に 1,2,3,・・・と付加していきます。必要無いと思われるかもしれませんが、まぁ、データベーステーブルを作る際の、お約束、みたいな感じです。
 
日付 HIDUKE は、yyyymmdd形式としています。例えば、20140811 のようにします。日付なら通常 2014/08/11 のように記入するかもしれませんが、このようにしておけば、そのまま数値に変換して、数値として扱えるから後々便利なので、私はよくこのようにしたりします。
 
題名 DAIMEI には、Edit1 の内容を入れます。
 
内容 NAIYOU には、Memo1 の内容を入れます。
 
それぞれの日には、1つだけ、登録出来るようにします。ですので、登録していない場合には新規登録、既に登録している場合には編集登録、という事になります。削除の機能は付けていません。 付けるのは簡単ですので必要ならば追加されると良いと思います。削除ボタンを付けるとか、何も記入しない場合には削除とする、等。
 
題名・内容は、無記入状態で登録する事は出来ないようにしています。また、データベースですので、「'」「"」の文字は入力出来ないようにしています(双方とも登録の際にエラーメッセージを表示させています)。
 
 
複数のパソコンでデータベースファイルを共有させたい場合には、データベースファイル名を指定させるようにプログラムを修正する、という事でも面白いかもしれません。但し、同時実行によるファイル/レコード排他制御をしてくれるかどうかは「?」です。本格的なクライアント/サーバー型にしたい場合には、Interbase や Firebird や そのほか(Oracle、SQL Server等)を利用するようにされると良いでしょう。まぁ、このプログラムでそこまで必要な方というのはほぼ居ないと思いますが。
 
実行すると、下図のようになります。

 
入力・編集した内容は、「登録」ボタンを押さないと記録されませんので注意して下さい。
 
 
しかし、FireMonkey(FMX)のメモ・コンポーネントのレスポンスは、本当、悪いですね。VCL より遅い、というのは聞いていましたが…。
 
 
アイコンは、DelphiXE3 の提供するアイコンをそのまま使っています。
 
 
バッチファイル
BASIC
C言語のお勉強
拡張子な話
DOSプログラム
Delphi
>Dehi入門編
>Delphi2010
>DelphiXE3
▲2014/08/04
 2014/08/11
▼2014/08/13
 
シェアウェア
Script!World
データベース
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015. By AFsoft All Rights Reserved.