Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2003年07月20日] [更新 2012年06月30日] 元号選択式日付時刻入力コンポーネント
元号選択式日付時刻入力コンポーネント
テストプログラム DateEditTest
動作確認等 Windows 7 U64(SP1) + Delphi XE Pro







プロパティとメソッドのテスト


各プロパティと年齢計算メソッドのテストプログラムです.下のステータスバーに,[エラーチェック] でエラーがなければ,入力した日付と時刻を,取得したプロパティを用いて表示するようになっています.


  • 図1実行画面
  • 元号は [↓] でリストから選択可能 (DropDownKey =True)
  • 各入力コントロールは [Enter] で移動可能 (EnterNext = True)
  • 元号選択が空の場合は西暦と見なす
  • 年入力が 2 桁表示の時は,西暦の下 2 桁と見なす
  • 元号選択コンボボックス非表示の時は西暦年と見なす
  • 午前午後の選択リストを表示している時は必ず選択する.しないとエラー
  • 午前午後の選択コンボボックス非表示の時は24時間入力 (0時0分0秒~23時59分59秒)
  • 午前,午後の入力範囲は,0時0分0秒~11時59分59秒

リスト1
テストプログラムのコード
unit DateEditTestUnit;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, ExtCtrls, plDateEdit, ComCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Panel3: TPanel;
    SpeedButton1: TSpeedButton;
    SpeedButton3: TSpeedButton;
    SpeedButton2: TSpeedButton;
    SpeedButton4: TSpeedButton;
    SpeedButton5: TSpeedButton;
    StatusBar1: TStatusBar;
    plDateEdit1: TplDateEdit;
    Panel7: TPanel;
    RadioGroup1: TRadioGroup;
    Panel4: TPanel;
    ComboBox1: TComboBox;
    Panel5: TPanel;
    ComboBox2: TComboBox;
    Panel6: TPanel;
    ComboBox3: TComboBox;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    CheckBox4: TCheckBox;
    CheckBox5: TCheckBox;
    CheckBox7: TCheckBox;
    CheckBox8: TCheckBox;
    CheckBox20: TCheckBox;
    CheckBox21: TCheckBox;
    CheckBox6: TCheckBox;
    FontDialog1: TFontDialog;
    SpeedButton6: TSpeedButton;
    procedure FormShow(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
    procedure SpeedButton4Click(Sender: TObject);
    procedure SpeedButton5Click(Sender: TObject);
    procedure SpeedButton6Click(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
    procedure CheckBox2Click(Sender: TObject);
    procedure CheckBox3Click(Sender: TObject);
    procedure CheckBox4Click(Sender: TObject);
    procedure CheckBox5Click(Sender: TObject);
    procedure CheckBox6Click(Sender: TObject);
    procedure CheckBox7Click(Sender: TObject);
    procedure CheckBox8Click(Sender: TObject);
    procedure CheckBox20Click(Sender: TObject);
    procedure CheckBox21Click(Sender: TObject);
    procedure RadioGroup1Click(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
    procedure SpeedButton3Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

//=============================================================================
//  設計時の設定を反映させる
//=============================================================================
procedure TForm1.FormShow(Sender: TObject);
begin
  //Exitでの入力チェック有無
  CheckBox1.Checked := plDateEdit1.ExitCheck;
  //[Enter]で次のフォーカス移動
  CheckBox2.Checked := plDateEdit1.EnterNext;
  //和暦・西暦表示切換}
  CheckBox3.Checked := plDateEdit1.Gengo;
  //入力エラー表示の有無
  CheckBox4.Checked := plDateEdit1.DisplayError;
  //空白データ許可の有無
  CheckBox5.Checked := plDateEdit1.CanEmpty;
  //年の入力桁数
  CheckBox6.Checked := plDateEdit1.Yeardigit = yddigit2;
  //日付と時刻入力が上下か
  CheckBox7.Checked := plDateEdit1.SpaceWidth < 0;
  //フォーカス移動でAutoSelectにするか
  CheckBox8.Checked := plDateEdit1.AutoSelect;

  //元号選択コンボ
  CheckBox20.Checked := plDateEdit1.EditGengo;
  //午前午後選択コンボ
  CheckBox21.Checked := plDateEdit1.EditAmpm;

   //表示コントロール応じてRadioGroupをセット
  if plDateEdit1.EditStyle = desYearMonthDay     then RadioGroup1.ItemIndex := 0;
  if plDateEdit1.EditStyle = desYearMonth        then RadioGroup1.ItemIndex := 1;
  if plDateEdit1.EditStyle = desYear             then RadioGroup1.ItemIndex := 2;
  if plDateEdit1.EditStyle = desYearMonthDayHMS  then RadioGroup1.ItemIndex := 3;
  if plDateEdit1.EditStyle = desYearMonthDayHM   then RadioGroup1.ItemIndex := 4;
  if plDateEdit1.EditStyle = desYearMonthDayH    then RadioGroup1.ItemIndex := 5;
  if plDateEdit1.EditStyle = desHourMinuteSecond then RadioGroup1.ItemIndex := 6;
  if plDateEdit1.EditStyle = desHourMinute       then RadioGroup1.ItemIndex := 7;
  if plDateEdit1.EditStyle = desHour             then RadioGroup1.ItemIndex := 8;

  //[年][月][日]のラベル(LabelYear, LabelMonth, LabelDay)
  ComboBox1.Text := plDateEdit1.LabelYear;
  ComboBox2.Text := plDateEdit1.LabelMonth;
  ComboBox3.Text := plDateEdit1.LabelDay;

//  以下の設定は,表示コントロール等を変更すると無効
//  plDateEdit1.GengoCombo.Enabled   := False;
//  plDateEdit1.GengoCombo.Color     := plDateEdit1.YearLabel.Color;
//  plDateEdit1.GengoCombo.ItemIndex := 1;
end;

//=============================================================================
//  今日の日付と時刻をセットする
//=============================================================================
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  plDateEdit1.DateTime := Now;
end;

//=============================================================================
//  2年前の明日をセットして今日現在の年齢を計算
//  GetAgeメソッドのテスト
//=============================================================================
procedure TForm1.SpeedButton2Click(Sender: TObject);
var
  Year,Month: Integer;
  Date1,Date2:TDateTime;
begin
  Date1 := Trunc(IncMonth(Now + 1, -24));
  Date2 := Trunc(Now);
  plDateEdit1.DateTime := Date1;

  Panel1.Caption := ' ';
  Panel2.Caption := ' ';
  //通常年齢の計算
  if plDateEdit1.GetAge(Date1, Date2, 0, Year, Month) then begin
    Panel1.Caption := ' ( 通常年齢 )  ' +
                      IntToStr(Year)    + '歳 ' +
                      IntToStr(Month)   + 'ヶ月';
  end;

  //経過年齢.便宜上,法的年齢と表示
  if plDateEdit1.GetAge(Date1, Date2, 1, Year, Month) then begin
    Panel2.Caption := ' ( 法的年齢 )  ' +
                      IntToStr(Year)    + '歳 '+
                      IntToStr(Month)   + 'ヶ月';
  end;
end;

//=============================================================================
//  元号選択日付入力コンポにフォーカス移動
//=============================================================================
procedure TForm1.SpeedButton3Click(Sender: TObject);
begin
  plDateEdit1.SetFocus;
end;

//=============================================================================
//  入力コントロールの値を全てクリアして空白にする
//  SetEditEmptyメソッドのテスト
//=============================================================================
procedure TForm1.SpeedButton4Click(Sender: TObject);
begin
  plDateEdit1.SetEditEmpty;
end;

//=============================================================================
//  各プロパティの取得テスト
//  エラーの検出とエラー内容の取得テスト
//  このコンポでは,日付関係のプロパティを取得する時にサイレント例外
//  が発生する.その利用処理.
//=============================================================================
procedure TForm1.SpeedButton5Click(Sender: TObject);
var
  ACap        : String;
  FmtDate     : String;
  FmtTime     : String;
  StrDate     : String;
  StrTime     : String;
  StrDateTime : String;
  StrAmpm     : String;
begin
  StatusBar1.Panels[1].Text := '';
  ACap := '日付時刻入力  ';

  FmtDate := '  yyyy"年"mm"月"dd"日" ';
  FmtTime := '  hh"時"nn"分"ss"秒"';

  try
    StrDate := FormatDateTime(FmtDate, Trunc(plDateEdit1.DateTime));
    StrTime := FormatDateTime(FmtTime, Frac (plDateEdit1.DateTime));

    if plDateEdit1.EditAmpm  then StrAmpm := plDateEdit1.AmpmStr
                             else StrAmpm := '';

    if plDateEdit1.Gengo then begin
      StrDateTime := plDateEdit1.GengoStr            +
                     IntToStr(plDateEdit1.GengoYear) + '年'+
                     IntToStr(plDateEdit1.Month)     + '月'+
                     IntToStr(plDateEdit1.Day)       + '日'+
                     ' ' + StrAmpm                   +
                     IntToStr(plDateEdit1.Hour)      + '時'+
                     IntToStr(plDateEdit1.Minute)    + '分'+
                     IntToStr(plDateEdit1.Second)    + '秒';
    end else begin
      StrDateTime:= IntToStr(plDateEdit1.Year)   + '年' +
                    IntToStr(plDateEdit1.Month)  + '月' +
                    IntToStr(plDateEdit1.Day)    + '日' +
                    '  ' + StrAmpm               +
                    IntToStr(plDateEdit1.Hour)   + '時' +
                    IntToStr(plDateEdit1.Minute) + '分' +
                    IntToStr(plDateEdit1.Second) + '秒';
    end;
    //ステータスバーに取得したプロパティ値を表示
    StatusBar1.Panels[1].Text := StrDate+StrTime+'  ( '+StrDateTime+' )';
  except
    //内蔵のエラーダイアログを表示しない時は
    //キャプションにエラー内容を付加したダイアログを表示
    if plDateEdit1.DisplayError=False then begin
      if derAllEmpty         in plDateEdit1.ErrorKinds  then
                                ACap := ACap + ' [全空白]';
      if derYearEmpty        in plDateEdit1.ErrorKinds  then
                                ACap := ACap + ' [年空白]';
      if derMonthEmpty       in plDateEdit1.ErrorKinds  then
                                ACap := ACap + ' [月空白]';
      if derDayEmpty         in plDateEdit1.ErrorKinds  then
                                ACap := ACap + ' [日空白]';
      if derAmPmEmpty        in plDateEdit1.ErrorKinds  then
                                ACap := ACap + ' [午前午後未選択]';
      if derHourEmpty        in plDateEdit1.ErrorKinds  then
                                ACap := ACap + ' [時空白]';
      if derMinuteEmpty      in plDateEdit1.ErrorKinds  then
                                ACap := ACap + ' [分空白]';
      if derSecondEmpty      in plDateEdit1.ErrorKinds  then
                                ACap := ACap + ' [秒空白]';
      if derDateTimeError    in plDateEdit1.ErrorKinds  then
                                ACap := ACap + ' [日付時刻不正]';
      if derDateError        in plDateEdit1.ErrorKinds  then
                                ACap := ACap + ' [日付不正]';
      if derTimeError        in plDateEdit1.ErrorKinds  then
                                ACap := ACap + ' [時刻日付]';
      if derSetDateTimeError in plDateEdit1.ErrorKinds  then
                                ACap := ACap + ' [セット日付時刻不正]';
      if derSetDateError     in plDateEdit1.ErrorKinds  then
                                ACap := ACap + ' [セット日付不正]';
      if derSetTimeError     in plDateEdit1.ErrorKinds  then
                                ACap := ACap + ' [セット時刻不正]';
      if derBeforeBaseDate   in plDateEdit1.ErrorKinds  then
                                ACap := ACap + ' [範囲外日付]';
      if derChangeGengo      in plDateEdit1.ErrorKinds  then
                                ACap := ACap + ' [和暦オーバ]';
      Application.MessageBox('入力した値が正しくありません.  ',
                             PChar(ACap),
                             MB_OK + MB_ICONINFORMATION);
    end;
  end;
end;

//=============================================================================
//  コンポがフォーカスを失った時に入力チェックを行うか否かの設定
//  (EnterCheckプロパティの設定)
//=============================================================================
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  plDateEdit1.ExitCheck := CheckBox1.Checked;
end;

//=============================================================================
//  [Enter]で次の入力欄に移動
//  ([Shift]+[Enter]で逆方向)
//  Windowsでは[Tab]で次のコントロール,[Shift]+[Tab]が前のコントロールへの移
//  動なので,それに習って[Enter]が次,[Shift]+[Enter]を前のコントロールへの移
//  動としている.
//=============================================================================
procedure TForm1.CheckBox2Click(Sender: TObject);
begin
  plDateEdit1.EnterNext := CheckBox2.Checked;
end;

//=============================================================================
//  和暦・西暦表示の切換えGengoプロパティのテスト
//  Trueなら和暦表示
//=============================================================================
procedure TForm1.CheckBox3Click(Sender: TObject);
begin
  plDateEdit1.Gengo := CheckBox3.Checked;
end;

//=============================================================================
//  plDateEdit内部のエラー表示ダイアログ使用の有無
//=============================================================================
procedure TForm1.CheckBox4Click(Sender: TObject);
begin
    plDateEdit1.DisplayError := CheckBox4.Checked;
end;
//=============================================================================
//  全入力が空白を許可(エラー扱いにしない)を設定
//=============================================================================
procedure TForm1.CheckBox5Click(Sender: TObject);
begin
  plDateEdit1.CanEmpty := CheckBox5.Checked;
end;

//=============================================================================
//  [年2桁表示]
//  年の入力桁数の設定
//=============================================================================
procedure TForm1.CheckBox6Click(Sender: TObject);
begin
  if CheckBox6.Checked then begin
    plDateEdit1.Yeardigit := yddigit2;
  end else begin
    plDateEdit1.Yeardigit := yddigit4;
  end;
end;

//=============================================================================
//  [日付時刻上下]
//  日付と時刻入力の両方を表示した時に時刻入力を下に表示
//=============================================================================
procedure TForm1.CheckBox7Click(Sender: TObject);
begin
  if CheckBox7.Checked then begin
    plDateEdit1.SpaceWidth := -5;
  end else begin
    plDateEdit1.SpaceWidth := 10;
  end;
end;

//=============================================================================
//  [AutoSelect]
//  AutoSelectプロパティのテスト(コンボリストの配色の確認)
//=============================================================================
procedure TForm1.CheckBox8Click(Sender: TObject);
begin
  plDateEdit1.AutoSelect := CheckBox8.Checked;
end;

//=============================================================================
//  [元号選択]
//  元号選択コンボボックスを表示
//  元号選択リストを非表示にすると西暦専用となるので和暦・西暦切換不可に
//=============================================================================
procedure TForm1.CheckBox20Click(Sender: TObject);
begin
  if CheckBox20.Checked then begin
    plDateEdit1.EditGengo := True;
    CheckBox3.Checked     := True;
    CheckBox3.Enabled     := True;
  end else begin
    plDateEdit1.EditGengo := False;
    CheckBox3.Checked     := False;
    CheckBox3.Enabled     := False;
  end;
end;

//=============================================================================
//  [午前午後]
//  午前午後の選択コンボボックスを表示
//  表示すると時の表示は12時間入力モード(非表示の時は24時間入力モード)
//=============================================================================
procedure TForm1.CheckBox21Click(Sender: TObject);
begin
  plDateEdit1.EditAmpm := CheckBox21.Checked;
end;

//=============================================================================
//  各入力用コントロールの表示非表示の設定
//=============================================================================
procedure TForm1.RadioGroup1Click(Sender: TObject);
var
  AItem : Integer;
begin
  AItem := RadioGroup1.ItemIndex;
  case AItem of
    //年・月・日
    0: plDateEdit1.EditStyle := desYearMonthDay;
    //年・月
    1: plDateEdit1.EditStyle := desYearMonth;
    //
    2: plDateEdit1.EditStyle := desYear;
    //年・月・日・時・分・秒
    3: plDateEdit1.EditStyle := desYearMonthDayHMS;
    //年・月・日・時・分
    4: plDateEdit1.EditStyle := desYearMonthDayHM;
    //年・月・日・時
    5: plDateEdit1.EditStyle := desYearMonthDayH;
    //時・分・秒
    6: plDateEdit1.EditStyle := desHourMinuteSecond;
    //時・分
    7: plDateEdit1.EditStyle := desHourMinute;
    //
    8: plDateEdit1.EditStyle := desHour;
  end;
end;

//=============================================================================
//  年,月,日のラベルの設定
//  表示する文字列をコンボボックスから選択またタイプ
//=============================================================================
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  if Sender=ComboBox1 then plDateEdit1.LabelYear  := ComboBox1.Text;
  if Sender=ComboBox2 then plDateEdit1.LabelMonth := ComboBox2.Text;
  if Sender=ComboBox3 then plDateEdit1.LabelDay   := ComboBox3.Text;
end;

//=============================================================================
//  フォントの変更
//  フォント設定ダイアログを表示して設定
//=============================================================================
procedure TForm1.SpeedButton6Click(Sender: TObject);
begin
  FontDialog1.Font.Assign(plDateEdit1.Font);
  if FontDialog1.Execute then begin
    plDateEdit1.Font.Assign(FontDialog1.Font);
  end;
end;

end.