元号選択式日付時刻入力コンポーネント
テストプログラム 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秒
|
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.
|