C:\pldateedit\plDateEdit.pas C:\pldateedit\plDateEdit.pas.old
{$A+,B-,C+,D+,E-,F-,G+,H+,I+,J+,K-,L+,M-,N+,O+,P+,Q-,R-,S-,T-,U-,V+,W-,X+,Y+,Z1}  {$A+,B-,C+,D+,E-,F-,G+,H+,I+,J+,K-,L+,M-,N+,O+,P+,Q-,R-,S-,T-,U-,V+,W-,X+,Y+,Z1}
{$WARNINGS OFF}  {$WARNINGS OFF}
//============================================================================= //=============================================================================
//  元号選択式日付時刻入力コンポーネント //  元号選択式日付時刻入力コンポーネント
// //
//  plDateEdit  (ピーエルデイトエディト)           データベース非対応 //  plDateEdit  (ピーエルデイトエディト)           データベース非対応
//  plDBDateEdit(ピーエルディービーデイトエディト) データベース対応 //  plDBDateEdit(ピーエルディービーデイトエディト) データベース対応
// //
//  コンボボックスで元号(西暦も)選択する方式.年齢(年月)計算メソッド付き //  コンボボックスで元号(西暦も)選択する方式.年齢(年月)計算メソッド付き
//  元号選択コンボボックスが空の時は西暦と見なす //  元号選択コンボボックスが空の時は西暦と見なす
//  午前午後選択コンボボックスが空の時はエラー //  午前午後選択コンボボックスが空の時はエラー
// //
//  元号の文字列は,ユニットSysUtils内のEraNames配列から取得している //  元号の文字列は,ユニットSysUtils内のEraNames配列から取得している
//  したがって新元号が必要となった場合,OSかDelphiをUpdateしなければならない //  したがって新元号が必要となった場合,OSかDelphiをUpdateしなければならない
// //
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// //
//  【使用条件等】 //  【使用条件等】
// //
//  当サイトのアプリケーション類,コンポーネント,コード類は,転載,改変,配布 //  当サイトのアプリケーション類,コンポーネント,コード類は,転載,改変,配布
//  (オリジナル,改変版)などは全て自由です.商用利用も自由です.連絡,使用の記 //  (オリジナル,改変版)などは全て自由です.商用利用も自由です.連絡,使用の記
//  載義務もありません.ただしオリジナルそのものを商用とすることは禁止します. //  載義務もありません.ただしオリジナルそのものを商用とすることは禁止します.
//  また,配布の際,いかなる理由があろうとも相手に代価を求めることを禁止します. //  また,配布の際,いかなる理由があろうとも相手に代価を求めることを禁止します.
//  なお,本サイトのプログラムやコードを使用したことによって生じた,いかなる障 //  なお,本サイトのプログラムやコードを使用したことによって生じた,いかなる障
//  害,損失に関しても作者は一切関与しないものとします.ご了承下さい. //  害,損失に関しても作者は一切関与しないものとします.ご了承下さい.
// //
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// //
//  和暦西暦に関する注意 //  和暦西暦に関する注意
// //
//  Delphiでは太陽暦のみ和暦に換算するため,1873.1.1より前は和暦なし //  Delphiでは太陽暦のみ和暦に換算するため,1873.1.1より前は和暦なし
//  このコンポでは1873.1.1(明治6年1月1日)より前は変換しない. //  このコンポでは1873.1.1(明治6年1月1日)より前は変換しない.
// //
//  DateTime := 0は1899年12月30日 午前12:00 //  DateTime := 0は1899年12月30日 午前12:00
// //
//  明治5年までは太陰暦.以降は太陽暦 //  明治5年までは太陰暦.以降は太陽暦
//  1873年1月1日に改暦して太陽暦に変わった //  1873年1月1日に改暦して太陽暦に変わった
// //
//  太陰暦は明治5年12月2日で終わり. //  太陰暦は明治5年12月2日で終わり.
//  太陽暦は明治5年12月3日を明治6年1月1日として開始. //  太陽暦は明治5年12月3日を明治6年1月1日として開始.
//  大隈重信がひっぱくする政府財政問題として,閏の月があると,一年間で13ヶ月分の //  大隈重信がひっぱくする政府財政問題として,閏の月があると,一年間で13ヶ月分の
//  給与を支払うことを問題となったので(1年は384日),そこで急遽決めた(明治5年11 //  給与を支払うことを問題となったので(1年は384日),そこで急遽決めた(明治5年11
//  月9日決定).そこで12月の2日分の給与は支給されず,財政を問題をなんとか保った. //  月9日決定).そこで12月の2日分の給与は支給されず,財政を問題をなんとか保った.
// //
//  1872年 1月 1日は明治4年11月21日 //  1872年 1月 1日は明治4年11月21日
//  1872年11月21日は明治5年 1月 1日 //  1872年11月21日は明治5年 1月 1日
//  1872年12月31日は明治5年12月 2日 //  1872年12月31日は明治5年12月 2日
//  1873年 1月 1日は明治6年 1月 1日 (和暦と西暦の月日が一致した) //  1873年 1月 1日は明治6年 1月 1日 (和暦と西暦の月日が一致した)
// //
//  明治は1868年 1月 1日から 1912年 7月29日まで //  明治は1868年 1月 1日から 1912年 7月29日まで
//      (明治は1年9月8日から    5年12月2日までと) //      (明治は1年9月8日から    5年12月2日までと)
//      (      6年1月1日から   45年 7月29日まで) //      (      6年1月1日から   45年 7月29日まで)
// //
//  大正は1912年 7月30日から1926年12月24日まで //  大正は1912年 7月30日から1926年12月24日まで
//      (大正は1年7月30日から 15年12月24日まで) //      (大正は1年7月30日から 15年12月24日まで)
// //
//  昭和は1926年12月25日から 1989年 1月7日まで //  昭和は1926年12月25日から 1989年 1月7日まで
//      (昭和は1年12月25日から 64年1月7日まで) //      (昭和は1年12月25日から 64年1月7日まで)
// //
//  平成は1989年 1月 8日から //  平成は1989年 1月 8日から
//      (平成は 1年1月8日から) //      (平成は 1年1月8日から)
// //
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// //
//  バク,仕様? //  バク,仕様?
//  ・ 1873年1月1日(明治6年1月1日)より前はエラー扱い. //  ・ 1873年1月1日(明治6年1月1日)より前はエラー扱い.
//  ・ 和暦の場合,平成100年以上はエラー扱い. //  ・ 和暦の場合,平成100年以上はエラー扱い.
//  ・ サイズはFontサイズによる自動調整で変更できない. //  ・ サイズはFontサイズによる自動調整で変更できない.
//  ・ フォントの種類によっては入力欄に正常表示できないことがある. //  ・ フォントの種類によっては入力欄に正常表示できないことがある.
//  ・ 年齢計算(XX年XXヶ月まで算出)メソッドがある. //  ・ 年齢計算(XX年XXヶ月まで算出)メソッドがある.
// //
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// //
//  【履歴】 //  【履歴】
// //
//  2003年07月20日 Ver. 1.0 //  2003年07月20日 Ver. 1.0
// //
//  ---  中略 ---- //  ---  中略 ----
// //
//  2009年11月13日 Ver9.00 //  2009年11月13日 Ver9.00
//  ・Delphi2009,2010動作確認 //  ・Delphi2009,2010動作確認
//  ・元号文字列のセットコードを修正 //  ・元号文字列のセットコードを修正
// //
//  2010年03月20日 Ver9.01 //  2010年03月20日 Ver9.01
//  ・SetEditEmptyメソッド実行後に年または月だけの入力にすると入力した日付がエ //  ・SetEditEmptyメソッド実行後に年または月だけの入力にすると入力した日付がエ
//    ラーとなる現象を修正 //    ラーとなる現象を修正
// //
//  2012年06月30日 Ver9.02 //  2012年06月30日 Ver9.02
//  ・欧文フォントにすると,元号選択コンボボックスの高さが小さくなる現象を修正 //  ・欧文フォントにすると,元号選択コンボボックスの高さが小さくなる現象を修正
//  ・ランタイムテーマを有効にした時のデザインを調整 //  ・ランタイムテーマを有効にした時のデザインを調整
//  ・コード整備 //  ・コード整備
// //
//  注: Delphi2009対応または確認済みのコンポーネントのバージョンは9.XX //  注: Delphi2009対応または確認済みのコンポーネントのバージョンは9.XX
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// //
//  【動作確認環境】 (Delphi for Win32) //  【動作確認環境】 (Delphi for Win32)
// //
//  Windows XP(SP3)    + Delphi 6 Pro(UP2) //  Windows XP(SP3)    + Delphi 6 Pro(UP2)
//                     + Delphi 7 Pro //                     + Delphi 7 Pro
//                     + Delphi 2007-R2 Pro //                     + Delphi 2007-R2 Pro
//                     + Delphi 2009 Pro(UP3) //                     + Delphi 2009 Pro(UP3)
//                     + Delphi XE Pro //                     + Delphi XE Pro
//                     + Delphi 2010 Pro //                     + Delphi 2010 Pro
//  Windows 7 U64(SP2) + Delphi 2007-R2 Pro //  Windows 7 U64(SP2) + Delphi 2007-R2 Pro
//                     + Delphi 2009 Pro(UP3) //                     + Delphi 2009 Pro(UP3)
//                     + Delphi 2010 Pro //                     + Delphi 2010 Pro
//                     + Delphi XE Pro //                     + Delphi XE Pro
//                     + Delphi XE2(UP4) Pro VCL-32, VCL-64 //                     + Delphi XE2(UP4) Pro VCL-32, VCL-64
// //
//  Presented by Mr.XRAY //  Presented by Mr.XRAY
//  http://mrxray.on.coocan.jp/ //  http://mrxray.on.coocan.jp/
//============================================================================= //=============================================================================
unit plDateEdit; unit plDateEdit;
   
interface interface
   
uses uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 ExtCtrls, StdCtrls,DB,DBCtrls,Variants;  ExtCtrls, StdCtrls,DB,DBCtrls,Variants;
   
type type
   
 //入力欄の表示・非表示を設定する要素の定義  //入力欄の表示・非表示を設定する要素の定義
 //元号選択リストの表示・非表示の設定はEditGengoプロパティ  //元号選択リストの表示・非表示の設定はEditGengoプロパティ
 TplDateEditStyle = ( desYearMonthDayHMS,   //年月日時分秒  TplDateEditStyle = ( desYearMonthDayHMS,   //年月日時分秒
                      desYearMonthDayHM,    //年月日時分                       desYearMonthDayHM,    //年月日時分
                      desYearMonthDayH,     //年月日時                       desYearMonthDayH,     //年月日時
                      desYearMonthDay,      //年月日                       desYearMonthDay,      //年月日
                      desYearMonth,         //年月                       desYearMonth,         //年月
                      desYear,              //年                       desYear,              //年
                      desHourMinuteSecond,  //時分秒                       desHourMinuteSecond,  //時分秒
                      desHourMinute,        //時分                       desHourMinute,        //時分
                      desHour);             //時                       desHour);             //時
   
 //エラーの種類  //エラーの種類
 TplDateEditError = (derAllEmpty,          //全ての入力欄が空  TplDateEditError = (derAllEmpty,          //全ての入力欄が空
                     derYearEmpty,         //年の欄が空                      derYearEmpty,         //年の欄が空
                     derMonthEmpty,        //月の欄が空                      derMonthEmpty,        //月の欄が空
                     derDayEmpty,          //日の欄が空                      derDayEmpty,          //日の欄が空
                     derAMPMEmpty,         //午前午後の蘭が空                      derAMPMEmpty,         //午前午後の蘭が空
                     derHourEmpty,         //時の蘭が空                      derHourEmpty,         //時の蘭が空
                     derMinuteEmpty,       //分の蘭が空                      derMinuteEmpty,       //分の蘭が空
                     derSecondEmpty,       //秒の蘭が空                      derSecondEmpty,       //秒の蘭が空
                     derBeforeBaseDate,    //明治6年1月1日より前の日付である                      derBeforeBaseDate,    //明治6年1月1日より前の日付である
                     derDateTimeError,     //日付時刻型の変換エラー                      derDateTimeError,     //日付時刻型の変換エラー
                     derDateError,         //日付部の変換エラー                      derDateError,         //日付部の変換エラー
                     derTimeError,         //時刻部の変換エラー                      derTimeError,         //時刻部の変換エラー
                     derSetDateTimeError,  //入力した日付時刻型変数値の間違い                      derSetDateTimeError,  //入力した日付時刻型変数値の間違い
                     derSetDateError,      //入力した(Dateプロパティのセット)日付間違い                      derSetDateError,      //入力した(Dateプロパティのセット)日付間違い
                     derSetTimeError,      //入力した(Timeプロパティのセット)時刻間違い                      derSetTimeError,      //入力した(Timeプロパティのセット)時刻間違い
                     derChangeGengo);      //2088以降は和暦変換不可能                      derChangeGengo);      //2088以降は和暦変換不可能
   
 //年の入力桁数  //年の入力桁数
 TplYeardigitSet = (yddigit2, yddigit4);  TplYeardigitSet = (yddigit2, yddigit4);
   
 //エラーの種類の集合体  //エラーの種類の集合体
 TplDateEditErrors = set of TplDateEditError;  TplDateEditErrors = set of TplDateEditError;
   
 //TplDateEditLabeはVer1.1で追加  //TplDateEditLabeはVer1.1で追加
 TplDateEdit = class;  TplDateEdit = class;
   
 TplDateEditLabel = class(TCustomControl)  TplDateEditLabel = class(TCustomControl)
 private  private
   FplDate : TplDateEdit;    FplDate : TplDateEdit;
 protected  protected
 public  public
   property Color;    property Color;
   property Font;    property Font;
   property Text;    property Text;
   procedure Paint; override;    procedure Paint; override;
 published  published
 end;  end;
   
 TplDateEditEdit = TMemo;  TplDateEditEdit = TMemo;
   
 TplDateEdit = class(TCustomControl)  TplDateEdit = class(TCustomControl)
 private  private
   FDateTime        : TDateTime;    FDateTime        : TDateTime;
   FDate            : TDateTime;    FDate            : TDateTime;
   
   FGengo           : Boolean;    FGengo           : Boolean;
   FBaseDate        : TDateTime;    FBaseDate        : TDateTime;
   FCanEmpty        : Boolean;    FCanEmpty        : Boolean;
   FIsEmpty         : Boolean;    FIsEmpty         : Boolean;
   FAutoSelect      : Boolean;    FAutoSelect      : Boolean;
   
   FGengoStr        : String;    FGengoStr        : String;
   FGengoYear       : Integer;    FGengoYear       : Integer;
   FGengoYearStr    : String;    FGengoYearStr    : String;
   FAmpmStr         : String;    FAmpmStr         : String;
   
   FYear            : Integer;    FYear            : Integer;
   FMonth           : Integer;    FMonth           : Integer;
   FDay             : Integer;    FDay             : Integer;
   FHour            : Integer;    FHour            : Integer;
   FMinute          : Integer;    FMinute          : Integer;
   FSecond          : Integer;    FSecond          : Integer;
   FYearStr         : String;    FYearStr         : String;
   FMonthStr        : String;    FMonthStr        : String;
   FDayStr          : String;    FDayStr          : String;
   FHourStr         : String;    FHourStr         : String;
   FMinuteStr       : String;    FMinuteStr       : String;
   FSecondStr       : String;    FSecondStr       : String;
   FYeardigit       : TplYeardigitSet;    FYeardigit       : TplYeardigitSet;
   
   FFocusedColor    : TColor;    FFocusedColor    : TColor;
   FDisableFontColor: TColor;    FDisableFontColor: TColor;
   FDisableColor    : TColor;    FDisableColor    : TColor;
   
   FYearEdit        : TplDateEditEdit;    FYearEdit        : TplDateEditEdit;
   FMonthEdit       : TplDateEditEdit;    FMonthEdit       : TplDateEditEdit;
   FDayEdit         : TplDateEditEdit;    FDayEdit         : TplDateEditEdit;
   FHourEdit        : TplDateEditEdit;    FHourEdit        : TplDateEditEdit;
   FMinuteEdit      : TplDateEditEdit;    FMinuteEdit      : TplDateEditEdit;
   FSecondEdit      : TplDateEditEdit;    FSecondEdit      : TplDateEditEdit;
   
   FYearLabel       : TplDateEditLabel;    FYearLabel       : TplDateEditLabel;
   FMonthLabel      : TplDateEditLabel;    FMonthLabel      : TplDateEditLabel;
   FDayLabel        : TplDateEditLabel;    FDayLabel        : TplDateEditLabel;
   FHourLabel       : TplDateEditLabel;    FHourLabel       : TplDateEditLabel;
   FMinuteLabel     : TplDateEditLabel;    FMinuteLabel     : TplDateEditLabel;
   FSecondLabel     : TplDateEditLabel;    FSecondLabel     : TplDateEditLabel;
   
   FLabelYear       : String;    FLabelYear       : String;
   FLabelMonth      : String;    FLabelMonth      : String;
   FLabelDay        : String;    FLabelDay        : String;
   FLabelHour       : String;    FLabelHour       : String;
   FLabelMinute     : String;    FLabelMinute     : String;
   FLabelSecond     : String;    FLabelSecond     : String;
   FSpaceWidth      : Integer;    FSpaceWidth      : Integer;
   
   FGengoCombo      : TComboBox;    FGengoCombo      : TComboBox;
   FAmpmCombo       : TComboBox;    FAmpmCombo       : TComboBox;
   FEditGengo       : Boolean;    FEditGengo       : Boolean;
   FEditAmpm        : Boolean;    FEditAmpm        : Boolean;
   
   FEnterNext       : Boolean;    FEnterNext       : Boolean;
   FExitCheck       : Boolean;    FExitCheck       : Boolean;
   FDisplayError    : Boolean;    FDisplayError    : Boolean;
   FDropDownKey     : Boolean;    FDropDownKey     : Boolean;
   FDialogCaption   : String;    FDialogCaption   : String;
   FEditStyle       : TplDateEditStyle;    FEditStyle       : TplDateEditStyle;
   FTabStop         : Boolean;    FTabStop         : Boolean;
   FColor           : TColor;    FColor           : TColor;
   FErrorKinds      : TplDateEditErrors;    FErrorKinds      : TplDateEditErrors;
   FOnKeyPress      : TKeyPressEvent;    FOnKeyPress      : TKeyPressEvent;
   FOnKeyDown       : TKeyEvent;    FOnKeyDown       : TKeyEvent;
   FOnChange        : TNotifyEvent;    FOnChange        : TNotifyEvent;
   FOnClick         : TNotifyEvent;    FOnClick         : TNotifyEvent;
   FFocused         : Boolean;    FFocused         : Boolean;
   SingleHeight     : Integer;    SingleHeight     : Integer;
   fgResize         : Boolean;      //リサイズ制御変数    fgResize         : Boolean;      //リサイズ制御変数
   fgTabStop        : Boolean;    fgTabStop        : Boolean;
   
   DefHeightItemHeightCombo : Integer;    DefHeightItemHeightCombo : Integer;
   
   procedure SetDate(const Value: TDateTime);    procedure SetDate(const Value: TDateTime);
   function GetDate: TDateTime;    function GetDate: TDateTime;
   procedure SetGengo(const Value: Boolean);    procedure SetGengo(const Value: Boolean);
   function GetProperties: Boolean;    function GetProperties: Boolean;
   procedure SetEditStyle(const Value: TplDateEditStyle);    procedure SetEditStyle(const Value: TplDateEditStyle);
   procedure SetEditGengo(const Value: Boolean);    procedure SetEditGengo(const Value: Boolean);
   procedure SetControlResizePosition(EmptyFlag:Boolean=True);    procedure SetControlResizePosition(EmptyFlag:Boolean=True);
   function GetDateStr(index: Integer): String;    function GetDateStr(index: Integer): String;
   function GetDateInt(index: Integer): Integer;    function GetDateInt(index: Integer): Integer;
   procedure SetControlFocus(AWinControl: TWinControl);    procedure SetControlFocus(AWinControl: TWinControl);
   function GetIsEmpty: Boolean;    function GetIsEmpty: Boolean;
   function CheckDateError: Boolean;    function CheckDateError: Boolean;
   procedure ShowErrorDialog(ERStr: String; AWinControl: TWinControl);    procedure ShowErrorDialog(ERStr: String; AWinControl: TWinControl);
   procedure EditKeyPress(Sender: TObject; var Key: Char);virtual;    procedure EditKeyPress(Sender: TObject; var Key: Char);virtual;
   procedure EditKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);virtual;    procedure EditKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);virtual;
   procedure EditChange(Sender: TObject); virtual;    procedure EditChange(Sender: TObject); virtual;
   procedure EditClick (Sender: TObject); virtual;         procedure EditClick (Sender: TObject); virtual;    
   procedure GengoDropDown(Sender: TObject);    procedure GengoDropDown(Sender: TObject);
   procedure EditEnter(Sender: TObject); virtual;    procedure EditEnter(Sender: TObject); virtual;
   procedure EditExit(Sender: TObject);    procedure EditExit(Sender: TObject);
   procedure CreateComboBox(ACombo : TComboBox );    procedure CreateComboBox(ACombo : TComboBox );
   procedure CreateLabel(ALabel: TplDateEditLabel; AText:String);    procedure CreateLabel(ALabel: TplDateEditLabel; AText:String);
   procedure CreateEditBox(AMemo: TplDateEditEdit);    procedure CreateEditBox(AMemo: TplDateEditEdit);
   procedure CMEnabledChanged(var Message: TWMNoParams); message CM_ENABLEDCHANGED;    procedure CMEnabledChanged(var Message: TWMNoParams); message CM_ENABLEDCHANGED;
   procedure CMFontChanged(var Message: TWMNoParams); message CM_FONTCHANGED;    procedure CMFontChanged(var Message: TWMNoParams); message CM_FONTCHANGED;
   procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;    procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
   procedure CMWantSpecialKey(var Msg: TMessage); message CM_WANTSPECIALKEY;    procedure CMWantSpecialKey(var Msg: TMessage); message CM_WANTSPECIALKEY;
   procedure SetEditColor;    procedure SetEditColor;
   procedure SetLabelCaption(const index: Integer; const Value: String);    procedure SetLabelCaption(const index: Integer; const Value: String);
   procedure SetControlTabStop(const Value: Boolean);    procedure SetControlTabStop(const Value: Boolean);
   procedure SetControlColor(const Value: TColor);    procedure SetControlColor(const Value: TColor);
   procedure SetDisableColor(const Value: TColor);    procedure SetDisableColor(const Value: TColor);
   procedure SetDisableFontColor(const Value: TColor);    procedure SetDisableFontColor(const Value: TColor);
   procedure GengoDrawItem(Control: TWinControl; Index: Integer;    procedure GengoDrawItem(Control: TWinControl; Index: Integer;
            Rect: TRect; State: TOwnerDrawState);             Rect: TRect; State: TOwnerDrawState);
   procedure SetEditAmpm(const Value: Boolean);    procedure SetEditAmpm(const Value: Boolean);
   procedure ControlShowHide(Sender: TObject; ATop,AHeight: Integer; AFlag: Boolean);    procedure ControlShowHide(Sender: TObject; ATop,AHeight: Integer; AFlag: Boolean);
   procedure SetSpaceWidth(const Value: Integer);    procedure SetSpaceWidth(const Value: Integer);
   procedure SetYeardigit(const Value: TplYeardigitSet);    procedure SetYeardigit(const Value: TplYeardigitSet);
   
{$IFDEF CONDITIONALEXPRESSIONS}   
{$IF RTLVersion >= 24.0}   
 class var  
   FFormatSettings: TFormatSettings;  
{$IF RTLVersion >= 26.0}   
   MaxEraCount: Integer;  
   EraNames: array of string;  
   EraYearOffsets: array of Integer;  
{$IFEND}   
   class constructor Create;  
   function FormatDateTime(const Format: string; DateTime: TDateTime): string;  
{$IFEND}   
{$ENDIF}   
 protected  protected
   procedure Loaded; override;    procedure Loaded; override;
   procedure SetParent(AParent: TWinControl); override;    procedure SetParent(AParent: TWinControl); override;
   function CanResize(var NewWidth, NewHeight: Integer): Boolean; override;    function CanResize(var NewWidth, NewHeight: Integer): Boolean; override;
   procedure DoExit; override;    procedure DoExit; override;
 public  public
   { Public 宣言 }     { Public 宣言 }
   constructor Create(AOwner: TComponent);override;    constructor Create(AOwner: TComponent);override;
   destructor Destroy; override;    destructor Destroy; override;
   
   property BaseDate     : TDateTime         read FBaseDate;    property BaseDate     : TDateTime         read FBaseDate;
   property DateTime     : TDateTime         read GetDate     write SetDate;    property DateTime     : TDateTime         read GetDate     write SetDate;
   property Date         : TDateTime         read GetDate     write SetDate;    property Date         : TDateTime         read GetDate     write SetDate;
   
   property GengoCombo   : TComboBox         read FGengoCombo;    property GengoCombo   : TComboBox         read FGengoCombo;
   property AmpmCombo    : TComboBox         read FAmpmCombo;    property AmpmCombo    : TComboBox         read FAmpmCombo;
   property YearEdit     : TplDateEditEdit   read FYearEdit;    property YearEdit     : TplDateEditEdit   read FYearEdit;
   property MonthEdit    : TplDateEditEdit   read FMonthEdit;    property MonthEdit    : TplDateEditEdit   read FMonthEdit;
   property DayEdit      : TplDateEditEdit   read FDayEdit;    property DayEdit      : TplDateEditEdit   read FDayEdit;
   property HourEdit     : TplDateEditEdit   read FHourEdit;    property HourEdit     : TplDateEditEdit   read FHourEdit;
   property MinuteEdit   : TplDateEditEdit   read FMinuteEdit;    property MinuteEdit   : TplDateEditEdit   read FMinuteEdit;
   property SecondEdit   : TplDateEditEdit   read FSecondEdit;    property SecondEdit   : TplDateEditEdit   read FSecondEdit;
   
   property YearLabel    : TplDateEditLabel  read FYearLabel;    property YearLabel    : TplDateEditLabel  read FYearLabel;
   property MonthLabel   : TplDateEditLabel  read FMonthLabel;    property MonthLabel   : TplDateEditLabel  read FMonthLabel;
   property DayLabel     : TplDateEditLabel  read FDayLabel;    property DayLabel     : TplDateEditLabel  read FDayLabel;
   property HourLabel    : TplDateEditLabel  read FHourLabel;    property HourLabel    : TplDateEditLabel  read FHourLabel;
   property MinuteLabel  : TplDateEditLabel  read FMinuteLabel;    property MinuteLabel  : TplDateEditLabel  read FMinuteLabel;
   property SecondLabel  : TplDateEditLabel  read FSecondLabel;    property SecondLabel  : TplDateEditLabel  read FSecondLabel;
   
   property GengoYear    : Integer   index 1 read GetDateInt;    property GengoYear    : Integer   index 1 read GetDateInt;
   property Year         : Integer   index 2 read GetDateInt;    property Year         : Integer   index 2 read GetDateInt;
   property Month        : Integer   index 3 read GetDateInt;    property Month        : Integer   index 3 read GetDateInt;
   property Day          : Integer   index 4 read GetDateInt;    property Day          : Integer   index 4 read GetDateInt;
   property Hour         : Integer   index 5 read GetDateInt;    property Hour         : Integer   index 5 read GetDateInt;
   property Minute       : Integer   index 6 read GetDateInt;    property Minute       : Integer   index 6 read GetDateInt;
   property Second       : Integer   index 7 read GetDateInt;    property Second       : Integer   index 7 read GetDateInt;
   
   property GengoStr     : String    index 0 read GetDateStr;    property GengoStr     : String    index 0 read GetDateStr;
   property GengoYearStr : String    index 1 read GetDateStr;    property GengoYearStr : String    index 1 read GetDateStr;
   property YearStr      : String    index 2 read GetDateStr;    property YearStr      : String    index 2 read GetDateStr;
   property MonthStr     : String    index 3 read GetDateStr;    property MonthStr     : String    index 3 read GetDateStr;
   property DayStr       : String    index 4 read GetDateStr;    property DayStr       : String    index 4 read GetDateStr;
   property AmpmStr      : String    index 5 read GetDateStr;    property AmpmStr      : String    index 5 read GetDateStr;
   property HourStr      : String    index 6 read GetDateStr;    property HourStr      : String    index 6 read GetDateStr;
   property MinuteStr    : String    index 7 read GetDateStr;    property MinuteStr    : String    index 7 read GetDateStr;
   property SecondStr    : String    index 8 read GetDateStr;    property SecondStr    : String    index 8 read GetDateStr;
   
   property IsEmpty      : Boolean           read GetIsEmpty;    property IsEmpty      : Boolean           read GetIsEmpty;
   property ErrorKinds   : TplDateEditErrors read FErrorKinds;    property ErrorKinds   : TplDateEditErrors read FErrorKinds;
   property Focused      : Boolean           read FFocused;    property Focused      : Boolean           read FFocused;
   function GetAge(Date1,Date2: TDateTime; AgeType:Integer; var gAge,gMonth: Integer): Boolean;    function GetAge(Date1,Date2: TDateTime; AgeType:Integer; var gAge,gMonth: Integer): Boolean;
   procedure SetEditEmpty;    procedure SetEditEmpty;
 published  published
   property Anchors;    property Anchors;
   property Enabled;    property Enabled;
   property Font;    property Font;
   property PopupMenu;    property PopupMenu;
   property ShowHint;    property ShowHint;
   property TabOrder;    property TabOrder;
   property Visible;    property Visible;
   property OnEnter;    property OnEnter;
   property OnExit;    property OnExit;
   
   property EditStyle        : TplDateEditStyle      read FEditStyle        write SetEditStyle;    property EditStyle        : TplDateEditStyle      read FEditStyle        write SetEditStyle;
   property EditGengo        : Boolean               read FEditGengo        write SetEditGengo;    property EditGengo        : Boolean               read FEditGengo        write SetEditGengo;
   property EditAmpm         : Boolean               read FEditAmpm         write SetEditAmpm;    property EditAmpm         : Boolean               read FEditAmpm         write SetEditAmpm;
   property LabelYear        : String        index 1 read FLabelYear        write SetLabelCaption;    property LabelYear        : String        index 1 read FLabelYear        write SetLabelCaption;
   property LabelMonth       : String        index 2 read FLabelMonth       write SetLabelCaption;    property LabelMonth       : String        index 2 read FLabelMonth       write SetLabelCaption;
   property LabelDay         : String        index 3 read FLabelDay         write SetLabelCaption;    property LabelDay         : String        index 3 read FLabelDay         write SetLabelCaption;
   property LabelHour        : String        index 4 read FLabelHour        write SetLabelCaption;    property LabelHour        : String        index 4 read FLabelHour        write SetLabelCaption;
   property LabelMinute      : String        index 5 read FLabelMinute      write SetLabelCaption;    property LabelMinute      : String        index 5 read FLabelMinute      write SetLabelCaption;
   property LabelSecond      : String        index 6 read FLabelSecond      write SetLabelCaption;    property LabelSecond      : String        index 6 read FLabelSecond      write SetLabelCaption;
   property SpaceWidth       : Integer               read FSpaceWidth       write SetSpaceWidth;    property SpaceWidth       : Integer               read FSpaceWidth       write SetSpaceWidth;
   property Yeardigit        : TplYeardigitSet       read FYeardigit        write SetYeardigit;    property Yeardigit        : TplYeardigitSet       read FYeardigit        write SetYeardigit;
   
   property AutoSelect       : Boolean               read FAutoSelect       write FAutoSelect;    property AutoSelect       : Boolean               read FAutoSelect       write FAutoSelect;
   property CanEmpty         : Boolean               read FCanEmpty         write FCanEmpty;    property CanEmpty         : Boolean               read FCanEmpty         write FCanEmpty;
   property Gengo            : Boolean               read FGengo            write SetGengo;    property Gengo            : Boolean               read FGengo            write SetGengo;
   property DisableColor     : TColor                read FDisableColor     write SetDisableColor;    property DisableColor     : TColor                read FDisableColor     write SetDisableColor;
   property DisableFontColor : TColor                read FDisableFontColor write SetDisableFontColor;    property DisableFontColor : TColor                read FDisableFontColor write SetDisableFontColor;
   property DropDownKey      : Boolean               read FDropDownKey      write FDropDownKey;    property DropDownKey      : Boolean               read FDropDownKey      write FDropDownKey;
   property EnterNext        : Boolean               read FEnterNext        write FEnterNext;    property EnterNext        : Boolean               read FEnterNext        write FEnterNext;
   property ExitCheck        : Boolean               read FExitCheck        write FExitCheck;    property ExitCheck        : Boolean               read FExitCheck        write FExitCheck;
   property DisplayError     : Boolean               read FDisplayError     write FDisplayError;    property DisplayError     : Boolean               read FDisplayError     write FDisplayError;
   property FocusedColor     : TColor                read FFocusedColor     write FFocusedColor;    property FocusedColor     : TColor                read FFocusedColor     write FFocusedColor;
   property DialogCaption    : String                read FDialogCaption    write FDialogCaption;    property DialogCaption    : String                read FDialogCaption    write FDialogCaption;
   property TabStop          : Boolean               read FTabStop          write SetControlTabStop;    property TabStop          : Boolean               read FTabStop          write SetControlTabStop;
   property Color            : TColor                read FColor            write SetControlColor;    property Color            : TColor                read FColor            write SetControlColor;
   property OnKeyPress       : TKeyPressEvent        read FOnKeyPress       write FOnkeyPress;    property OnKeyPress       : TKeyPressEvent        read FOnKeyPress       write FOnkeyPress;
   property OnKeyDown        : TKeyEvent             read FOnKeyDown        write FOnkeyDown;    property OnKeyDown        : TKeyEvent             read FOnKeyDown        write FOnkeyDown;
   property OnChange         : TNotifyEvent          read FOnChange         write FOnChange;    property OnChange         : TNotifyEvent          read FOnChange         write FOnChange;
   property OnClick          : TNotifyEvent          read FOnClick          write FOnClick;    property OnClick          : TNotifyEvent          read FOnClick          write FOnClick;
 end;  end;
   
 //データベース用  //データベース用
 TplDBDateEdit = class(TplDateEdit)  TplDBDateEdit = class(TplDateEdit)
 private  private
   IsEdit : Boolean;    IsEdit : Boolean;
   FDataLink : TFieldDataLink;    FDataLink : TFieldDataLink;
   function GetDataField: string;    function GetDataField: string;
   function GetDataSource: TDataSource;    function GetDataSource: TDataSource;
   function GetReadOnly: Boolean;    function GetReadOnly: Boolean;
   procedure SetDataField(const Value: string);    procedure SetDataField(const Value: string);
   procedure SetDataSource(const Value: TDataSource);    procedure SetDataSource(const Value: TDataSource);
   procedure SetReadOnly(const Value: Boolean);    procedure SetReadOnly(const Value: Boolean);
   function FindField: TField;    function FindField: TField;
   procedure EditKeyPress(Sender: TObject; var Key: Char); override;    procedure EditKeyPress(Sender: TObject; var Key: Char); override;
   procedure EditKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState); override;    procedure EditKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState); override;
   procedure EditChange(Sender: TObject); override;    procedure EditChange(Sender: TObject); override;
 protected  protected
   procedure DataChange(Sender: TObject); virtual;    procedure DataChange(Sender: TObject); virtual;
   procedure UpdateData(Sender: TObject);    procedure UpdateData(Sender: TObject);
   procedure DoExit; override;    procedure DoExit; override;
   procedure Notification(AComponent: TComponent; Operation: TOperation); override;    procedure Notification(AComponent: TComponent; Operation: TOperation); override;
 public  public
   constructor Create(AOwner: TComponent); override;    constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;    destructor Destroy; override;
 published  published
   property DataField: string read GetDataField write SetDataField;    property DataField: string read GetDataField write SetDataField;
   property DataSource: TDataSource read GetDataSource write SetDataSource;    property DataSource: TDataSource read GetDataSource write SetDataSource;
   property ReadOnly: Boolean read GetReadOnly write SetReadOnly;    property ReadOnly: Boolean read GetReadOnly write SetReadOnly;
 end;  end;
   
procedure Register; procedure Register;
   
implementation implementation
   
{$IF CompilerVersion > 14.99}  {$IF CompilerVersion > 14.99}
uses Themes, Math; uses Themes, Math;
{$IFEND}  {$IFEND}
   
{ TplDateEdit}  { TplDateEdit}
   
//============================================================================= //=============================================================================
//  コンポーネント初期化 //  コンポーネント初期化
//  内部のコンポーネントの初期化と関係する初期化はSetParentで実行. //  内部のコンポーネントの初期化と関係する初期化はSetParentで実行.
//  このコンポ自体にフォーカス移動すると[Tab]の動作などがうまくないので元の //  このコンポ自体にフォーカス移動すると[Tab]の動作などがうまくないので元の
//  TabStop=Falseにして,別にTabStopを定義. //  TabStop=Falseにして,別にTabStopを定義.
//  Colorも別定義にしてある.これは将来ラベル付きの日付入力用の準備のつもりであ //  Colorも別定義にしてある.これは将来ラベル付きの日付入力用の準備のつもりであ
//  るが,予定は未定なので期待はしないように. //  るが,予定は未定なので期待はしないように.
//============================================================================= //=============================================================================
constructor TplDateEdit.Create(AOwner: TComponent); constructor TplDateEdit.Create(AOwner: TComponent);
begin begin
 inherited Create(AOWner);  inherited Create(AOWner);
         
 inherited TabStop := False;  inherited TabStop := False;
 ParentColor       := True;  ParentColor       := True;
 FAutoSelect       := True;  FAutoSelect       := True;
   
 FErrorKinds := [];  FErrorKinds := [];
end; end;
   
//============================================================================= //=============================================================================
//  コンポーネントのロードが終了したら //  コンポーネントのロードが終了したら
//  現在のところは特に処理なし //  現在のところは特に処理なし
//============================================================================= //=============================================================================
procedure TplDateEdit.Loaded; procedure TplDateEdit.Loaded;
begin begin
 inherited Loaded;  inherited Loaded;
end; end;
   
//============================================================================= //=============================================================================
//  コンポーネント破棄 //  コンポーネント破棄
//  現在のところは特に処理なし //  現在のところは特に処理なし
//============================================================================= //=============================================================================
destructor TplDateEdit.Destroy; destructor TplDateEdit.Destroy;
begin begin
   inherited Destroy;    inherited Destroy;
end; end;
   
//============================================================================= //=============================================================================
//  各コントロールの生成とコンポプロパティの初期化 //  各コントロールの生成とコンポプロパティの初期化
// //
//  コントロールの位置と高さ幅はSetControlResizePositionメソッドで設定 //  コントロールの位置と高さ幅はSetControlResizePositionメソッドで設定
//  コントロールの生成は一番左側の元号選択コンボから //  コントロールの生成は一番左側の元号選択コンボから
// //
//  注意: 何も日付を設定しない(全ての入力コントロールが空の時)に取得した値は, //  注意: 何も日付を設定しない(全ての入力コントロールが空の時)に取得した値は,
//        BaseDateの1日前の値である. //        BaseDateの1日前の値である.
//============================================================================= //=============================================================================
procedure TplDateEdit.SetParent(AParent: TWinControl); procedure TplDateEdit.SetParent(AParent: TWinControl);
begin begin
 inherited;  inherited;
   
 if AParent = nil then exit;  if AParent = nil then exit;
   
 if FGengoCombo=nil then begin  if FGengoCombo=nil then begin
   //本コンポ自体はCaption不要    //本コンポ自体はCaption不要
   Caption := '';    Caption := '';
   
   Canvas.Font := Font;    Canvas.Font := Font;
   FColor      := clWhite;    FColor      := clWhite;
   //元号選択コンボボックスの作成と初期化    //元号選択コンボボックスの作成と初期化
   FGengoCombo := TComboBox.Create(Self);    FGengoCombo := TComboBox.Create(Self);
   CreateComboBox(FGengoCombo);    CreateComboBox(FGengoCombo);
   //初期状態は元号選択で年,月,日.時刻入力はなし    //初期状態は元号選択で年,月,日.時刻入力はなし
   FEditGengo := True;    FEditGengo := True;
   FEditAmpm  := False;    FEditAmpm  := False;
   FEditStyle := desYearMonthDay;    FEditStyle := desYearMonthDay;
   
   //左から順番に決めていかないと,コントロールの左側にわずかの隙間ができてしまう    //左から順番に決めていかないと,コントロールの左側にわずかの隙間ができてしまう
   //日付入力部分とその右のラベルの作成    //日付入力部分とその右のラベルの作成
   FYearEdit   := TplDateEditEdit.Create(Self);    FYearEdit   := TplDateEditEdit.Create(Self);
   FYearLabel  := TplDateEditLabel.Create(Self);    FYearLabel  := TplDateEditLabel.Create(Self);
   FMonthEdit  := TplDateEditEdit.Create(Self);    FMonthEdit  := TplDateEditEdit.Create(Self);
   FMonthLabel := TplDateEditLabel.Create(Self);    FMonthLabel := TplDateEditLabel.Create(Self);
   FDayEdit    := TplDateEditEdit.Create(Self);    FDayEdit    := TplDateEditEdit.Create(Self);
   FDayLabel   := TplDateEditLabel.Create(Self);    FDayLabel   := TplDateEditLabel.Create(Self);
   
   CreateEditBox(FYearEdit);    CreateEditBox(FYearEdit);
   CreateLabel  (FYearLabel,'年');    CreateLabel  (FYearLabel,'年');
   CreateEditBox(FMonthEdit);    CreateEditBox(FMonthEdit);
   CreateLabel  (FMonthLabel,'月');    CreateLabel  (FMonthLabel,'月');
   CreateEditBox(FDayEdit);    CreateEditBox(FDayEdit);
   CreateLabel  (FDayLabel,'日');    CreateLabel  (FDayLabel,'日');
   
   //午前午後選択コンボボックスの作成と初期化    //午前午後選択コンボボックスの作成と初期化
   FAmpmCombo := TComboBox.Create(Self);    FAmpmCombo := TComboBox.Create(Self);
   CreateComboBox(FAmpmCombo);    CreateComboBox(FAmpmCombo);
   
   //時刻入力部分とその右のラベルの作成    //時刻入力部分とその右のラベルの作成
   FHourEdit    := TplDateEditEdit.Create(Self);    FHourEdit    := TplDateEditEdit.Create(Self);
   FHourLabel   := TplDateEditLabel.Create(Self);    FHourLabel   := TplDateEditLabel.Create(Self);
   FMinuteEdit  := TplDateEditEdit.Create(Self);    FMinuteEdit  := TplDateEditEdit.Create(Self);
   FMinuteLabel := TplDateEditLabel.Create(Self);    FMinuteLabel := TplDateEditLabel.Create(Self);
   FSecondEdit  := TplDateEditEdit.Create(Self);    FSecondEdit  := TplDateEditEdit.Create(Self);
   FSecondLabel := TplDateEditLabel.Create(Self);    FSecondLabel := TplDateEditLabel.Create(Self);
   
   CreateEditBox(FHourEdit);    CreateEditBox(FHourEdit);
   CreateLabel  (FHourLabel, '時');    CreateLabel  (FHourLabel, '時');
   CreateEditBox(FMinuteEdit);    CreateEditBox(FMinuteEdit);
   CreateLabel  (FMinuteLabel, '分');    CreateLabel  (FMinuteLabel, '分');
   CreateEditBox(FSecondEdit);    CreateEditBox(FSecondEdit);
   CreateLabel  (FSecondLabel, '秒');    CreateLabel  (FSecondLabel, '秒');
   
   //各プロパティの初期化    //各プロパティの初期化
{$IFDEF CONDITIONALEXPRESSIONS}   
{$IF RTLVersion < 24.0}   
   ShortDateFormat   := 'YYYY/MM/DD';    ShortDateFormat   := 'YYYY/MM/DD';
{$IFEND}   
{$ENDIF}   
   FBaseDate         := VarToDateTime('1873/01/01');    FBaseDate         := VarToDateTime('1873/01/01');
   FDate             := FBaseDate-1;    FDate             := FBaseDate-1;
   FDateTime         := FDate;    FDateTime         := FDate;
   FCanEmpty         := True;    FCanEmpty         := True;
   FGengo            := True;    FGengo            := True;
   FDisableColor     := clGray;    FDisableColor     := clGray;
   FDisableFontColor := clWhite;    FDisableFontColor := clWhite;
   FDropDownKey      := True;    FDropDownKey      := True;
   FIsEmpty          := True;    FIsEmpty          := True;
   FEnterNext        := True;    FEnterNext        := True;
   FExitCheck        := False;    FExitCheck        := False;
   FDisplayError     := True;    FDisplayError     := True;
   FFocusedColor     := clAqua;    FFocusedColor     := clAqua;
   
   FLabelYear        := FYearLabel.Text;    FLabelYear        := FYearLabel.Text;
   FLabelMonth       := FMonthLabel.Text;    FLabelMonth       := FMonthLabel.Text;
   FLabelDay         := FDayLabel.Text;    FLabelDay         := FDayLabel.Text;
   FLabelHour        := FHourLabel.Text;    FLabelHour        := FHourLabel.Text;
   FLabelMinute      := FMinuteLabel.Text;    FLabelMinute      := FMinuteLabel.Text;
   FLabelSecond      := FSecondLabel.Text;    FLabelSecond      := FSecondLabel.Text;
   
   FDialogCaption  := '日付時刻入力';    FDialogCaption  := '日付時刻入力';
   FTabStop        := True;    FTabStop        := True;
   FYeardigit      := yddigit4;    FYeardigit      := yddigit4;
   FSpaceWidth     := 7;    FSpaceWidth     := 7;
   
   //各コントロールの幅と位置を設定して表示    //各コントロールの幅と位置を設定して表示
   SetControlResizePosition(True);    SetControlResizePosition(True);
 end;  end;
end; end;
   
{$IFDEF CONDITIONALEXPRESSIONS}   
{$IF RTLVersion >= 24.0}   
class constructor TplDateEdit.Create;  
{$IF RTLVersion >= 26.0}   
var  
 I: Integer;  
{$IFEND}   
begin  
 FFormatSettings := TFormatSettings.Create;  
 FFormatSettings.ShortDateFormat := 'YYYY/MM/DD';  
{$IF RTLVersion >= 26.0}   
 MaxEraCount := Length(FormatSettings.EraInfo);  
 SetLength(EraNames, MaxEraCount + 1);  
 SetLength(EraYearOffsets, MaxEraCount + 1);  
 for I := 0 to MaxEraCount - 1 do  
 begin  
   EraNames[I + 1] := FormatSettings.EraInfo[I].EraName;  
   EraYearOffsets[I + 1] := FormatSettings.EraInfo[I].EraOffset;  
 end;  
{$IFEND}   
end;  
{$IFEND}   
{$ENDIF}   
   
//============================================================================= //=============================================================================
//  選択用コンボボックスの生成と初期化 //  選択用コンボボックスの生成と初期化
//============================================================================= //=============================================================================
procedure TplDateEdit.CreateComboBox(ACombo: TComboBox); procedure TplDateEdit.CreateComboBox(ACombo: TComboBox);
var var
 i : Integer;  i : Integer;
begin begin
 with ACombo do begin  with ACombo do begin
   Parent      := Self;    Parent      := Self;
   ParentFont  := False;    ParentFont  := False;
   Left        := 0;    Left        := 0;
   Style       := csOwnerDrawFixed;    Style       := csOwnerDrawFixed;
   ImeMode     := imDisable;    ImeMode     := imDisable;
   OnEnter     := EditEnter;    OnEnter     := EditEnter;
   OnExit      := EditExit;    OnExit      := EditExit;
   OnKeyPress  := EditKeyPress;    OnKeyPress  := EditKeyPress;
   OnKeyDown   := EditKeyDown;    OnKeyDown   := EditKeyDown;
   OnDropDown  := GengoDropDown;    OnDropDown  := GengoDropDown;
   OnDrawItem  := GengoDrawItem;    OnDrawItem  := GengoDrawItem;
   OnChange    := EditChange;    OnChange    := EditChange;
   OnClick     := EditClick;    OnClick     := EditClick;
   
   Items.Clear;    Items.Clear;
   if ACombo = FGengoCombo then begin    if ACombo = FGengoCombo then begin
     //元号選択Itemの作成      //元号選択Itemの作成
     Items.Add('西暦');      Items.Add('西暦');
     for i := 1 to MaxEraCount do begin      for i := 1 to MaxEraCount do begin
       if EraNames[i]='' then break;        if EraNames[i]='' then break;
       Items.Add(EraNames[i]);        Items.Add(EraNames[i]);
     end;      end;
   end else begin    end else begin
     //午前午後選択Itemの作成      //午前午後選択Itemの作成
     //この'午前','午後'の名前は例えばAM,PMにしてもよい      //この'午前','午後'の名前は例えばAM,PMにしてもよい
     //ただしItemIndex=0は午前,ItemIndex=1は午後として処理する      //ただしItemIndex=0は午前,ItemIndex=1は午後として処理する
     Items.Add('午前');      Items.Add('午前');
     Items.Add('午後');      Items.Add('午後');
   end;    end;
   DefHeightItemHeightCombo := Height - ItemHeight;    DefHeightItemHeightCombo := Height - ItemHeight;
 end;  end;
end; end;
   
//============================================================================= //=============================================================================
//  入力欄のコントロールの生成と初期化 //  入力欄のコントロールの生成と初期化
//  TEditではなくTMemo(クラス名をtplDateEditEdidに変更)を1行のエデットボックス //  TEditではなくTMemo(クラス名をtplDateEditEdidに変更)を1行のエデットボックス
//  として利用 //  として利用
//  (右寄せと入力文字数の設定が簡単なので) //  (右寄せと入力文字数の設定が簡単なので)
//============================================================================= //=============================================================================
procedure TplDateEdit.CreateEditBox(AMemo: TplDateEditEdit); procedure TplDateEdit.CreateEditBox(AMemo: TplDateEditEdit);
begin begin
 with AMemo do begin  with AMemo do begin
   Parent      := Self;    Parent      := Self;
   ParentFont  := False;    ParentFont  := False;
   WantReturns := False;    WantReturns := False;
   WantTabs    := False;    WantTabs    := False;
   WordWrap    := False;    WordWrap    := False;
   Alignment   := taRightJustify;    Alignment   := taRightJustify;
   ImeMode     := imDisable;    ImeMode     := imDisable;
   Color       := FColor;    Color       := FColor;
   OnEnter     := EditEnter;    OnEnter     := EditEnter;
   OnExit      := EditExit;    OnExit      := EditExit;
   OnKeyPress  := EditKeyPress;    OnKeyPress  := EditKeyPress;
   OnKeyDown   := EditKeyDown;    OnKeyDown   := EditKeyDown;
   OnChange    := EditChange;    OnChange    := EditChange;
   OnClick     := EditClick;    OnClick     := EditClick;
   MaxLength   := 2;    MaxLength   := 2;
 end;  end;
end; end;
   
//============================================================================= //=============================================================================
//  入力欄の右側の[年][月][日][時][分][秒]のラベル用のラベルコントロール //  入力欄の右側の[年][月][日][時][分][秒]のラベル用のラベルコントロール
//  当初はTPanelで作成したが,XPテーマだと下端が白線になってしまうの //  当初はTPanelで作成したが,XPテーマだと下端が白線になってしまうの
//  で急きょTCustomControlから作成に変更(Ver1.1) //  で急きょTCustomControlから作成に変更(Ver1.1)
//============================================================================= //=============================================================================
procedure TplDateEdit.CreateLabel(ALabel: TplDateEditLabel; AText:String ); procedure TplDateEdit.CreateLabel(ALabel: TplDateEditLabel; AText:String );
begin begin
 with ALabel do begin  with ALabel do begin
   Parent       := Self;    Parent       := Self;
   ParentFont   := False;    ParentFont   := False;
   ParentColor  := False;    ParentColor  := False;
   Color        := $00E4E4E4;    Color        := $00E4E4E4;
   Text         := AText;    Text         := AText;
   Font.Size    := Canvas.Font.Size;    Font.Size    := Canvas.Font.Size;
   TabStop      := False;    TabStop      := False;
   ControlStyle := ALabel.ControlStyle - [csAcceptsControls];    ControlStyle := ALabel.ControlStyle - [csAcceptsControls];
   FplDate      := Self;    FplDate      := Self;
 end;  end;
end; end;
   
//============================================================================= //=============================================================================
//  表示コントロールの設定 //  表示コントロールの設定
//  EditStyleプロパティ用 //  EditStyleプロパティ用
//  現在の値はリセットする //  現在の値はリセットする
//============================================================================= //=============================================================================
procedure TplDateEdit.SetEditStyle(const Value: TplDateEditStyle); procedure TplDateEdit.SetEditStyle(const Value: TplDateEditStyle);
begin begin
 if FEditStyle <> Value then begin  if FEditStyle <> Value then begin
   FEditStyle := Value;    FEditStyle := Value;
   if (csReading in ComponentState) then exit;    if (csReading in ComponentState) then exit;
   SetControlResizePosition(True);    SetControlResizePosition(True);
 end;  end;
end; end;
   
//============================================================================= //=============================================================================
//  元号入力コンボボックスの表示非非表示の設定 //  元号入力コンボボックスの表示非非表示の設定
//  EditGengo(Boolean)プロパティ用 //  EditGengo(Boolean)プロパティ用
//  非表示の時は西暦入力と解釈し,和暦表示を不可にする //  非表示の時は西暦入力と解釈し,和暦表示を不可にする
//============================================================================= //=============================================================================
procedure TplDateEdit.SetEditGengo(const Value: Boolean); procedure TplDateEdit.SetEditGengo(const Value: Boolean);
begin begin
 if FEditGengo <> Value then begin  if FEditGengo <> Value then begin
   if Value = False then begin    if Value = False then begin
     FEditGengo := False;      FEditGengo := False;
     FGengo     := False;      FGengo     := False;
   end else begin    end else begin
     FEditGengo := True;      FEditGengo := True;
   end;    end;
   //TplDateEditのVer2.10で修正    //TplDateEditのVer2.10で修正
   SetControlResizePosition(False);    SetControlResizePosition(False);
   if (csReading in ComponentState) then exit;    if (csReading in ComponentState) then exit;
   GetProperties;    GetProperties;
 end;  end;
end; end;
   
//============================================================================= //=============================================================================
//  午前午後選択力コンボボックスの表示非非表示の設定 //  午前午後選択力コンボボックスの表示非非表示の設定
//  EditAmpm(Boolean)プロパティ用 //  EditAmpm(Boolean)プロパティ用
//  非表示の時は24時間表示と解釈する //  非表示の時は24時間表示と解釈する
//============================================================================= //=============================================================================
procedure TplDateEdit.SetEditAmpm(const Value: Boolean); procedure TplDateEdit.SetEditAmpm(const Value: Boolean);
begin begin
 if FEditAmpm <> Value then begin  if FEditAmpm <> Value then begin
   if Value = False then begin    if Value = False then begin
     FEditAmpm := False;      FEditAmpm := False;
   end else begin    end else begin
     FEditAmpm := True;      FEditAmpm := True;
   end;    end;
   //TplDateEditのVer2.10で修正    //TplDateEditのVer2.10で修正
   SetControlResizePosition(False);    SetControlResizePosition(False);
   if (csReading in ComponentState) then exit;    if (csReading in ComponentState) then exit;
   GetProperties;    GetProperties;
 end;  end;
end; end;
   
//============================================================================= //=============================================================================
//  年,月,日,時,分,秒のラベル(各入力欄の右側のラベル)の変更 //  年,月,日,時,分,秒のラベル(各入力欄の右側のラベル)の変更
//============================================================================= //=============================================================================
procedure TplDateEdit.SetLabelCaption(const Index: Integer; const Value: String); procedure TplDateEdit.SetLabelCaption(const Index: Integer; const Value: String);
begin begin
 case Index of  case Index of
   1:    1:
   begin    begin
     FYearLabel.Text := Value;      FYearLabel.Text := Value;
     FLabelYear      := Value;      FLabelYear      := Value;
   end;    end;
   2:    2:
   begin    begin
     FMonthLabel.Text := Value;      FMonthLabel.Text := Value;
     FLabelMonth      := Value;      FLabelMonth      := Value;
   end;    end;
   3:    3:
   begin    begin
     FDayLabel.Text := Value;      FDayLabel.Text := Value;
     FLabelDay      := Value;      FLabelDay      := Value;
   end;    end;
   4:    4:
   begin    begin
     FHourLabel.Text := Value;      FHourLabel.Text := Value;
     FLabelHour      := Value      FLabelHour      := Value
   end;    end;
   5:    5:
   begin    begin
     FMinuteLabel.Text := Value;      FMinuteLabel.Text := Value;
     FLabelMinute      := Value;      FLabelMinute      := Value;
   end;    end;
   6:    6:
   begin    begin
     FSecondLabel.Text := Value;      FSecondLabel.Text := Value;
     FLabelSecond      := Value;      FLabelSecond      := Value;
   end;    end;
 end;  end;
 SetControlResizePosition(False);  SetControlResizePosition(False);
end; end;
   
//============================================================================= //=============================================================================
//  日付と時刻入力コントロールのスペース幅 SpaceWidth //  日付と時刻入力コントロールのスペース幅 SpaceWidth
//  この値を負にすると時刻関係のコントロールは下に配置 //  この値を負にすると時刻関係のコントロールは下に配置
//============================================================================= //=============================================================================
procedure TplDateEdit.SetSpaceWidth(const Value: Integer); procedure TplDateEdit.SetSpaceWidth(const Value: Integer);
begin begin
 if FSpaceWidth <> Value then begin  if FSpaceWidth <> Value then begin
   FSpaceWidth := Value;    FSpaceWidth := Value;
   SetControlResizePosition(False);    SetControlResizePosition(False);
 end;  end;
end; end;
   
//============================================================================= //=============================================================================
//  西暦の表示桁数の設定 //  西暦の表示桁数の設定
//  yddigit2 2桁 //  yddigit2 2桁
//  yddigit4 4桁 //  yddigit4 4桁
//============================================================================= //=============================================================================
procedure TplDateEdit.SetYeardigit(const Value: TplYeardigitSet); procedure TplDateEdit.SetYeardigit(const Value: TplYeardigitSet);
begin begin
 if FYeardigit <> Value then begin  if FYeardigit <> Value then begin
   FYeardigit := Value;    FYeardigit := Value;
   SetControlResizePosition(False);    SetControlResizePosition(False);
   GetProperties;    GetProperties;
 end;  end;
end; end;
   
//============================================================================= //=============================================================================
//  表示するコントロール(元号選択,年月日,時刻に応じた)表示と位置の設定は全て //  表示するコントロール(元号選択,年月日,時刻に応じた)表示と位置の設定は全て
//  このメソッドで行うようにしてある.表示しないコントロールの幅は0で非表示 //  このメソッドで行うようにしてある.表示しないコントロールの幅は0で非表示
//============================================================================= //=============================================================================
procedure TplDateEdit.SetControlResizePosition(EmptyFlag:Boolean=True); procedure TplDateEdit.SetControlResizePosition(EmptyFlag:Boolean=True);
var var
 ALeft            : Integer;  ALeft            : Integer;
 AHeight          : Integer;  AHeight          : Integer;
 ATop             : Integer;  ATop             : Integer;
 WidthA           : Integer;  WidthA           : Integer;
 WidthB           : Integer;  WidthB           : Integer;
 SysMetrics       : TTextMetric;  SysMetrics       : TTextMetric;
 Metrics          : TTextMetric;  Metrics          : TTextMetric;
 I                : Integer;  I                : Integer;
 LeftPosMargin    : Integer;  LeftPosMargin    : Integer;
 ComboLeftMargein : Integer;  ComboLeftMargein : Integer;
begin begin
 if FGengoCombo=nil then exit;  if FGengoCombo=nil then exit;
   
 if CheckWin32Version(6, 0) then begin  if CheckWin32Version(6, 0) then begin
   LeftPosMargin := 0;    LeftPosMargin := 0;
 end else begin  end else begin
   LeftPosMargin := 3;    LeftPosMargin := 3;
 end;  end;
   
 fgResize := True;  fgResize := True;
   
 Canvas.Font.Assign(Font);  Canvas.Font.Assign(Font);
 GetTextMetrics(Canvas.Handle,Metrics);  GetTextMetrics(Canvas.Handle,Metrics);
 I := GetSystemMetrics(SM_CYBORDER) * 8;  I := GetSystemMetrics(SM_CYBORDER) * 8;
   
 //このコンポの高さ(SpaceWidht<0の時は変化する)  //このコンポの高さ(SpaceWidht<0の時は変化する)
 SingleHeight := Metrics.tmHeight + I;  SingleHeight := Metrics.tmHeight + I;
 Height       := SingleHeight;  Height       := SingleHeight;
   
 //一旦入力欄を全て空にする.この後入力コントロールの表示非表示に応じて  //一旦入力欄を全て空にする.この後入力コントロールの表示非表示に応じて
 //初期値をセットする  //初期値をセットする
 if EmptyFlag then SetEditEmpty;  if EmptyFlag then SetEditEmpty;
   
 {$IF CompilerVersion > 14.99}   {$IF CompilerVersion > 14.99}
 if ThemeServices.ThemesEnabled then begin  if ThemeServices.ThemesEnabled then begin
   ComboLeftMargein := 0;    ComboLeftMargein := 0;
 end else begin  end else begin
   ComboLeftMargein := 3;    ComboLeftMargein := 3;
 end;  end;
 {$ELSE}   {$ELSE}
 ComboLeftMargein := 3;  ComboLeftMargein := 3;
 {$IFEND}   {$IFEND}
   
 //少々冗長であるがスタイルごとに設定  //少々冗長であるがスタイルごとに設定
 ALeft := 0;  ALeft := 0;
 ATop  := 0;  ATop  := 0;
 case FEditStyle of  case FEditStyle of
   
   //年月日時分秒    //年月日時分秒
   desYearMonthDayHMS:    desYearMonthDayHMS:
   begin    begin
     if FSpaceWidth < 0 then begin      if FSpaceWidth < 0 then begin
       ATop   := SingleHeight - FSpaceWidth;        ATop   := SingleHeight - FSpaceWidth;
       Height := SingleHeight * 2 - FSpaceWidth;        Height := SingleHeight * 2 - FSpaceWidth;
     end;      end;
     ControlShowHide (FGengoCombo,  0, SingleHeight, FEditGengo);      ControlShowHide (FGengoCombo,  0, SingleHeight, FEditGengo);
     if FEditGengo then ALeft := FGengoCombo.Width - ComboLeftMargein;      if FEditGengo then ALeft := FGengoCombo.Width - ComboLeftMargein;
   
     ControlShowHide (FYearEdit,    0,    SingleHeight, True);      ControlShowHide (FYearEdit,    0,    SingleHeight, True);
     ControlShowHide (FMonthEdit,   0,    SingleHeight, True);      ControlShowHide (FMonthEdit,   0,    SingleHeight, True);
     ControlShowHide (FDayEdit,     0,    SingleHeight, True);      ControlShowHide (FDayEdit,     0,    SingleHeight, True);
     ControlShowHide (FYearLabel,   0,    SingleHeight, True);      ControlShowHide (FYearLabel,   0,    SingleHeight, True);
     ControlShowHide (FMonthLabel,  0,    SingleHeight, True);      ControlShowHide (FMonthLabel,  0,    SingleHeight, True);
     ControlShowHide (FDayLabel,    0,    SingleHeight, True);      ControlShowHide (FDayLabel,    0,    SingleHeight, True);
     ControlShowHide (FHourEdit,    ATop, SingleHeight, True);      ControlShowHide (FHourEdit,    ATop, SingleHeight, True);
     ControlShowHide (FMinuteEdit,  ATop, SingleHeight, True);      ControlShowHide (FMinuteEdit,  ATop, SingleHeight, True);
     ControlShowHide (FSecondEdit,  ATop, SingleHeight, True);      ControlShowHide (FSecondEdit,  ATop, SingleHeight, True);
     ControlShowHide (FHourLabel,   ATop, SingleHeight, True);      ControlShowHide (FHourLabel,   ATop, SingleHeight, True);
     ControlShowHide (FMinuteLabel, ATop, SingleHeight, True);      ControlShowHide (FMinuteLabel, ATop, SingleHeight, True);
     ControlShowHide (FSecondLabel, ATop, SingleHeight, True);      ControlShowHide (FSecondLabel, ATop, SingleHeight, True);
   
     FYearEdit.Left   := ALeft;      FYearEdit.Left   := ALeft;
     FYearLabel.Left  := FYearEdit.Left   + FYearEdit.Width;      FYearLabel.Left  := FYearEdit.Left   + FYearEdit.Width;
     FMonthEdit.Left  := FYearLabel.Left  + FYearLabel.Width - LeftPosMargin;      FMonthEdit.Left  := FYearLabel.Left  + FYearLabel.Width - LeftPosMargin;
     FMonthLabel.Left := FMonthEdit.Left  + FMonthEdit.Width;      FMonthLabel.Left := FMonthEdit.Left  + FMonthEdit.Width;
     FDayEdit.Left    := FMonthLabel.Left + FMonthLabel.Width - LeftPosMargin;      FDayEdit.Left    := FMonthLabel.Left + FMonthLabel.Width - LeftPosMargin;
     FDayLabel.Left   := FDayEdit.Left    + FDayEdit.Width;      FDayLabel.Left   := FDayEdit.Left    + FDayEdit.Width;
     WidthA           := FDayLabel.Left   + FDayLabel.Width;      WidthA           := FDayLabel.Left   + FDayLabel.Width;
   
     ControlShowHide (FAmpmCombo, ATop, SingleHeight, FEditAmpm);      ControlShowHide (FAmpmCombo, ATop, SingleHeight, FEditAmpm);
     if FSpaceWidth >= 0 then ALeft := WidthA+SpaceWidth else ALeft := 0;      if FSpaceWidth >= 0 then ALeft := WidthA+SpaceWidth else ALeft := 0;
     if FEditAmpm then begin      if FEditAmpm then begin
       FAmpmCombo.Left := ALeft;        FAmpmCombo.Left := ALeft;
       ALeft := FAmpmCombo.Left + FAmpmCombo.Width - ComboLeftMargein;        ALeft := FAmpmCombo.Left + FAmpmCombo.Width - ComboLeftMargein;
     end;      end;
     FHourEdit.Left    := ALeft;      FHourEdit.Left    := ALeft;
     FHourLabel.Left   := FHourEdit.Left    + FHourEdit.Width;      FHourLabel.Left   := FHourEdit.Left    + FHourEdit.Width;
     FMinuteEdit.Left  := FHourLabel.Left   + FHourLabel.Width - LeftPosMargin;      FMinuteEdit.Left  := FHourLabel.Left   + FHourLabel.Width - LeftPosMargin;
     FMinuteLabel.Left := FMinuteEdit.Left  + FMinuteEdit.Width;      FMinuteLabel.Left := FMinuteEdit.Left  + FMinuteEdit.Width;
     FSecondEdit.Left  := FMinuteLabel.Left + FMinuteLabel.Width - LeftPosMargin;      FSecondEdit.Left  := FMinuteLabel.Left + FMinuteLabel.Width - LeftPosMargin;
     FSecondLabel.Left := FSecondEdit.Left  + FSecondEdit.Width;      FSecondLabel.Left := FSecondEdit.Left  + FSecondEdit.Width;
     WidthB            := FSecondLabel.Left + FSecondLabel.Width;      WidthB            := FSecondLabel.Left + FSecondLabel.Width;
   
     if WidthA > WidthB then Width  := WidthA else Width := WidthB;      if WidthA > WidthB then Width  := WidthA else Width := WidthB;
     if FSpaceWidth < 0 then Height := SingleHeight * 2 - FSpaceWidth;      if FSpaceWidth < 0 then Height := SingleHeight * 2 - FSpaceWidth;
   end;    end;
   
   //年月日時分    //年月日時分
   desYearMonthDayHM:    desYearMonthDayHM:
   begin    begin
     if FSpaceWidth < 0 then begin      if FSpaceWidth < 0 then begin
       ATop   := SingleHeight - FSpaceWidth;        ATop   := SingleHeight - FSpaceWidth;
       Height := SingleHeight * 2 - FSpaceWidth;        Height := SingleHeight * 2 - FSpaceWidth;
     end;      end;
     ControlShowHide (FGengoCombo, 0, SingleHeight, FEditGengo);      ControlShowHide (FGengoCombo, 0, SingleHeight, FEditGengo);
     if FEditGengo then ALeft := FGengoCombo.Width - ComboLeftMargein;      if FEditGengo then ALeft := FGengoCombo.Width - ComboLeftMargein;
   
     ControlShowHide (FYearEdit,    0,    SingleHeight, True);      ControlShowHide (FYearEdit,    0,    SingleHeight, True);
     ControlShowHide (FMonthEdit,   0,    SingleHeight, True);      ControlShowHide (FMonthEdit,   0,    SingleHeight, True);
     ControlShowHide (FDayEdit,     0,    SingleHeight, True);      ControlShowHide (FDayEdit,     0,    SingleHeight, True);
     ControlShowHide (FYearLabel,   0,    SingleHeight, True);      ControlShowHide (FYearLabel,   0,    SingleHeight, True);
     ControlShowHide (FMonthLabel,  0,    SingleHeight, True);      ControlShowHide (FMonthLabel,  0,    SingleHeight, True);
     ControlShowHide (FDayLabel,    0,    SingleHeight, True);      ControlShowHide (FDayLabel,    0,    SingleHeight, True);
     ControlShowHide (FHourEdit,    ATop, SingleHeight, True);      ControlShowHide (FHourEdit,    ATop, SingleHeight, True);
     ControlShowHide (FMinuteEdit,  ATop, SingleHeight, True);      ControlShowHide (FMinuteEdit,  ATop, SingleHeight, True);
     ControlShowHide (FSecondEdit,  ATop, SingleHeight, False);      ControlShowHide (FSecondEdit,  ATop, SingleHeight, False);
     ControlShowHide (FHourLabel,   ATop, SingleHeight, True);      ControlShowHide (FHourLabel,   ATop, SingleHeight, True);
     ControlShowHide (FMinuteLabel, ATop, SingleHeight, True);      ControlShowHide (FMinuteLabel, ATop, SingleHeight, True);
     ControlShowHide (FSecondLabel, ATop, SingleHeight, False);      ControlShowHide (FSecondLabel, ATop, SingleHeight, False);
   
     FYearEdit.Left   := ALeft;      FYearEdit.Left   := ALeft;
     FYearLabel.Left  := FYearEdit.Left   + FYearEdit.Width;      FYearLabel.Left  := FYearEdit.Left   + FYearEdit.Width;
     FMonthEdit.Left  := FYearLabel.Left  + FYearLabel.Width - LeftPosMargin;      FMonthEdit.Left  := FYearLabel.Left  + FYearLabel.Width - LeftPosMargin;
     FMonthLabel.Left := FMonthEdit.Left  + FMonthEdit.Width;      FMonthLabel.Left := FMonthEdit.Left  + FMonthEdit.Width;
     FDayEdit.Left    := FMonthLabel.Left + FMonthLabel.Width - LeftPosMargin;      FDayEdit.Left    := FMonthLabel.Left + FMonthLabel.Width - LeftPosMargin;
     FDayLabel.Left   := FDayEdit.Left    + FDayEdit.Width;      FDayLabel.Left   := FDayEdit.Left    + FDayEdit.Width;
     WidthA           := FDayLabel.Left   + FDayLabel.Width;      WidthA           := FDayLabel.Left   + FDayLabel.Width;
   
     ControlShowHide (FAmpmCombo, ATop, SingleHeight, FEditAmpm);      ControlShowHide (FAmpmCombo, ATop, SingleHeight, FEditAmpm);
     if FSpaceWidth >= 0 then ALeft := WidthA + FSpaceWidth else ALeft := 0;      if FSpaceWidth >= 0 then ALeft := WidthA + FSpaceWidth else ALeft := 0;
     if FEditAmpm then begin      if FEditAmpm then begin
       FAmpmCombo.Left := ALeft;        FAmpmCombo.Left := ALeft;
       ALeft := FAmpmCombo.Left + FAmpmCombo.Width - ComboLeftMargein;        ALeft := FAmpmCombo.Left + FAmpmCombo.Width - ComboLeftMargein;
     end;      end;
     FHourEdit.Left    := ALeft;      FHourEdit.Left    := ALeft;
     FHourLabel.Left   := FHourEdit.Left    + FHourEdit.Width;      FHourLabel.Left   := FHourEdit.Left    + FHourEdit.Width;
     FMinuteEdit.Left  := FHourLabel.Left   + FHourLabel.Width - LeftPosMargin;      FMinuteEdit.Left  := FHourLabel.Left   + FHourLabel.Width - LeftPosMargin;
     FMinuteLabel.Left := FMinuteEdit.Left  + FMinuteEdit.Width;      FMinuteLabel.Left := FMinuteEdit.Left  + FMinuteEdit.Width;
     WidthB            := FMinuteLabel.Left + FMinuteLabel.Width;      WidthB            := FMinuteLabel.Left + FMinuteLabel.Width;
   
     if WidthA > WidthB then Width  := WidthA else Width := WidthB;      if WidthA > WidthB then Width  := WidthA else Width := WidthB;
     if FSpaceWidth < 0 then Height := SingleHeight * 2 - FSpaceWidth;      if FSpaceWidth < 0 then Height := SingleHeight * 2 - FSpaceWidth;
   end;    end;
   
   //年月日時    //年月日時
   desYearMonthDayH:    desYearMonthDayH:
   begin    begin
     if FSpaceWidth < 0 then begin      if FSpaceWidth < 0 then begin
       ATop   := SingleHeight-FSpaceWidth;        ATop   := SingleHeight-FSpaceWidth;
       Height := SingleHeight*2-FSpaceWidth;        Height := SingleHeight*2-FSpaceWidth;
     end;      end;
     ControlShowHide (FGengoCombo, 0, SingleHeight, FEditGengo);      ControlShowHide (FGengoCombo, 0, SingleHeight, FEditGengo);
     if FEditGengo then ALeft := FGengoCombo.Width - ComboLeftMargein;      if FEditGengo then ALeft := FGengoCombo.Width - ComboLeftMargein;
   
     ControlShowHide (FYearEdit,    0,    SingleHeight, True);      ControlShowHide (FYearEdit,    0,    SingleHeight, True);
     ControlShowHide (FMonthEdit,   0,    SingleHeight, True);      ControlShowHide (FMonthEdit,   0,    SingleHeight, True);
     ControlShowHide (FDayEdit,     0,    SingleHeight, True);      ControlShowHide (FDayEdit,     0,    SingleHeight, True);
     ControlShowHide (FYearLabel,   0,    SingleHeight, True);      ControlShowHide (FYearLabel,   0,    SingleHeight, True);
     ControlShowHide (FMonthLabel,  0,    SingleHeight, True);      ControlShowHide (FMonthLabel,  0,    SingleHeight, True);
     ControlShowHide (FDayLabel,    0,    SingleHeight, True);      ControlShowHide (FDayLabel,    0,    SingleHeight, True);
     ControlShowHide (FHourEdit,    ATop, SingleHeight, True);      ControlShowHide (FHourEdit,    ATop, SingleHeight, True);
     ControlShowHide (FMinuteEdit,  ATop, SingleHeight, False);      ControlShowHide (FMinuteEdit,  ATop, SingleHeight, False);
     ControlShowHide (FSecondEdit,  ATop, SingleHeight, False);      ControlShowHide (FSecondEdit,  ATop, SingleHeight, False);
     ControlShowHide (FHourLabel,   ATop, SingleHeight, True);      ControlShowHide (FHourLabel,   ATop, SingleHeight, True);
     ControlShowHide (FMinuteLabel, ATop, SingleHeight, False);      ControlShowHide (FMinuteLabel, ATop, SingleHeight, False);
     ControlShowHide (FSecondLabel, ATop, SingleHeight, False);      ControlShowHide (FSecondLabel, ATop, SingleHeight, False);
   
     FYearEdit.Left   := ALeft;      FYearEdit.Left   := ALeft;
     FYearLabel.Left  := FYearEdit.Left   + FYearEdit.Width;      FYearLabel.Left  := FYearEdit.Left   + FYearEdit.Width;
     FMonthEdit.Left  := FYearLabel.Left  + FYearLabel.Width - LeftPosMargin;      FMonthEdit.Left  := FYearLabel.Left  + FYearLabel.Width - LeftPosMargin;
     FMonthLabel.Left := FMonthEdit.Left  + FMonthEdit.Width;      FMonthLabel.Left := FMonthEdit.Left  + FMonthEdit.Width;
     FDayEdit.Left    := FMonthLabel.Left + FMonthLabel.Width - LeftPosMargin;      FDayEdit.Left    := FMonthLabel.Left + FMonthLabel.Width - LeftPosMargin;
     FDayLabel.Left   := FDayEdit.Left+FDayEdit.Width;      FDayLabel.Left   := FDayEdit.Left+FDayEdit.Width;
     WidthA           := FDayLabel.Left+FDayLabel.Width;      WidthA           := FDayLabel.Left+FDayLabel.Width;
   
     ControlShowHide (FAmpmCombo,ATop, SingleHeight, FEditAmpm);      ControlShowHide (FAmpmCombo,ATop, SingleHeight, FEditAmpm);
     if FSpaceWidth >= 0 then ALeft := WidthA+FSpaceWidth else ALeft := 0;      if FSpaceWidth >= 0 then ALeft := WidthA+FSpaceWidth else ALeft := 0;
     if FEditAmpm then begin      if FEditAmpm then begin
       FAmpmCombo.Left := ALeft;        FAmpmCombo.Left := ALeft;
       ALeft := FAmpmCombo.Left + FAmpmCombo.Width - ComboLeftMargein;        ALeft := FAmpmCombo.Left + FAmpmCombo.Width - ComboLeftMargein;
     end;      end;
     FHourEdit.Left    := ALeft;      FHourEdit.Left    := ALeft;
     FHourLabel.Left   := FHourEdit.Left+FHourEdit.Width;;      FHourLabel.Left   := FHourEdit.Left+FHourEdit.Width;;
     WidthB            := FHourLabel.Left+FHourLabel.Width;      WidthB            := FHourLabel.Left+FHourLabel.Width;
   
     if WidthA > WidthB then Width  := WidthA else Width := WidthB;      if WidthA > WidthB then Width  := WidthA else Width := WidthB;
     if FSpaceWidth < 0 then Height := SingleHeight * 2 - FSpaceWidth;      if FSpaceWidth < 0 then Height := SingleHeight * 2 - FSpaceWidth;
   end;    end;
   
   //年月日    //年月日
   desYearMonthDay:    desYearMonthDay:
   begin    begin
     ControlShowHide (FGengoCombo, 0, SingleHeight, FEditGengo);      ControlShowHide (FGengoCombo, 0, SingleHeight, FEditGengo);
     if FEditGengo then ALeft := FGengoCombo.Width - ComboLeftMargein;      if FEditGengo then ALeft := FGengoCombo.Width - ComboLeftMargein;
   
     ControlShowHide (FAmpmCombo,   0,    SingleHeight, False);      ControlShowHide (FAmpmCombo,   0,    SingleHeight, False);
     ControlShowHide (FYearEdit,    0,    SingleHeight, True);      ControlShowHide (FYearEdit,    0,    SingleHeight, True);
     ControlShowHide (FMonthEdit,   0,    SingleHeight, True);      ControlShowHide (FMonthEdit,   0,    SingleHeight, True);
     ControlShowHide (FDayEdit,     0,    SingleHeight, True);      ControlShowHide (FDayEdit,     0,    SingleHeight, True);
     ControlShowHide (FYearLabel,   0,    SingleHeight, True);      ControlShowHide (FYearLabel,   0,    SingleHeight, True);
     ControlShowHide (FMonthLabel,  0,    SingleHeight, True);      ControlShowHide (FMonthLabel,  0,    SingleHeight, True);
     ControlShowHide (FDayLabel,    0,    SingleHeight, True);      ControlShowHide (FDayLabel,    0,    SingleHeight, True);
     ControlShowHide (FHourEdit,    ATop, SingleHeight, False);      ControlShowHide (FHourEdit,    ATop, SingleHeight, False);
     ControlShowHide (FMinuteEdit,  ATop, SingleHeight, False);      ControlShowHide (FMinuteEdit,  ATop, SingleHeight, False);
     ControlShowHide (FSecondEdit,  ATop, SingleHeight, False);      ControlShowHide (FSecondEdit,  ATop, SingleHeight, False);
     ControlShowHide (FHourLabel,   ATop, SingleHeight, False);      ControlShowHide (FHourLabel,   ATop, SingleHeight, False);
     ControlShowHide (FMinuteLabel, ATop, SingleHeight, False);      ControlShowHide (FMinuteLabel, ATop, SingleHeight, False);
     ControlShowHide (FSecondLabel, ATop, SingleHeight, False);      ControlShowHide (FSecondLabel, ATop, SingleHeight, False);
   
     FYearEdit.Left   := ALeft;      FYearEdit.Left   := ALeft;
     FYearLabel.Left  := FYearEdit.Left   + FYearEdit.Width;//2;      FYearLabel.Left  := FYearEdit.Left   + FYearEdit.Width;//2;
     FMonthEdit.Left  := FYearLabel.Left  + FYearLabel.Width - LeftPosMargin;      FMonthEdit.Left  := FYearLabel.Left  + FYearLabel.Width - LeftPosMargin;
     FMonthLabel.Left := FMonthEdit.Left  + FMonthEdit.Width;//2;      FMonthLabel.Left := FMonthEdit.Left  + FMonthEdit.Width;//2;
     FDayEdit.Left    := FMonthLabel.Left + FMonthLabel.Width - LeftPosMargin;      FDayEdit.Left    := FMonthLabel.Left + FMonthLabel.Width - LeftPosMargin;
     FDayLabel.Left   := FDayEdit.Left    + FDayEdit.Width;//2;      FDayLabel.Left   := FDayEdit.Left    + FDayEdit.Width;//2;
     Width            := FDayLabel.Left   + FDayLabel.Width;      Width            := FDayLabel.Left   + FDayLabel.Width;
   end;    end;
   
   //年月    //年月
   desYearMonth:    desYearMonth:
   begin    begin
     FDayEdit.Text := '1';      FDayEdit.Text := '1';
     ControlShowHide (FGengoCombo, 0, SingleHeight, FEditGengo);      ControlShowHide (FGengoCombo, 0, SingleHeight, FEditGengo);
     if FEditGengo then ALeft := FGengoCombo.Width - ComboLeftMargein;      if FEditGengo then ALeft := FGengoCombo.Width - ComboLeftMargein;
   
     ControlShowHide (FAmpmCombo,   0,    SingleHeight, False);      ControlShowHide (FAmpmCombo,   0,    SingleHeight, False);
     ControlShowHide (FYearEdit,    0,    SingleHeight, True);      ControlShowHide (FYearEdit,    0,    SingleHeight, True);
     ControlShowHide (FMonthEdit,   0,    SingleHeight, True);      ControlShowHide (FMonthEdit,   0,    SingleHeight, True);
     ControlShowHide (FDayEdit,     0,    SingleHeight, False);      ControlShowHide (FDayEdit,     0,    SingleHeight, False);
     ControlShowHide (FYearLabel,   0,    SingleHeight, True);      ControlShowHide (FYearLabel,   0,    SingleHeight, True);
     ControlShowHide (FMonthLabel,  0,    SingleHeight, True);      ControlShowHide (FMonthLabel,  0,    SingleHeight, True);
     ControlShowHide (FDayLabel,    0,    SingleHeight, False);      ControlShowHide (FDayLabel,    0,    SingleHeight, False);
     ControlShowHide (FHourEdit,    ATop, SingleHeight, False);      ControlShowHide (FHourEdit,    ATop, SingleHeight, False);
     ControlShowHide (FMinuteEdit,  ATop, SingleHeight, False);      ControlShowHide (FMinuteEdit,  ATop, SingleHeight, False);
     ControlShowHide (FSecondEdit,  ATop, SingleHeight, False);      ControlShowHide (FSecondEdit,  ATop, SingleHeight, False);
     ControlShowHide (FHourLabel,   ATop, SingleHeight, False);      ControlShowHide (FHourLabel,   ATop, SingleHeight, False);
     ControlShowHide (FMinuteLabel, ATop, SingleHeight, False);      ControlShowHide (FMinuteLabel, ATop, SingleHeight, False);
     ControlShowHide (FSecondLabel, ATop, SingleHeight, False);      ControlShowHide (FSecondLabel, ATop, SingleHeight, False);
   
     FYearEdit.Left   := ALeft;      FYearEdit.Left   := ALeft;
     FYearLabel.Left  := FYearEdit.Left   + FYearEdit.Width - 2;      FYearLabel.Left  := FYearEdit.Left   + FYearEdit.Width - 2;
     FMonthEdit.Left  := FYearLabel.Left  + FYearLabel.Width - LeftPosMargin;      FMonthEdit.Left  := FYearLabel.Left  + FYearLabel.Width - LeftPosMargin;
     FMonthLabel.Left := FMonthEdit.Left  + FMonthEdit.Width - 2;      FMonthLabel.Left := FMonthEdit.Left  + FMonthEdit.Width - 2;
     Width            := FMonthLabel.Left + FMonthLabel.Width;      Width            := FMonthLabel.Left + FMonthLabel.Width;
   end;    end;
   
   //年    //年
   desYear:    desYear:
   begin    begin
     FMonthEdit.Text := '1';      FMonthEdit.Text := '1';
     FDayEdit.Text   := '1';      FDayEdit.Text   := '1';
     ControlShowHide (FGengoCombo, 0, SingleHeight, FEditGengo);      ControlShowHide (FGengoCombo, 0, SingleHeight, FEditGengo);
     if FEditGengo then ALeft := FGengoCombo.Width - ComboLeftMargein;      if FEditGengo then ALeft := FGengoCombo.Width - ComboLeftMargein;
   
     ControlShowHide (FAmpmCombo,   ATop, SingleHeight, False);      ControlShowHide (FAmpmCombo,   ATop, SingleHeight, False);
     ControlShowHide (FYearEdit,    0,    SingleHeight, True);      ControlShowHide (FYearEdit,    0,    SingleHeight, True);
     ControlShowHide (FMonthEdit,   0,    SingleHeight, False);      ControlShowHide (FMonthEdit,   0,    SingleHeight, False);
     ControlShowHide (FDayEdit,     ATop, SingleHeight, False);      ControlShowHide (FDayEdit,     ATop, SingleHeight, False);
     ControlShowHide (FYearLabel,   ATop, SingleHeight, True);      ControlShowHide (FYearLabel,   ATop, SingleHeight, True);
     ControlShowHide (FMonthLabel,  ATop, SingleHeight, False);      ControlShowHide (FMonthLabel,  ATop, SingleHeight, False);
     ControlShowHide (FDayLabel,    ATop, SingleHeight, False);      ControlShowHide (FDayLabel,    ATop, SingleHeight, False);
     ControlShowHide (FHourEdit,    ATop, SingleHeight, False);      ControlShowHide (FHourEdit,    ATop, SingleHeight, False);
     ControlShowHide (FMinuteEdit,  ATop, SingleHeight, False);      ControlShowHide (FMinuteEdit,  ATop, SingleHeight, False);
     ControlShowHide (FSecondEdit,  ATop, SingleHeight, False);      ControlShowHide (FSecondEdit,  ATop, SingleHeight, False);
     ControlShowHide (FHourLabel,   ATop, SingleHeight, False);      ControlShowHide (FHourLabel,   ATop, SingleHeight, False);
     ControlShowHide (FMinuteLabel, ATop, SingleHeight, False);      ControlShowHide (FMinuteLabel, ATop, SingleHeight, False);
     ControlShowHide (FSecondLabel, ATop, SingleHeight, False);      ControlShowHide (FSecondLabel, ATop, SingleHeight, False);
   
     FYearEdit.Left  := ALeft;      FYearEdit.Left  := ALeft;
     FYearLabel.Left := FYearEdit.Left  + FYearEdit.Width - 2;      FYearLabel.Left := FYearEdit.Left  + FYearEdit.Width - 2;
     Width           := FYearLabel.Left + FYearLabel.Width;      Width           := FYearLabel.Left + FYearLabel.Width;
   end;    end;
   
   //時分秒    //時分秒
   desHourMinuteSecond:    desHourMinuteSecond:
   begin    begin
     ControlShowHide (FGengoCombo,  0, SingleHeight, False);      ControlShowHide (FGengoCombo,  0, SingleHeight, False);
     ControlShowHide (FYearEdit,    0, SingleHeight, False);      ControlShowHide (FYearEdit,    0, SingleHeight, False);
     ControlShowHide (FMonthEdit,   0, SingleHeight, False);      ControlShowHide (FMonthEdit,   0, SingleHeight, False);
     ControlShowHide (FDayEdit,     0, SingleHeight, False);      ControlShowHide (FDayEdit,     0, SingleHeight, False);
     ControlShowHide (FYearLabel,   0, SingleHeight, False);      ControlShowHide (FYearLabel,   0, SingleHeight, False);
     ControlShowHide (FMonthLabel,  0, SingleHeight, False);      ControlShowHide (FMonthLabel,  0, SingleHeight, False);
     ControlShowHide (FDayLabel,    0, SingleHeight, False);      ControlShowHide (FDayLabel,    0, SingleHeight, False);
     ControlShowHide (FHourEdit,    0, SingleHeight, True);      ControlShowHide (FHourEdit,    0, SingleHeight, True);
     ControlShowHide (FMinuteEdit,  0, SingleHeight, True);      ControlShowHide (FMinuteEdit,  0, SingleHeight, True);
     ControlShowHide (FSecondEdit,  0, SingleHeight, True);      ControlShowHide (FSecondEdit,  0, SingleHeight, True);
     ControlShowHide (FHourLabel,   0, SingleHeight, True);      ControlShowHide (FHourLabel,   0, SingleHeight, True);
     ControlShowHide (FMinuteLabel, 0, SingleHeight, True);      ControlShowHide (FMinuteLabel, 0, SingleHeight, True);
     ControlShowHide (FSecondLabel, 0, SingleHeight, True);      ControlShowHide (FSecondLabel, 0, SingleHeight, True);
   
     ControlShowHide (FAmpmCombo, 0, SingleHeight,FEditAmpm);      ControlShowHide (FAmpmCombo, 0, SingleHeight,FEditAmpm);
     if FEditAmpm then ALeft := FAmpmCombo.Left + FAmpmCombo.Width - ComboLeftMargein;      if FEditAmpm then ALeft := FAmpmCombo.Left + FAmpmCombo.Width - ComboLeftMargein;
   
     FHourEdit.Left    := ALeft;      FHourEdit.Left    := ALeft;
     FHourLabel.Left   := FHourEdit.Left    + FHourEdit.Width;      FHourLabel.Left   := FHourEdit.Left    + FHourEdit.Width;
     FMinuteEdit.Left  := FHourLabel.Left   + FHourLabel.Width - LeftPosMargin;      FMinuteEdit.Left  := FHourLabel.Left   + FHourLabel.Width - LeftPosMargin;
     FMinuteLabel.Left := FMinuteEdit.Left  + FMinuteEdit.Width;      FMinuteLabel.Left := FMinuteEdit.Left  + FMinuteEdit.Width;
     FSecondEdit.Left  := FMinuteLabel.Left + FMinuteLabel.Width - LeftPosMargin;      FSecondEdit.Left  := FMinuteLabel.Left + FMinuteLabel.Width - LeftPosMargin;
     FSecondLabel.Left := FSecondEdit.Left  + FSecondEdit.Width;      FSecondLabel.Left := FSecondEdit.Left  + FSecondEdit.Width;
     Width             := FSecondLabel.Left + FSecondLabel.Width;      Width             := FSecondLabel.Left + FSecondLabel.Width;
   end;    end;
   
   //時分    //時分
   desHourMinute:    desHourMinute:
   begin    begin
     ControlShowHide (FGengoCombo,  0, SingleHeight, False);      ControlShowHide (FGengoCombo,  0, SingleHeight, False);
     ControlShowHide (FYearEdit,    0, SingleHeight, False);      ControlShowHide (FYearEdit,    0, SingleHeight, False);
     ControlShowHide (FMonthEdit,   0, SingleHeight, False);      ControlShowHide (FMonthEdit,   0, SingleHeight, False);
     ControlShowHide (FDayEdit,     0, SingleHeight, False);      ControlShowHide (FDayEdit,     0, SingleHeight, False);
     ControlShowHide (FYearLabel,   0, SingleHeight, False);      ControlShowHide (FYearLabel,   0, SingleHeight, False);
     ControlShowHide (FMonthLabel,  0, SingleHeight, False);      ControlShowHide (FMonthLabel,  0, SingleHeight, False);
     ControlShowHide (FDayLabel,    0, SingleHeight, False);      ControlShowHide (FDayLabel,    0, SingleHeight, False);
     ControlShowHide (FHourEdit,    0, SingleHeight, True);      ControlShowHide (FHourEdit,    0, SingleHeight, True);
     ControlShowHide (FMinuteEdit,  0, SingleHeight, True);      ControlShowHide (FMinuteEdit,  0, SingleHeight, True);
     ControlShowHide (FSecondEdit,  0, SingleHeight, False);      ControlShowHide (FSecondEdit,  0, SingleHeight, False);
     ControlShowHide (FHourLabel,   0, SingleHeight, True);      ControlShowHide (FHourLabel,   0, SingleHeight, True);
     ControlShowHide (FMinuteLabel, 0, SingleHeight, True);      ControlShowHide (FMinuteLabel, 0, SingleHeight, True);
     ControlShowHide (FSecondLabel, 0, SingleHeight, False);      ControlShowHide (FSecondLabel, 0, SingleHeight, False);
   
     ControlShowHide (FAmpmCombo, 0, SingleHeight, FEditAmpm);      ControlShowHide (FAmpmCombo, 0, SingleHeight, FEditAmpm);
     if FEditAmpm then ALeft := FAmpmCombo.Left + FAmpmCombo.Width - ComboLeftMargein;      if FEditAmpm then ALeft := FAmpmCombo.Left + FAmpmCombo.Width - ComboLeftMargein;
   
     FHourEdit.Left    := ALeft;      FHourEdit.Left    := ALeft;
     FHourLabel.Left   := FHourEdit.Left    + FHourEdit.Width;      FHourLabel.Left   := FHourEdit.Left    + FHourEdit.Width;
     FMinuteEdit.Left  := FHourLabel.Left   + FHourLabel.Width - LeftPosMargin;      FMinuteEdit.Left  := FHourLabel.Left   + FHourLabel.Width - LeftPosMargin;
     FMinuteLabel.Left := FMinuteEdit.Left  + FMinuteEdit.Width;      FMinuteLabel.Left := FMinuteEdit.Left  + FMinuteEdit.Width;
     Width             := FMinuteLabel.Left + FMinuteLabel.Width;      Width             := FMinuteLabel.Left + FMinuteLabel.Width;
   end;    end;
   
   //時    //時
   desHour:    desHour:
   begin    begin
     ControlShowHide (FGengoCombo,  0, SingleHeight, False);      ControlShowHide (FGengoCombo,  0, SingleHeight, False);
     ControlShowHide (FYearEdit,    0, SingleHeight, False);      ControlShowHide (FYearEdit,    0, SingleHeight, False);
     ControlShowHide (FMonthEdit,   0, SingleHeight, False);      ControlShowHide (FMonthEdit,   0, SingleHeight, False);
     ControlShowHide (FDayEdit,     0, SingleHeight, False);      ControlShowHide (FDayEdit,     0, SingleHeight, False);
     ControlShowHide (FYearLabel,   0, SingleHeight, False);      ControlShowHide (FYearLabel,   0, SingleHeight, False);
     ControlShowHide (FMonthLabel,  0, SingleHeight, False);      ControlShowHide (FMonthLabel,  0, SingleHeight, False);
     ControlShowHide (FDayLabel,    0, SingleHeight, False);      ControlShowHide (FDayLabel,    0, SingleHeight, False);
     ControlShowHide (FHourEdit,    0, SingleHeight, True);      ControlShowHide (FHourEdit,    0, SingleHeight, True);
     ControlShowHide (FMinuteEdit,  0, SingleHeight, False);      ControlShowHide (FMinuteEdit,  0, SingleHeight, False);
     ControlShowHide (FSecondEdit,  0, SingleHeight, False);      ControlShowHide (FSecondEdit,  0, SingleHeight, False);
     ControlShowHide (FHourLabel,   0, SingleHeight, True);      ControlShowHide (FHourLabel,   0, SingleHeight, True);
     ControlShowHide (FMinuteLabel, 0, SingleHeight, False);      ControlShowHide (FMinuteLabel, 0, SingleHeight, False);
     ControlShowHide (FSecondLabel, 0, SingleHeight, False);      ControlShowHide (FSecondLabel, 0, SingleHeight, False);
   
     ControlShowHide (FAmpmCombo, 0, SingleHeight, FEditAmpm);      ControlShowHide (FAmpmCombo, 0, SingleHeight, FEditAmpm);
     if FEditAmpm then ALeft := FAmpmCombo.Left + FAmpmCombo.Width - ComboLeftMargein;      if FEditAmpm then ALeft := FAmpmCombo.Left + FAmpmCombo.Width - ComboLeftMargein;
   
     FHourEdit.Left  := ALeft;      FHourEdit.Left  := ALeft;
     FHourLabel.Left := FHourEdit.Left  + FHourEdit.Width;      FHourLabel.Left := FHourEdit.Left  + FHourEdit.Width;
     Width           := FHourLabel.Left + FHourLabel.Width;      Width           := FHourLabel.Left + FHourLabel.Width;
   end;    end;
 end;  end;
 //サイズの調整が終了したら外部からのリサイズを禁止  //サイズの調整が終了したら外部からのリサイズを禁止
 fgResize := False;  fgResize := False;
end; end;
   
//============================================================================= //=============================================================================
//  各コントロールの表示非表示 //  各コントロールの表示非表示
//  ComboBoxはHeightで設定しても無効.HeightはFont.Sizeで自動で決まる //  ComboBoxはHeightで設定しても無効.HeightはFont.Sizeで自動で決まる
//  ComboBoxの高さはItemHeightで設定する //  ComboBoxの高さはItemHeightで設定する
//  ItemHeightの設定は,StyleにOwnerがないとできない //  ItemHeightの設定は,StyleにOwnerがないとできない
//============================================================================= //=============================================================================
procedure TplDateEdit.ControlShowHide(Sender : TObject; ATop,AHeight: Integer; procedure TplDateEdit.ControlShowHide(Sender : TObject; ATop,AHeight: Integer;
 AFlag: Boolean);  AFlag: Boolean);
var var
 S           : String;  S           : String;
 WidthMargin : Integer;  WidthMargin : Integer;
begin begin
 if AFlag then begin  if AFlag then begin
   if CheckWin32Version(6, 0) then begin    if CheckWin32Version(6, 0) then begin
     WidthMargin := 2;      WidthMargin := 2;
   end else begin    end else begin
     WidthMargin := 0;      WidthMargin := 0;
   end;    end;
   
   TControl(Sender).Top     := ATop;    TControl(Sender).Top     := ATop;
   TControl(Sender).Visible := True;    TControl(Sender).Visible := True;
   
   if Sender is TComboBox then begin    if Sender is TComboBox then begin
     TComboBox(Sender).ItemHeight := AHeight - DefHeightItemHeightCombo;      TComboBox(Sender).ItemHeight := AHeight - DefHeightItemHeightCombo;
     TComboBox(Sender).Font.Size  := Canvas.Font.Size;      TComboBox(Sender).Font.Size  := Canvas.Font.Size;
     TComboBox(Sender).Font.Color := Canvas.Font.Color;      TComboBox(Sender).Font.Color := Canvas.Font.Color;
   
     {$IF CompilerVersion > 14.99}       {$IF CompilerVersion > 14.99}
     if ThemeServices.ThemesEnabled then begin      if ThemeServices.ThemesEnabled then begin
       TComboBox(Sender).Width := Canvas.TextWidth('0000') + 24;        TComboBox(Sender).Width := Canvas.TextWidth('0000') + 24;
     end else begin      end else begin
       TComboBox(Sender).Width := Canvas.TextWidth('0000') + 27;        TComboBox(Sender).Width := Canvas.TextWidth('0000') + 27;
     end;      end;
     {$ELSE}       {$ELSE}
     TComboBox(Sender).Width := Canvas.TextWidth('0000') + 27;      TComboBox(Sender).Width := Canvas.TextWidth('0000') + 27;
     {$IFEND}       {$IFEND}
   end;    end;
   
   if Sender is TplDateEditEdit then begin    if Sender is TplDateEditEdit then begin
     TplDateEditEdit(Sender).Height    := AHeight;      TplDateEditEdit(Sender).Height    := AHeight;
     TplDateEditEdit(Sender).Font      := Canvas.Font;      TplDateEditEdit(Sender).Font      := Canvas.Font;
     TplDateEditEdit(Sender).Font.Size := Canvas.Font.Size;      TplDateEditEdit(Sender).Font.Size := Canvas.Font.Size;
   
     if (Sender = FYearEdit) and (FYeardigit = yddigit4) then begin      if (Sender = FYearEdit) and (FYeardigit = yddigit4) then begin
       TplDateEditEdit(Sender).MaxLength := 4;        TplDateEditEdit(Sender).MaxLength := 4;
       TplDateEditEdit(Sender).Width     := Canvas.TextWidth('0000') + 12;        TplDateEditEdit(Sender).Width     := Canvas.TextWidth('0000') + 12;
     end else begin      end else begin
       TplDateEditEdit(Sender).MaxLength := 2;        TplDateEditEdit(Sender).MaxLength := 2;
       TplDateEditEdit(Sender).Width     := Canvas.TextWidth('00') + 12;        TplDateEditEdit(Sender).Width     := Canvas.TextWidth('00') + 12;
     end;      end;
   end;    end;
   
   if Sender is TplDateEditLabel then begin    if Sender is TplDateEditLabel then begin
     S := TplDateEditLabel(Sender).Text;      S := TplDateEditLabel(Sender).Text;
   
     TplDateEditLabel(Sender).Height     := AHeight;      TplDateEditLabel(Sender).Height     := AHeight;
     TplDateEditLabel(Sender).Width      := Canvas.TextWidth(S) + 10 - WidthMargin;      TplDateEditLabel(Sender).Width      := Canvas.TextWidth(S) + 10 - WidthMargin;
     TplDateEditLabel(Sender).Font.Size  := Canvas.Font.Size;      TplDateEditLabel(Sender).Font.Size  := Canvas.Font.Size;
     TplDateEditLabel(Sender).Font.Style := [];      TplDateEditLabel(Sender).Font.Style := [];
     TplDateEditLabel(Sender).Font.Color := clBlack;      TplDateEditLabel(Sender).Font.Color := clBlack;
   end;    end;
 end else begin  end else begin
   TControl(Sender).Width   := 0;    TControl(Sender).Width   := 0;
   TControl(Sender).Visible := False;    TControl(Sender).Visible := False;
 end;  end;
end; end;
   
{ TplDateEditLabel }  { TplDateEditLabel }
   
//============================================================================= //=============================================================================
//  年月日時分秒のラベルの描画 //  年月日時分秒のラベルの描画
//  Ver1.1で追加 //  Ver1.1で追加
//============================================================================= //=============================================================================
procedure TplDateEditLabel.Paint; procedure TplDateEditLabel.Paint;
var var
 ARect    : TRect;  ARect    : TRect;
 AEge     : UINT;  AEge     : UINT;
 AGrfFlag : UINT;  AGrfFlag : UINT;
 uFormat  : UINT;  uFormat  : UINT;
begin begin
 inherited;  inherited;
 if FplDate = nil then exit;  if FplDate = nil then exit;
   
 //ラベルの枠のエッジ種類を定義.XPテーマの場合はフラットな枠線  //ラベルの枠のエッジ種類を定義.XPテーマの場合はフラットな枠線
 //OSがWindows XPでかつマニフェストが指定されている場合  //OSがWindows XPでかつマニフェストが指定されている場合
 {$IF CompilerVersion > 14.99}   {$IF CompilerVersion > 14.99}
 if ThemeServices.ThemesEnabled then begin  if ThemeServices.ThemesEnabled then begin
   AEge     := BDR_RAISEDOUTER;    AEge     := BDR_RAISEDOUTER;
   AGrfFlag := BF_FLAT or BF_RECT;    AGrfFlag := BF_FLAT or BF_RECT;
 end else begin  end else begin
   AEge     := EDGE_SUNKEN;    AEge     := EDGE_SUNKEN;
   AGrfFlag := BF_RECT;    AGrfFlag := BF_RECT;
 end;  end;
 {$ELSE}   {$ELSE}
 AEge     := EDGE_SUNKEN;  AEge     := EDGE_SUNKEN;
 AGrfFlag := BF_RECT;  AGrfFlag := BF_RECT;
 {$IFEND}   {$IFEND}
   
 //フォントサイズ  //フォントサイズ
 Canvas.Font.Assign(Font);  Canvas.Font.Assign(Font);
   
 //文字列描画のアライメント.1行のみ.上下左右中央  //文字列描画のアライメント.1行のみ.上下左右中央
 uFormat := DT_SINGLELINE or DT_CENTER or DT_VCENTER;  uFormat := DT_SINGLELINE or DT_CENTER or DT_VCENTER;
 //ラベル枠と文字を描画  //ラベル枠と文字を描画
 ARect := ClientRect;  ARect := ClientRect;
 DrawEdge(Canvas.Handle, ARect, AEge, AGrfFlag);  DrawEdge(Canvas.Handle, ARect, AEge, AGrfFlag);
 SetBkMode(Canvas.Handle, TRANSPARENT);  SetBkMode(Canvas.Handle, TRANSPARENT);
 DrawText(Canvas.Handle, PChar(Text), -1, ARect, uFormat);  DrawText(Canvas.Handle, PChar(Text), -1, ARect, uFormat);
end; end;
   
{ TplDateEdit }  { TplDateEdit }
   
//============================================================================= //=============================================================================
//  入力欄を全て空にする //  入力欄を全て空にする
//============================================================================= //=============================================================================
procedure TplDateEdit.SetEditEmpty; procedure TplDateEdit.SetEditEmpty;
begin begin
 FYear         := 0;  FYear         := 0;
 FMonth        := 0;  FMonth        := 0;
 FDay          := 0;  FDay          := 0;
 FHour         := 0;  FHour         := 0;
 FMinute       := 0;  FMinute       := 0;
 FSecond       := 0;  FSecond       := 0;
 FYearStr      := '';  FYearStr      := '';
 FMonthStr     := '';  FMonthStr     := '';
 FDayStr       := '';  FDayStr       := '';
 FHourStr      := '';  FHourStr      := '';
 FMinuteStr    := '';  FMinuteStr    := '';
 FSecondStr    := '';  FSecondStr    := '';
 FGengoYear    := 0;  FGengoYear    := 0;
 FGengoYearStr := '';  FGengoYearStr := '';
 FGengoStr     := '';  FGengoStr     := '';
 FAmpmStr      := '';  FAmpmStr      := '';
   
 FGengoCombo.ItemIndex := -1; //FGengoCombo.Text:='';  FGengoCombo.ItemIndex := -1; //FGengoCombo.Text:='';
 FAmpmCombo.ItemIndex  := -1; //FGengoCombo.Text:='';  FAmpmCombo.ItemIndex  := -1; //FGengoCombo.Text:='';
 FDateTime             := FBaseDate - 1;  FDateTime             := FBaseDate - 1;
 FDate                 := FDateTime;  FDate                 := FDateTime;
 FYearEdit.Text        := '';  FYearEdit.Text        := '';
 FMonthEdit.Text       := '';  FMonthEdit.Text       := '';
 FDayEdit.Text         := '';  FDayEdit.Text         := '';
 FHourEdit.Text        := '';  FHourEdit.Text        := '';
 FMinuteEdit.Text      := '';  FMinuteEdit.Text      := '';
 FSecondEdit.Text      := '';  FSecondEdit.Text      := '';
 FIsEmpty              := True;  FIsEmpty              := True;
end; end;
   
//============================================================================= //=============================================================================
//  DateTime型の値をコンポの各コントロールに表示 //  DateTime型の値をコンポの各コントロールに表示
//  日付や時刻を外部から与えた時の処理 //  日付や時刻を外部から与えた時の処理
//  FDateプロパティは前のバージョンとの互換性のため //  FDateプロパティは前のバージョンとの互換性のため
// //
//  日付と時刻入力部が表示の時はTDateTimeに日付と時刻共記録 //  日付と時刻入力部が表示の時はTDateTimeに日付と時刻共記録
//  日付の入力部だけが表示の時はTDateTimeに日付のみ記録 //  日付の入力部だけが表示の時はTDateTimeに日付のみ記録
//  自覚の入力部だけが表示の時はTDateTimeに時刻のみ記録 //  自覚の入力部だけが表示の時はTDateTimeに時刻のみ記録
//  日付はTDateTimeの整数部 //  日付はTDateTimeの整数部
//  時刻はTDateTimeの小数点部 //  時刻はTDateTimeの小数点部
//============================================================================= //=============================================================================
procedure TplDateEdit.SetDate(const Value: TDateTime); procedure TplDateEdit.SetDate(const Value: TDateTime);
const const
 ErrorS1 = '正しくない日付時刻型の値がセットされました.  ';  ErrorS1 = '正しくない日付時刻型の値がセットされました.  ';
begin begin
 if csReading in ComponentState then exit;  if csReading in ComponentState then exit;
 FErrorKinds := [];  FErrorKinds := [];
   
 if FDateTime <> Value then begin  if FDateTime <> Value then begin
   try    try
     if (FYearEdit.Visible) and (FHourEdit.Visible) then begin      if (FYearEdit.Visible) and (FHourEdit.Visible) then begin
       FDateTime := Value;        FDateTime := Value;
     end else      end else
     if (FYearEdit.Visible) then begin      if (FYearEdit.Visible) then begin
       FDateTime := Trunc(Value);        FDateTime := Trunc(Value);
     end else begin      end else begin
       FDateTime := Frac(Value);        FDateTime := Frac(Value);
     end;      end;
     FDate := FDateTime;      FDate := FDateTime;
     //エラーがなければ各プロパティ値をコントロールに表示      //エラーがなければ各プロパティ値をコントロールに表示
     GetProperties;      GetProperties;
   except    except
     FErrorKinds := [derSetDateTimeError];      FErrorKinds := [derSetDateTimeError];
     ShowErrorDialog(ErrorS1, nil);      ShowErrorDialog(ErrorS1, nil);
   end;    end;
 end;  end;
end; end;
   
//============================================================================= //=============================================================================
//  和暦か西暦表示か //  和暦か西暦表示か
//  元号選択リストが非表示の時は和暦表示はさせない //  元号選択リストが非表示の時は和暦表示はさせない
//============================================================================= //=============================================================================
procedure TplDateEdit.SetGengo(const Value: Boolean); procedure TplDateEdit.SetGengo(const Value: Boolean);
begin begin
 if FGengo <> Value then begin  if FGengo <> Value then begin
   if FEditGengo then begin    if FEditGengo then begin
     FGengo := Value;      FGengo := Value;
   end else begin    end else begin
     FGengo  := False;      FGengo  := False;
   end;    end;
   if (csReading in ComponentState) then exit;    if (csReading in ComponentState) then exit;
   if (csDesigning in ComponentState) then exit;    if (csDesigning in ComponentState) then exit;
   CheckDateError;    CheckDateError;
 end;  end;
end; end;
   
//============================================================================= //=============================================================================
//  DateTime,Date,Timeプロパティの取得メソッド //  DateTime,Date,Timeプロパティの取得メソッド
//============================================================================= //=============================================================================
function TplDateEdit.GetDate: TDateTime; function TplDateEdit.GetDate: TDateTime;
begin begin
 Result := 0;  Result := 0;
 if (csDesigning in ComponentState) then exit;  if (csDesigning in ComponentState) then exit;
 if (csReading in ComponentState) then exit;  if (csReading in ComponentState) then exit;
 if CheckDateError = False then begin  if CheckDateError = False then begin
   Result := FDateTime;    Result := FDateTime;
 end;  end;
end; end;
   
//============================================================================= //=============================================================================
//  各コントロールの入力値(文字列)からDateTime型の日付を計算 //  各コントロールの入力値(文字列)からDateTime型の日付を計算
//  エラーの時はTrue //  エラーの時はTrue
//  備考: FBaseDate := StrToDateTime('1873/01/01'); //  備考: FBaseDate := StrToDateTime('1873/01/01');
//============================================================================= //=============================================================================
function TplDateEdit.CheckDateError: Boolean; function TplDateEdit.CheckDateError: Boolean;
const const
 ErrorS2 = '1873年1月1日(明治6年1月1日)より前の日付は処理できません.  ';  ErrorS2 = '1873年1月1日(明治6年1月1日)より前の日付は処理できません.  ';
 ErrorS3 = '日付が正しくありません.  ';  ErrorS3 = '日付が正しくありません.  ';
 ErrorS4 = '時刻が正しくありません.  ';  ErrorS4 = '時刻が正しくありません.  ';
 ErrorS5 = '入力欄が全て空白です.  ';  ErrorS5 = '入力欄が全て空白です.  ';
 ErrorS6 = '空白の入力欄があります.  ';  ErrorS6 = '空白の入力欄があります.  ';
 ErrorS7 = '2088年(平成100年)以降は元号に変換できません.  ';  ErrorS7 = '2088年(平成100年)以降は元号に変換できません.  ';
 ErrorS8 = '日付または時刻が正しくありません.  ';  ErrorS8 = '日付または時刻が正しくありません.  ';
 ErrorS9 = '時刻の入力可能な値は11時59分59秒までです.  ';  ErrorS9 = '時刻の入力可能な値は11時59分59秒までです.  ';
 ErrorS10= '時刻の入力可能な値は23時59分59秒までです.  ';  ErrorS10= '時刻の入力可能な値は23時59分59秒までです.  ';
 ErrorS11= '日付に変換できない値です.   ';  ErrorS11= '日付に変換できない値です.   ';
var var
 StrGengo    : String;  StrGengo    : String;
 StrAmpm     : String;  StrAmpm     : String;
 dYear       : WORD;  dYear       : WORD;
 dMonth      : WORD;  dMonth      : WORD;
 dDay        : WORD;  dDay        : WORD;
 dHour       : WORD;  dHour       : WORD;
 dMinute     : WORD;  dMinute     : WORD;
 dSecond     : WORD;  dSecond     : WORD;
 FlagGengo   : Boolean;  FlagGengo   : Boolean;
 FlagAmpm    : Boolean;  FlagAmpm    : Boolean;
 FlagYear    : Boolean;  FlagYear    : Boolean;
 FlagMonth   : Boolean;  FlagMonth   : Boolean;
 FlagDay     : Boolean;  FlagDay     : Boolean;
 FlagHour    : Boolean;  FlagHour    : Boolean;
 FlagMinute  : Boolean;  FlagMinute  : Boolean;
 FlagSecond  : Boolean;  FlagSecond  : Boolean;
 AWinControl : TWinControl;  AWinControl : TWinControl;
   
 dMiri     : WORD;  dMiri     : WORD;
 StrYear   : String;  StrYear   : String;
 StrMonth  : String;  StrMonth  : String;
 StrDay    : String;  StrDay    : String;
 StrHour   : String;  StrHour   : String;
 StrMinute : String;  StrMinute : String;
 StrSecond : String;  StrSecond : String;
 i         : Integer;  i         : Integer;
 AIndex    : Integer;  AIndex    : Integer;
 ADate     : TDateTime;  ADate     : TDateTime;
 ATime     : TDateTime;  ATime     : TDateTime;
begin begin
 Result      := True;  Result      := True;
 FErrorKinds := [];  FErrorKinds := [];
   
 if EditGengo = False then FGengoCombo.ItemIndex := -1;  if EditGengo = False then FGengoCombo.ItemIndex := -1;
   
 StrGengo  := Trim(FGengoCombo.Text);  StrGengo  := Trim(FGengoCombo.Text);
 StrAmpm   := Trim(FAmpmCombo.Text);  StrAmpm   := Trim(FAmpmCombo.Text);
 StrYear   := Trim(FYearEdit.Text);  StrYear   := Trim(FYearEdit.Text);
 StrMonth  := Trim(FMonthEdit.Text);  StrMonth  := Trim(FMonthEdit.Text);
 StrDay    := Trim(FDayEdit.Text);  StrDay    := Trim(FDayEdit.Text);
 StrHour   := Trim(FHourEdit.Text);  StrHour   := Trim(FHourEdit.Text);
 StrMinute := Trim(FMinuteEdit.Text);  StrMinute := Trim(FMinuteEdit.Text);
 StrSecond := Trim(FSecondEdit.Text);  StrSecond := Trim(FSecondEdit.Text);
   
 FlagGengo  := (StrGengo  = '' )   and FGengoCombo.Visible;  FlagGengo  := (StrGengo  = '' )   and FGengoCombo.Visible;
 FlagAmpm   := (StrAmpm   = ''  )  and FAmpmCombo.Visible;  FlagAmpm   := (StrAmpm   = ''  )  and FAmpmCombo.Visible;
 FlagYear   := (StrYear   = ''  )  and FYearEdit.Visible;  FlagYear   := (StrYear   = ''  )  and FYearEdit.Visible;
 FlagMonth  := (StrMonth  = '' )   and FMonthEdit.Visible;  FlagMonth  := (StrMonth  = '' )   and FMonthEdit.Visible;
 FlagDay    := (StrDay    = ''   ) and FDayEdit.Visible;  FlagDay    := (StrDay    = ''   ) and FDayEdit.Visible;
 FlagHour   := (StrHour   = ''  )  and FHourEdit.Visible;  FlagHour   := (StrHour   = ''  )  and FHourEdit.Visible;
 FlagMinute := (StrMinute = '')    and FMinuteEdit.Visible;  FlagMinute := (StrMinute = '')    and FMinuteEdit.Visible;
 FlagSecond := (StrSecond = '')    and FSecondEdit.Visible;  FlagSecond := (StrSecond = '')    and FSecondEdit.Visible;
   
 //入力欄が全て空白の場合  //入力欄が全て空白の場合
 if GetIsEmpty then begin  if GetIsEmpty then begin
   FIsEmpty := True;    FIsEmpty := True;
   //空白入力を許可していない場合    //空白入力を許可していない場合
   if FCanEmpty = False then begin    if FCanEmpty = False then begin
     FErrorKinds := [derAllEmpty];      FErrorKinds := [derAllEmpty];
     ShowErrorDialog(ErrorS5, nil);      ShowErrorDialog(ErrorS5, nil);
   end else begin    end else begin
     //日付関係の取得プロパティを初期値にしてエラーなし扱いで終了      //日付関係の取得プロパティを初期値にしてエラーなし扱いで終了
     SetEditEmpty;      SetEditEmpty;
     Result := False;      Result := False;
     exit;      exit;
   end;    end;
 //どれかの入力コントロールの値が空の場合  //どれかの入力コントロールの値が空の場合
 //元号の空文字列は西暦とみなしてGetPropertiesで再取得するので空でもよい  //元号の空文字列は西暦とみなしてGetPropertiesで再取得するので空でもよい
 //午前午後の文字列の空白は許可しない  //午前午後の文字列の空白は許可しない
 end else if FlagAmpm   or  end else if FlagAmpm   or
             FlagYear   or              FlagYear   or
             FlagMonth  or              FlagMonth  or
             FlagDay    or              FlagDay    or
             FlagHour   or              FlagHour   or
             FlagMinute or              FlagMinute or
             FlagSecond then begin              FlagSecond then begin
   FIsEmpty := False;    FIsEmpty := False;
   //空白入力を許可していても1つでも入力がある場合はエラー    //空白入力を許可していても1つでも入力がある場合はエラー
   //空白許可とは全入力欄が空白の場合を意味する    //空白許可とは全入力欄が空白の場合を意味する
   //最右端のコントロールからチェック    //最右端のコントロールからチェック
   if FlagSecond then begin    if FlagSecond then begin
     AWinControl := FSecondEdit;      AWinControl := FSecondEdit;
     Include(FErrorKinds, derSecondEmpty);      Include(FErrorKinds, derSecondEmpty);
   end;    end;
   if FlagMinute then begin    if FlagMinute then begin
     AWinControl := FMinuteEdit;      AWinControl := FMinuteEdit;
     Include(FErrorKinds, derMinuteEmpty);      Include(FErrorKinds, derMinuteEmpty);
   end;    end;
   if FlagHour then begin    if FlagHour then begin
     AWinControl := FHourEdit;      AWinControl := FHourEdit;
     Include(FErrorKinds, derHourEmpty);      Include(FErrorKinds, derHourEmpty);
   end;    end;
   if FlagAmpm then begin    if FlagAmpm then begin
     AWinControl := FAmpmCombo;      AWinControl := FAmpmCombo;
     Include(FErrorKinds, derAmpmEmpty);      Include(FErrorKinds, derAmpmEmpty);
   end;    end;
   if FlagDay then begin    if FlagDay then begin
     AWinControl := FDayEdit;      AWinControl := FDayEdit;
     Include(FErrorKinds, derDayEmpty);      Include(FErrorKinds, derDayEmpty);
   end;    end;
   if FlagMonth then begin    if FlagMonth then begin
     AWinControl := FMonthEdit;      AWinControl := FMonthEdit;
     Include(FErrorKinds, derMonthEmpty);      Include(FErrorKinds, derMonthEmpty);
   end;    end;
   if FlagYear then begin    if FlagYear then begin
     AWinControl := FYearEdit;      AWinControl := FYearEdit;
     Include(FErrorKinds, derYearEmpty);      Include(FErrorKinds, derYearEmpty);
   end;    end;
   if FlagGengo then begin    if FlagGengo then begin
     AWinControl := FGengoCombo;      AWinControl := FGengoCombo;
     Include(FErrorKinds, derYearEmpty);      Include(FErrorKinds, derYearEmpty);
   end;    end;
   ShowErrorDialog(ErrorS6, AWinControl);    ShowErrorDialog(ErrorS6, AWinControl);
 //全ての欄または元号選択リスト以外が入力されている場合  //全ての欄または元号選択リスト以外が入力されている場合
 end else begin  end else begin
   FIsEmpty := False;    FIsEmpty := False;
   //外部から元号文字列を指定した場合を考慮して文字列に該当するItemIndexを調査    //外部から元号文字列を指定した場合を考慮して文字列に該当するItemIndexを調査
   //外部からの指定はItemIndexで指定するが,もしEraNames,EraYearOffsetsの配列を変更    //外部からの指定はItemIndexで指定するが,もしEraNames,EraYearOffsetsの配列を変更
   //した場合でも文字列なら以下のコードで対応できる    //した場合でも文字列なら以下のコードで対応できる
   //(EraNames,EraYearOffsetsはSysUtils内で定義されている)    //(EraNames,EraYearOffsetsはSysUtils内で定義されている)
   //時刻の方はは必ずコンボボックスのリストから選択しなければならない    //時刻の方はは必ずコンボボックスのリストから選択しなければならない
   AIndex := 0;    AIndex := 0;
   if FEditGengo then begin    if FEditGengo then begin
     for i := 0 to FGengoCombo. Items.Count - 1 do begin      for i := 0 to FGengoCombo. Items.Count - 1 do begin
       if FGengoCombo.Items[i] = StrGengo then begin        if FGengoCombo.Items[i] = StrGengo then begin
         AIndex := i;          AIndex := i;
         break;          break;
       end;        end;
     end;      end;
   end;    end;
   //元号選択リストが空白の時は西暦年とみなす    //元号選択リストが空白の時は西暦年とみなす
   if AIndex = 0 then begin    if AIndex = 0 then begin
     dYear := StrToIntDef(StrYear, 0);      dYear := StrToIntDef(StrYear, 0);
     //西暦入力の時に年の入力桁が2桁(FYeardigit=2)の時は西暦の下2桁とみなす      //西暦入力の時に年の入力桁が2桁(FYeardigit=2)の時は西暦の下2桁とみなす
     if FYeardigit = yddigit2 then begin      if FYeardigit = yddigit2 then begin
       dYear := dYear + (StrToInt(FormatDateTime('yyyy', Now)) div 100) * 100;        dYear := dYear + (StrToInt(FormatDateTime('yyyy', Now)) div 100) * 100;
     end;      end;
   end else begin    end else begin
     dYear := EraYearOffsets[AIndex] - 1 + StrToIntDef(StrYear, 0);      dYear := EraYearOffsets[AIndex] - 1 + StrToIntDef(StrYear, 0);
   end;    end;
   //年以外の各コントロールの文字列を数値に変換    //年以外の各コントロールの文字列を数値に変換
   dMonth  := StrToIntDef(StrMonth,  1);    dMonth  := StrToIntDef(StrMonth,  1);
   dDay    := StrToIntDef(StrDay,    1);    dDay    := StrToIntDef(StrDay,    1);
   dHour   := StrToIntDef(StrHour,   0);    dHour   := StrToIntDef(StrHour,   0);
   dMinute := StrToIntDef(StrMinute, 0);    dMinute := StrToIntDef(StrMinute, 0);
   dSecond := StrToIntDef(StrSecond, 0);    dSecond := StrToIntDef(StrSecond, 0);
 end;  end;
   
 //まず時刻のチェック  //まず時刻のチェック
 if (FHourEdit.Visible) then begin  if (FHourEdit.Visible) then begin
   if FAmpmCombo.Visible then AIndex := FAmpmCombo.ItemIndex    if FAmpmCombo.Visible then AIndex := FAmpmCombo.ItemIndex
                         else AIndex := -1;                          else AIndex := -1;
   //返値のATimeは0以上1未満の値.時 プロパティ取得(FHour)は午後は午後の    //返値のATimeは0以上1未満の値.時 プロパティ取得(FHour)は午後は午後の
   //時刻で返すのであるが,EncodeTimeでエラーを検出するために一度24時間値    //時刻で返すのであるが,EncodeTimeでエラーを検出するために一度24時間値
   //に変換    //に変換
   if (AIndex = 0) or (AIndex = 1) then begin    if (AIndex = 0) or (AIndex = 1) then begin
     if (dHour > 12) or ((dHour = 12) and ((dMinute >= 0.0) or (dSecond>= 0.0))) then begin      if (dHour > 12) or ((dHour = 12) and ((dMinute >= 0.0) or (dSecond>= 0.0))) then begin
       FErrorKinds := [derTimeError];        FErrorKinds := [derTimeError];
       ShowErrorDialog(ErrorS9, FHourEdit);        ShowErrorDialog(ErrorS9, FHourEdit);
     end;      end;
   end else begin    end else begin
     if (dHour > 24) or ((dHour = 24) and ((dMinute >= 0.0) or (dSecond >= 0.0))) then begin      if (dHour > 24) or ((dHour = 24) and ((dMinute >= 0.0) or (dSecond >= 0.0))) then begin
       FErrorKinds := [derTimeError];        FErrorKinds := [derTimeError];
       ShowErrorDialog(ErrorS10, FHourEdit);        ShowErrorDialog(ErrorS10, FHourEdit);
     end;      end;
   end;    end;
   if (dMinute > 59) or (dSecond > 59) then begin    if (dMinute > 59) or (dSecond > 59) then begin
     FErrorKinds := [derTimeError];      FErrorKinds := [derTimeError];
     ShowErrorDialog(ErrorS9, FMinuteEdit);      ShowErrorDialog(ErrorS9, FMinuteEdit);
   end else begin    end else begin
     if AIndex = 1 then dHour := dHour + 12;      if AIndex = 1 then dHour := dHour + 12;
     try      try
       dMiri  := 0;        dMiri  := 0;
       ATime  := EncodeTime(dHour, dMinute, dSecond, dMiri);        ATime  := EncodeTime(dHour, dMinute, dSecond, dMiri);
       Result := False;        Result := False;
     except      except
       FErrorKinds := [derTimeError];        FErrorKinds := [derTimeError];
       if FEditAmpm then ShowErrorDialog(ErrorS4, FAmpmCombo)        if FEditAmpm then ShowErrorDialog(ErrorS4, FAmpmCombo)
                    else ShowErrorDialog(ErrorS4, FHourEdit);                     else ShowErrorDialog(ErrorS4, FHourEdit);
     end;      end;
   end;    end;
 end;  end;
   
 //日付に変換してエラー発生なしならそれが日付  //日付に変換してエラー発生なしならそれが日付
 //ただし1873.1.1(明治6年1月1日)より前はエラー扱い  //ただし1873.1.1(明治6年1月1日)より前はエラー扱い
 //2088年(平成99年)以上で和暦表示の時もエラー扱い  //2088年(平成99年)以上で和暦表示の時もエラー扱い
 //エラーでなければGetPropertiesで各プロパティを再取得  //エラーでなければGetPropertiesで各プロパティを再取得
 if (FYearEdit.Visible) then begin  if (FYearEdit.Visible) then begin
   try    try
     ADate := EncodeDate(dYear,dMonth,dDay);      ADate := EncodeDate(dYear,dMonth,dDay);
     if (dYear<1873) then begin      if (dYear<1873) then begin
       FErrorKinds := [derBeforeBaseDate];        FErrorKinds := [derBeforeBaseDate];
       ShowErrorDialog(ErrorS2,FYearEdit);        ShowErrorDialog(ErrorS2,FYearEdit);
     end else if (dYear>=2088) and (FGengo) then begin      end else if (dYear>=2088) and (FGengo) then begin
       FErrorKinds := [derChangeGengo];        FErrorKinds := [derChangeGengo];
       ShowErrorDialog(ErrorS7,FYearEdit);        ShowErrorDialog(ErrorS7,FYearEdit);
     end else begin      end else begin
       Result := False;        Result := False;
     end;      end;
   except    except
     FErrorKinds := [derDateError];      FErrorKinds := [derDateError];
     ShowErrorDialog(ErrorS11,FYearEdit);      ShowErrorDialog(ErrorS11,FYearEdit);
   end;    end;
 end;  end;
   
 //エラーでなければGetPropertiesで各プロパティを再取得  //エラーでなければGetPropertiesで各プロパティを再取得
 if not Result then begin  if not Result then begin
   try    try
     FDateTime := Trunc(ADate)+Frac(ATime);      FDateTime := Trunc(ADate)+Frac(ATime);
     FDate     := FDateTime;      FDate     := FDateTime;
     GetProperties;      GetProperties;
   except    except
     FErrorKinds := [derDateTimeError];      FErrorKinds := [derDateTimeError];
     ShowErrorDialog(ErrorS8,nil);      ShowErrorDialog(ErrorS8,nil);
   end;    end;
 end;  end;
end; end;
   
//============================================================================= //=============================================================================
//  エラーダイアログの表示 //  エラーダイアログの表示
// //
//  プロパティ取得の際,エラーが発生した時にこのメソッドを呼出す //  プロパティ取得の際,エラーが発生した時にこのメソッドを呼出す
//  エラーが発生するとサイレント例外が発生するので,以下の様に処理することがで //  エラーが発生するとサイレント例外が発生するので,以下の様に処理することがで
//   きる.この時ErrorDialogがTrueなら,内蔵の警告ダイアログを表示する. //   きる.この時ErrorDialogがTrueなら,内蔵の警告ダイアログを表示する.
// //
//  try //  try
//    //取得プロパティなら何でもチェック可能 //    //取得プロパティなら何でもチェック可能
//    plDateEdit1.DateTime; //    plDateEdit1.DateTime;
//  except //  except
//    //ダイアログ表示などのエラー発生時の処理 //    //ダイアログ表示などのエラー発生時の処理
//    //ErrorKindsでエラーの内容を知ることが可能 //    //ErrorKindsでエラーの内容を知ることが可能
//  end; //  end;
//============================================================================= //=============================================================================
procedure TplDateEdit.ShowErrorDialog(ERStr: String; AWinControl: TWinControl); procedure TplDateEdit.ShowErrorDialog(ERStr: String; AWinControl: TWinControl);
begin begin
 if FDisplayError then begin  if FDisplayError then begin
   Application.MessageBox(PChar(ERStr), PChar(FDialogCaption), MB_OK + MB_ICONINFORMATION);    Application.MessageBox(PChar(ERStr), PChar(FDialogCaption), MB_OK + MB_ICONINFORMATION);
 end;  end;
 SetControlFocus(AWinControl);  SetControlFocus(AWinControl);
 Abort;  Abort;
end; end;
   
//============================================================================= //=============================================================================
//  FDate(日付部分のみ)の値から各プロパティを取得して各コントロールへの年月日 //  FDate(日付部分のみ)の値から各プロパティを取得して各コントロールへの年月日
//  を再表示する. //  を再表示する.
//  DecodeだとFDate=0のとき年月日が0となってしまうので使用しない //  DecodeだとFDate=0のとき年月日が0となってしまうので使用しない
//  和暦の場合を考慮して再計算(昭和70年XX月XX日と入力した場合平成の該当年に直 //  和暦の場合を考慮して再計算(昭和70年XX月XX日と入力した場合平成の該当年に直
//  す). //  す).
// //
//  この関数は,DateTimeプロパティに値をセットした時も,各入力コントロールに値 //  この関数は,DateTimeプロパティに値をセットした時も,各入力コントロールに値
//  の文字列をセットするために呼出している. //  の文字列をセットするために呼出している.
// //
//  備考: FBaseDate := StrToDateTime('1873/01/01'); //  備考: FBaseDate := StrToDateTime('1873/01/01');
//============================================================================= //=============================================================================
function TplDateEdit.GetProperties : Boolean; function TplDateEdit.GetProperties : Boolean;
var var
 i : Integer;  i : Integer;
begin begin
 Result := True;  Result := True;
   
 //1873.1.1(明治6年1月1日)より前は何もしない  //1873.1.1(明治6年1月1日)より前は何もしない
 if FYearEdit.Visible then begin  if FYearEdit.Visible then begin
   if FDateTime >= FBaseDate then begin    if FDateTime >= FBaseDate then begin
     FIsEmpty := False;      FIsEmpty := False;
     try      try
       FYear      := StrToInt(FormatDateTime ('yyyy', FDateTime)); //西暦年        FYear      := StrToInt(FormatDateTime ('yyyy', FDateTime)); //西暦年
       FMonth     := StrToInt(FormatDateTime ('m',    FDateTime)); //月        FMonth     := StrToInt(FormatDateTime ('m',    FDateTime)); //月
       FDay       := StrToInt(FormatDateTime ('d',    FDateTime)); //日        FDay       := StrToInt(FormatDateTime ('d',    FDateTime)); //日
       FGengoStr  := FormatDateTime          ('ggg',  FDateTime);  //元号文字列        FGengoStr  := FormatDateTime          ('ggg',  FDateTime);  //元号文字列
       FGengoYear := StrToInt(FormatDateTime ('e',    FDateTime)); //元号年        FGengoYear := StrToInt(FormatDateTime ('e',    FDateTime)); //元号年
       //元号表示の指定は元号を再取得(昭和が平成になるかも知れない        //元号表示の指定は元号を再取得(昭和が平成になるかも知れない
       //FGengoStrと同じ元号文字列のItemIndexの文字列をコンボに表示する        //FGengoStrと同じ元号文字列のItemIndexの文字列をコンボに表示する
       if FGengo then begin        if FGengo then begin
         FGengoCombo.Text := FGengoStr;          FGengoCombo.Text := FGengoStr;
         for i := 1 to MaxEraCount do begin          for i := 1 to MaxEraCount do begin
           if EraNames[i] = FGengoStr then begin            if EraNames[i] = FGengoStr then begin
             FGengoCombo.ItemIndex := i;              FGengoCombo.ItemIndex := i;
             break;              break;
           end;            end;
         end;          end;
         FYearEdit.Text := IntToStr(FGengoYear);          FYearEdit.Text := IntToStr(FGengoYear);
       //西暦表示指定の時        //西暦表示指定の時
       end else begin        end else begin
         //西暦のItemIndexは0固定          //西暦のItemIndexは0固定
         //もし元号選択のコンボが空であってもここで表示する          //もし元号選択のコンボが空であってもここで表示する
         //表示桁数が2桁の場合(FYeardigit=yddigit2)は下2桁のみ表示          //表示桁数が2桁の場合(FYeardigit=yddigit2)は下2桁のみ表示
         FGengoCombo.ItemIndex := 0;          FGengoCombo.ItemIndex := 0;
         FYearStr := IntToStr(FYear);          FYearStr := IntToStr(FYear);
         if FYeardigit = yddigit2 then begin          if FYeardigit = yddigit2 then begin
           FYearEdit.Text := Copy(FYearStr, Length(FYearStr) - 1, Length(FYearStr));            FYearEdit.Text := Copy(FYearStr, Length(FYearStr) - 1, Length(FYearStr));
         end else begin          end else begin
           FYearEdit.Text := FYearStr;            FYearEdit.Text := FYearStr;
         end;          end;
       end;        end;
       FMonthEdit.Text := IntToStr(FMonth);        FMonthEdit.Text := IntToStr(FMonth);
       FDayEdit.Text   := IntToStr(FDay);        FDayEdit.Text   := IntToStr(FDay);
       FYearStr        := IntToStr(FYear);        FYearStr        := IntToStr(FYear);
       FMonthStr       := IntToStr(FMonth);        FMonthStr       := IntToStr(FMonth);
       FDayStr         := IntToStr(FDay);        FDayStr         := IntToStr(FDay);
       FGengoYearStr   := IntToStr(FGengoYear);        FGengoYearStr   := IntToStr(FGengoYear);
     except      except
       Result := False;        Result := False;
     end;      end;
   end else begin    end else begin
     Result := False;      Result := False;
   end;    end;
 end;  end;
   
 //Decodeで各値を取得してもよいが日付の方のコードに合せた  //Decodeで各値を取得してもよいが日付の方のコードに合せた
 //午前午後の選択コンボが表示されている場合は午前か午後の時刻で取得  //午前午後の選択コンボが表示されている場合は午前か午後の時刻で取得
 if (FHourEdit.Visible) and (Frac(FDateTime) > 0) then begin  if (FHourEdit.Visible) and (Frac(FDateTime) > 0) then begin
   FIsEmpty := False;    FIsEmpty := False;
   try    try
     FAmpmStr := '';      FAmpmStr := '';
     FHour    := StrToInt(FormatDateTime ('hh', FDateTime)); //24時間表示      FHour    := StrToInt(FormatDateTime ('hh', FDateTime)); //24時間表示
     if FEditAmpm then begin      if FEditAmpm then begin
       if FHour < 12 then FAmpmCombo.ItemIndex := 0 else FAmpmCombo.ItemIndex := 1;        if FHour < 12 then FAmpmCombo.ItemIndex := 0 else FAmpmCombo.ItemIndex := 1;
       if (FAmpmCombo.ItemIndex = 1) then FHour := FHOur - 12;        if (FAmpmCombo.ItemIndex = 1) then FHour := FHOur - 12;
       FAmpmStr := FAmpmCombo.Text;        FAmpmStr := FAmpmCombo.Text;
     end;      end;
     FMinute          := StrToInt(FormatDateTime ('nn', FDateTime));      FMinute          := StrToInt(FormatDateTime ('nn', FDateTime));
     FSecond          := StrToInt(FormatDateTime ('ss', FDateTime));      FSecond          := StrToInt(FormatDateTime ('ss', FDateTime));
     FHourStr         := IntToStr(FHour);      FHourStr         := IntToStr(FHour);
     FMinuteStr       := IntToStr(FMinute);      FMinuteStr       := IntToStr(FMinute);
     FSecondStr       := IntToStr(FSecond);      FSecondStr       := IntToStr(FSecond);
     FHourEdit.Text   := FHourStr;      FHourEdit.Text   := FHourStr;
     FMinuteEdit.Text := FMinuteStr;      FMinuteEdit.Text := FMinuteStr;
     FSecondEdit.Text := FSecondStr;      FSecondEdit.Text := FSecondStr;
   except    except
     Result := False;      Result := False;
   end;    end;
 end;  end;
end; end;
   
//============================================================================= //=============================================================================
//  年,月,日の値(文字列)を取得 //  年,月,日の値(文字列)を取得
//  0: 元号の文字列 //  0: 元号の文字列
//  1: 元号の年 //  1: 元号の年
//  2: 西暦年 //  2: 西暦年
//  3: 月 //  3: 月
//  4: 日 //  4: 日
//  5: 時 //  5: 時
//  6: 分 //  6: 分
//  7: 秒 //  7: 秒
//============================================================================= //=============================================================================
function TplDateEdit.GetDateStr(Index: Integer): String; function TplDateEdit.GetDateStr(Index: Integer): String;
begin begin
 Result := '';  Result := '';
   
 if CheckDateError = False then begin  if CheckDateError = False then begin
   case Index of    case Index of
     0: Result := FGengoStr;      0: Result := FGengoStr;
     1: Result := FGengoYearStr;      1: Result := FGengoYearStr;
     2: Result := FYearStr;      2: Result := FYearStr;
     3: Result := FMonthStr;      3: Result := FMonthStr;
     4: Result := FDayStr;      4: Result := FDayStr;
     5: Result := FAmpmStr;      5: Result := FAmpmStr;
     6: Result := FHourStr;      6: Result := FHourStr;
     7: Result := FMinuteStr;      7: Result := FMinuteStr;
     8: Result := FSecondStr;      8: Result := FSecondStr;
   end;    end;
 end;  end;
end; end;
   
//============================================================================= //=============================================================================
//  年,月,日の値(整数値)を取得 //  年,月,日の値(整数値)を取得
//  1: 元号の年 //  1: 元号の年
//  2: 西暦年 //  2: 西暦年
//  3: 月 //  3: 月
//  4: 日 //  4: 日
//  5: 時 //  5: 時
//  6: 分 //  6: 分
//  7: 秒 //  7: 秒
//============================================================================= //=============================================================================
function TplDateEdit.GetDateInt(Index: Integer): Integer; function TplDateEdit.GetDateInt(Index: Integer): Integer;
begin begin
 Result := 0;  Result := 0;
   
 if CheckDateError = False then begin  if CheckDateError = False then begin
   case Index of    case Index of
     1: Result := FGengoYear;      1: Result := FGengoYear;
     2: Result := FYear;      2: Result := FYear;
     3: Result := FMonth;      3: Result := FMonth;
     4: Result := FDay;      4: Result := FDay;
     5: Result := FHour;      5: Result := FHour;
     6: Result := FMinute;      6: Result := FMinute;
     7: Result := FSecond;      7: Result := FSecond;
   end;    end;
 end;  end;
end; end;
   
//============================================================================= //=============================================================================
//  各入力値が空白かどうかを検出 //  各入力値が空白かどうかを検出
// //
//  使い方の例 //  使い方の例
// //
//  if plDateEdit1.IsEmpty then begin //  if plDateEdit1.IsEmpty then begin
//    //空白の時の処理 //    //空白の時の処理
//  end else bggin //  end else bggin
//    //入力した日付を取得して処理 //    //入力した日付を取得して処理
//    MyDate := plDateEdit1.Date; //    MyDate := plDateEdit1.Date;
//  end; //  end;
//============================================================================= //=============================================================================
function TplDateEdit.GetIsEmpty: Boolean; function TplDateEdit.GetIsEmpty: Boolean;
begin begin
 Result := False;  Result := False;
   
 if (FGengoCombo.Text = '') and  if (FGengoCombo.Text = '') and
    (FAmpmCombo .Text = '') and     (FAmpmCombo .Text = '') and
    (FYearEdit  .Text = '') and     (FYearEdit  .Text = '') and
    (FMonthEdit .Text = '') and     (FMonthEdit .Text = '') and
    (FDayEdit   .Text = '') and     (FDayEdit   .Text = '') and
    (FHourEdit  .Text = '') and     (FHourEdit  .Text = '') and
    (FMinuteEdit.Text = '') and     (FMinuteEdit.Text = '') and
    (FSecondEdit.Text = '') then Result := True;     (FSecondEdit.Text = '') then Result := True;
end; end;
   
//============================================================================= //=============================================================================
//  Fontプロパティが変更された時のメッセージの処理 //  Fontプロパティが変更された時のメッセージの処理
//  各コントロールのサイズ調整を実行 //  各コントロールのサイズ調整を実行
//============================================================================= //=============================================================================
procedure TplDateEdit.CMFontChanged(var Message: TWMNoParams); procedure TplDateEdit.CMFontChanged(var Message: TWMNoParams);
begin begin
 inherited;  inherited;
 SetControlResizePosition(False);  SetControlResizePosition(False);
end; end;
   
//============================================================================= //=============================================================================
//  TabStopプロパティの設定 //  TabStopプロパティの設定
//  元のTabStopをTrueにすると,[Tab]移動で最初のコントロールにフォーカスが移動 //  元のTabStopをTrueにすると,[Tab]移動で最初のコントロールにフォーカスが移動
//  しない.また[Shift]+[Tab]の移動もきかない. //  しない.また[Shift]+[Tab]の移動もきかない.
//============================================================================= //=============================================================================
procedure TplDateEdit.SetControlTabStop(const Value: Boolean); procedure TplDateEdit.SetControlTabStop(const Value: Boolean);
begin begin
 FTabStop := Value;  FTabStop := Value;
 inherited TabStop   := False;  inherited TabStop   := False;
         
 FGengoCombo.TabStop := FTabStop;  FGengoCombo.TabStop := FTabStop;
 FYearEdit.TabStop   := FTabStop;  FYearEdit.TabStop   := FTabStop;
 FMonthEdit.TabStop  := FTabStop;  FMonthEdit.TabStop  := FTabStop;
 FDayEdit.TabStop    := FTabStop;  FDayEdit.TabStop    := FTabStop;
 FAmpmCombo.TabStop  := FTabStop;  FAmpmCombo.TabStop  := FTabStop;
 FHourEdit.TabStop   := FTabStop;  FHourEdit.TabStop   := FTabStop;
 FMinuteEdit.TabStop := FTabStop;  FMinuteEdit.TabStop := FTabStop;
 FSecondEdit.TabStop := FTabStop;  FSecondEdit.TabStop := FTabStop;
end; end;
   
//============================================================================= //=============================================================================
//  このコンポはリサイズ不可とする //  このコンポはリサイズ不可とする
//============================================================================= //=============================================================================
function TplDateEdit.CanResize(var NewWidth, NewHeight: Integer): Boolean; function TplDateEdit.CanResize(var NewWidth, NewHeight: Integer): Boolean;
begin begin
 Result := False;  Result := False;
 if (FGengoCombo = nil) or (FAmpmCombo = nil) then exit;  if (FGengoCombo = nil) or (FAmpmCombo = nil) then exit;
 if (csReading in ComponentState) then exit;  if (csReading in ComponentState) then exit;
 if fgResize = False then begin  if fgResize = False then begin
   Result := False;    Result := False;
 end else begin  end else begin
   Result := True;    Result := True;
 end;  end;
end; end;
   
//============================================================================= //=============================================================================
//  このコンポにSetFocusしたら表示している左端のコントロールにフォーカス移動 //  このコンポにSetFocusしたら表示している左端のコントロールにフォーカス移動
// //
//  AWinControl  移動先のコントロール //  AWinControl  移動先のコントロール
//============================================================================= //=============================================================================
procedure TplDateEdit.SetControlFocus(AWinControl: TWinControl); procedure TplDateEdit.SetControlFocus(AWinControl: TWinControl);
begin begin
 if Enabled and Visible then begin  if Enabled and Visible then begin
   if AWinControl = nil then begin    if AWinControl = nil then begin
     if (FGengoCombo.Visible) and (FGengoCombo.Enabled) then begin      if (FGengoCombo.Visible) and (FGengoCombo.Enabled) then begin
       FGengoCombo.SetFocus;        FGengoCombo.SetFocus;
     end else      end else
     if (FYearEdit.Visible) and (FYearEdit.Enabled) then begin      if (FYearEdit.Visible) and (FYearEdit.Enabled) then begin
       FYearEdit.SetFocus;        FYearEdit.SetFocus;
     end else      end else
     if (FAmpmCombo.Visible) and (FAmpmCombo.Enabled) then begin      if (FAmpmCombo.Visible) and (FAmpmCombo.Enabled) then begin
       FAmpmCombo.SetFocus;        FAmpmCombo.SetFocus;
     end else begin      end else begin
       if (FHourEdit.Visible) and (FHourEdit.Enabled) then begin        if (FHourEdit.Visible) and (FHourEdit.Enabled) then begin
         FHourEdit.SetFocus;          FHourEdit.SetFocus;
       end;        end;
     end;      end;
   end else begin    end else begin
     if TWinControl(AWinControl).Visible and TWinControl(AWinControl).Enabled then begin      if TWinControl(AWinControl).Visible and TWinControl(AWinControl).Enabled then begin
       AWinControl.SetFocus;        AWinControl.SetFocus;
     end;      end;
   end;    end;
   FFocused := True;    FFocused := True;
 end;  end;
end; end;
   
//============================================================================= //=============================================================================
//  コンポのEnabledプロパティが変更された時にコンポ自身に送ってくる //  コンポのEnabledプロパティが変更された時にコンポ自身に送ってくる
//  Cm_EnabledChangedメッセージの処理. //  Cm_EnabledChangedメッセージの処理.
//  Enabled=True,Enabled=False(Disabled)に応じて入力用コントロールの背景色と文 //  Enabled=True,Enabled=False(Disabled)に応じて入力用コントロールの背景色と文
//  字色を変更する. //  字色を変更する.
//============================================================================= //=============================================================================
procedure TplDateEdit.CMEnabledChanged(var Message: TWMNoParams); procedure TplDateEdit.CMEnabledChanged(var Message: TWMNoParams);
begin begin
 inherited;  inherited;
 SetEditColor;  SetEditColor;
end; end;
   
//============================================================================= //=============================================================================
//  Colorプロパティが変更となった時の処理 //  Colorプロパティが変更となった時の処理
//  Colorプロパティは継承元のではなく,別に定義している. //  Colorプロパティは継承元のではなく,別に定義している.
//============================================================================= //=============================================================================
procedure TplDateEdit.SetControlColor(const Value: TColor); procedure TplDateEdit.SetControlColor(const Value: TColor);
begin begin
 if FColor <> Value then begin  if FColor <> Value then begin
   FColor := Value;    FColor := Value;
   SetEditColor;    SetEditColor;
 end;  end;
end; end;
   
//============================================================================= //=============================================================================
//  Enabledプロパティによってコントロールの背景色を変える //  Enabledプロパティによってコントロールの背景色を変える
//============================================================================= //=============================================================================
procedure TplDateEdit.SetEditColor; procedure TplDateEdit.SetEditColor;
begin begin
 if Enabled = False then begin  if Enabled = False then begin
   FGengoCombo.Enabled    := False;    FGengoCombo.Enabled    := False;
   FAmpmCombo.Enabled     := False;    FAmpmCombo.Enabled     := False;
   FGengoCombo.Color      := FDisableColor;    FGengoCombo.Color      := FDisableColor;
   FYearEdit.Color        := FDisableColor;    FYearEdit.Color        := FDisableColor;
   FMonthEdit.Color       := FDisableColor;    FMonthEdit.Color       := FDisableColor;
   FDayEdit.Color         := FDisableColor;    FDayEdit.Color         := FDisableColor;
   FHourEdit.Color        := FDisableColor;    FHourEdit.Color        := FDisableColor;
   FMinuteEdit.Color      := FDisableColor;    FMinuteEdit.Color      := FDisableColor;
   FSecondEdit.Color      := FDisableColor;    FSecondEdit.Color      := FDisableColor;
   
   FGengoCombo.Font.Color := FDisableFontColor;    FGengoCombo.Font.Color := FDisableFontColor;
   FYearEdit.Font.Color   := FDisableFontColor;    FYearEdit.Font.Color   := FDisableFontColor;
   FMonthEdit.Font.Color  := FDisableFontColor;    FMonthEdit.Font.Color  := FDisableFontColor;
   FDayEdit.Font.Color    := FDisableFontColor;    FDayEdit.Font.Color    := FDisableFontColor;
   FHourEdit.Font.Color   := FDisableFontColor;    FHourEdit.Font.Color   := FDisableFontColor;
   FMinuteEdit.Font.Color := FDisableFontColor;    FMinuteEdit.Font.Color := FDisableFontColor;
   FSecondEdit.Font.Color := FDisableFontColor;    FSecondEdit.Font.Color := FDisableFontColor;
 end else begin  end else begin
   FGengoCombo.Enabled    := True;    FGengoCombo.Enabled    := True;
   FGengoCombo.Color      := FColor;    FGengoCombo.Color      := FColor;
   FYearEdit.Color        := FColor;    FYearEdit.Color        := FColor;
   FMonthEdit.Color       := FColor;    FMonthEdit.Color       := FColor;
   FDayEdit.Color         := FColor;    FDayEdit.Color         := FColor;
   FHourEdit.Color        := FColor;    FHourEdit.Color        := FColor;
   FMinuteEdit.Color      := FColor;    FMinuteEdit.Color      := FColor;
   FSecondEdit.Color      := FColor;    FSecondEdit.Color      := FColor;
   
   FGengoCombo.Font.Color := Font.Color;    FGengoCombo.Font.Color := Font.Color;
   FYearEdit.Font.Color   := Font.Color;    FYearEdit.Font.Color   := Font.Color;
   FMonthEdit.Font.Color  := Font.Color;    FMonthEdit.Font.Color  := Font.Color;
   FDayEdit.Font.Color    := Font.Color;    FDayEdit.Font.Color    := Font.Color;
   FDayEdit.Font.Color    := Font.Color;    FDayEdit.Font.Color    := Font.Color;
   FHourEdit.Font.Color   := Font.Color;    FHourEdit.Font.Color   := Font.Color;
   FMinuteEdit.Font.Color := Font.Color;    FMinuteEdit.Font.Color := Font.Color;
   FSecondEdit.Font.Color := Font.Color;    FSecondEdit.Font.Color := Font.Color;
 end;  end;
end; end;
   
//============================================================================= //=============================================================================
//  EnabelプロパティがFalseの時の入力コントロールの背景色の設定 //  EnabelプロパティがFalseの時の入力コントロールの背景色の設定
//  Ver1.1で追加 //  Ver1.1で追加
//============================================================================= //=============================================================================
procedure TplDateEdit.SetDisableColor(const Value: TColor); procedure TplDateEdit.SetDisableColor(const Value: TColor);
begin begin
 if FDisableColor <> Value then begin  if FDisableColor <> Value then begin
   FDisableColor := Value;    FDisableColor := Value;
   SetEditColor;    SetEditColor;
 end;  end;
end; end;
   
//============================================================================= //=============================================================================
//  EnabledプロパティがFalseの時の入力コントロールの文字の色設定 //  EnabledプロパティがFalseの時の入力コントロールの文字の色設定
//  Ver1.1で追加 //  Ver1.1で追加
//============================================================================= //=============================================================================
procedure TplDateEdit.SetDisableFontColor(const Value: TColor); procedure TplDateEdit.SetDisableFontColor(const Value: TColor);
begin begin
 if FDisableFontColor <> Value then begin  if FDisableFontColor <> Value then begin
   FDisableFontColor := Value;    FDisableFontColor := Value;
   SetEditColor;    SetEditColor;
 end;  end;
end; end;
   
//============================================================================= //=============================================================================
//  フォーカスを受取った時の処理 //  フォーカスを受取った時の処理
//  コンポ自身のTabStopをFalseにしているので元号選択か年入力コントロールにフォ //  コンポ自身のTabStopをFalseにしているので元号選択か年入力コントロールにフォ
//  ーカスがくる. //  ーカスがくる.
//============================================================================= //=============================================================================
procedure TplDateEdit.WMSetFocus(var Message: TWMSetFocus); procedure TplDateEdit.WMSetFocus(var Message: TWMSetFocus);
begin begin
 inherited;  inherited;
 SetControlFocus(nil);  SetControlFocus(nil);
end; end;
   
//============================================================================= //=============================================================================
//  コントロールがActiveになったらテキストを選択状態に //  コントロールがActiveになったらテキストを選択状態に
//============================================================================= //=============================================================================
procedure TplDateEdit.EditEnter(Sender: TObject); procedure TplDateEdit.EditEnter(Sender: TObject);
begin begin
 fgTabStop := FTabStop;  fgTabStop := FTabStop;
         
 if fgTabStop = False then begin  if fgTabStop = False then begin
   FGengoCombo.TabStop := True;    FGengoCombo.TabStop := True;
   FYearEdit.TabStop   := True;    FYearEdit.TabStop   := True;
   FMonthEdit.TabStop  := True;    FMonthEdit.TabStop  := True;
   FDayEdit.TabStop    := True;    FDayEdit.TabStop    := True;
   FAmpmCombo.TabStop  := True;    FAmpmCombo.TabStop  := True;
   FHourEdit.TabStop   := True;    FHourEdit.TabStop   := True;
   FMinuteEdit.TabStop := True;    FMinuteEdit.TabStop := True;
   FSecondEdit.TabStop := True;    FSecondEdit.TabStop := True;
 end;  end;
   
 if Sender is TComboBox then begin  if Sender is TComboBox then begin
   if TComboBox(Sender).Visible then begin    if TComboBox(Sender).Visible then begin
     TComboBox(Sender).SetFocus;      TComboBox(Sender).SetFocus;
     TComboBox(Sender).Color := FFocusedColor;      TComboBox(Sender).Color := FFocusedColor;
     if FAutoSelect then TComboBox(Sender).SelectAll;      if FAutoSelect then TComboBox(Sender).SelectAll;
   end;    end;
 end;  end;
 if Sender is TplDateEditEdit then begin  if Sender is TplDateEditEdit then begin
   TplDateEditEdit(Sender).SetFocus;    TplDateEditEdit(Sender).SetFocus;
   TplDateEditEdit(Sender).Color := FFocusedColor;    TplDateEditEdit(Sender).Color := FFocusedColor;
   if FAutoSelect then begin    if FAutoSelect then begin
     TplDateEditEdit(Sender).SelectAll;      TplDateEditEdit(Sender).SelectAll;
   end else begin    end else begin
     TplDateEditEdit(Sender).SelStart := 0;      TplDateEditEdit(Sender).SelStart := 0;
   end;    end;
 end;  end;
 FFocused := True;  FFocused := True;
end; end;
   
//============================================================================= //=============================================================================
//  コントロールがActiveでなくなったら背景色を元に戻す //  コントロールがActiveでなくなったら背景色を元に戻す
//============================================================================= //=============================================================================
procedure TplDateEdit.EditExit(Sender: TObject); procedure TplDateEdit.EditExit(Sender: TObject);
begin begin
 if TComboBox(Sender).Visible then TComboBox(Sender).Color := FColor;  if TComboBox(Sender).Visible then TComboBox(Sender).Color := FColor;
 TplDateEditEdit(Sender).Color := FColor;  TplDateEditEdit(Sender).Color := FColor;
end; end;
   
//============================================================================= //=============================================================================
//  このコンポがActiveでなくなった場合 //  このコンポがActiveでなくなった場合
//  動作の検出としてはWM_KILLFOCUSがいいのであるが,このコンポでは,フォーカスが //  動作の検出としてはWM_KILLFOCUSがいいのであるが,このコンポでは,フォーカスが
//  移動してきた時に左端のコントロールにフォーカスを移動しているため,その時に //  移動してきた時に左端のコントロールにフォーカスを移動しているため,その時に
//  KillFocsuが発生してしまう. //  KillFocsuが発生してしまう.
//============================================================================= //=============================================================================
procedure TplDateEdit.DoExit; procedure TplDateEdit.DoExit;
begin begin
 inherited;  inherited;
   
 //コントロールの文字が選択状態の場合を考えて解除しておく  //コントロールの文字が選択状態の場合を考えて解除しておく
 FYearEdit.SelStart;  FYearEdit.SelStart;
 FMonthEdit.SelStart;  FMonthEdit.SelStart;
 FDayEdit.SelStart;  FDayEdit.SelStart;
 FHourEdit.SelStart;  FHourEdit.SelStart;
 FMinuteEdit.SelStart;  FMinuteEdit.SelStart;
 FSecondEdit.SelStart;  FSecondEdit.SelStart;
 if FExitCheck then CheckDateError;  if FExitCheck then CheckDateError;
 SetControlTabStop(fgTabStop);  SetControlTabStop(fgTabStop);
 FFocused := False;  FFocused := False;
end; end;
   
//============================================================================= //=============================================================================
//  元号のリストを表示したら背景色を変更 //  元号のリストを表示したら背景色を変更
//  コンボボックスのOnDropDownイベント //  コンボボックスのOnDropDownイベント
//  WindowsXPとそれよりも前のOSと動作をほぼ同じにするための //  WindowsXPとそれよりも前のOSと動作をほぼ同じにするための
//============================================================================= //=============================================================================
procedure TplDateEdit.GengoDropDown(Sender: TObject); procedure TplDateEdit.GengoDropDown(Sender: TObject);
begin begin
   TComboBox(Sender).Color := FFocusedColor;    TComboBox(Sender).Color := FFocusedColor;
end; end;
   
//============================================================================= //=============================================================================
//  元号選択コンボボックスのOnDrawItemイベント用 //  元号選択コンボボックスのOnDrawItemイベント用
//  FFcosedColorが白以外の時は,フォーカスの点線を描画しない //  FFcosedColorが白以外の時は,フォーカスの点線を描画しない
//  AutoSelect=Trueの場合でもコンボボツクスは選択状態にしない(削除以外は編集不 //  AutoSelect=Trueの場合でもコンボボツクスは選択状態にしない(削除以外は編集不
//  可なので) //  可なので)
//  備考 //  備考
//  コンボボックスのEdit部分に何も入力がない時は,このDrawItemは発生しない //  コンボボックスのEdit部分に何も入力がない時は,このDrawItemは発生しない
//============================================================================= //=============================================================================
procedure TplDateEdit.GengoDrawItem(Control: TWinControl; Index: Integer; procedure TplDateEdit.GengoDrawItem(Control: TWinControl; Index: Integer;
 Rect: TRect; State: TOwnerDrawState);  Rect: TRect; State: TOwnerDrawState);
begin begin
 with TComboBox(Control) do begin  with TComboBox(Control) do begin
   if (FAutoSelect = False) and (FFocusedColor <> clWhite) then begin    if (FAutoSelect = False) and (FFocusedColor <> clWhite) then begin
       //選択中        //選択中
       if odSelected in State then begin        if odSelected in State then begin
         //Edit部分          //Edit部分
         if odComboBoxEdit in State then begin          if odComboBoxEdit in State then begin
           Canvas.Brush.Style := bsClear;            Canvas.Brush.Style := bsClear;
         end else begin          end else begin
           Canvas.Brush.Color := FFocusedColor;            Canvas.Brush.Color := FFocusedColor;
         end;          end;
       end else        end else
       if odComboBoxEdit in State then begin        if odComboBoxEdit in State then begin
         Canvas.Brush.Style := bsClear;          Canvas.Brush.Style := bsClear;
       end else begin        end else begin
         Canvas.Brush.Color := FColor;          Canvas.Brush.Color := FColor;
       end;        end;
       Canvas.Font.Assign(Font);        Canvas.Font.Assign(Font);
   end;    end;
   Canvas.FillRect(Rect);    Canvas.FillRect(Rect);
   Rect.Left  := Rect.Left+2;    Rect.Left  := Rect.Left+2;
   DrawText(Canvas.Handle,    DrawText(Canvas.Handle,
            PChar(Items[Index]),             PChar(Items[Index]),
            -1,             -1,
            Rect,             Rect,
            DT_SINGLELINE or DT_VCENTER or DT_LEFT);             DT_SINGLELINE or DT_VCENTER or DT_LEFT);
 end;  end;
end; end;
   
//============================================================================= //=============================================================================
//  [TAB]キーをOnKeyDownイベントで処理可能にする //  [TAB]キーをOnKeyDownイベントで処理可能にする
//  外部からこのコンポを使用する際に必要 //  外部からこのコンポを使用する際に必要
//  これがないと,外部のプログラムで[Enter],[Tab]などの特殊キーを検出できない //  これがないと,外部のプログラムで[Enter],[Tab]などの特殊キーを検出できない
//============================================================================= //=============================================================================
procedure TplDateEdit.CMWantSpecialKey(var Msg: TMessage); procedure TplDateEdit.CMWantSpecialKey(var Msg: TMessage);
begin begin
 if Msg.WParam = VK_TAB then Msg.Result := 1;  if Msg.WParam = VK_TAB then Msg.Result := 1;
end; end;
   
//============================================================================= //=============================================================================
//  キー入力処理 //  キー入力処理
//  [Enter]はKeyDownで処理するので何もしない //  [Enter]はKeyDownで処理するので何もしない
//  英字は入力できない. #8は[BackSpace]. #27は[Escape] //  英字は入力できない. #8は[BackSpace]. #27は[Escape]
//============================================================================= //=============================================================================
procedure TplDateEdit.EditKeyPress(Sender: TObject; procedure TplDateEdit.EditKeyPress(Sender: TObject;
 var Key: Char);  var Key: Char);
begin begin
 if Assigned(FOnKeyPress) then FOnKeyPress(Sender, Key);  if Assigned(FOnKeyPress) then FOnKeyPress(Sender, Key);
 if Key = #13 then begin  if Key = #13 then begin
   Key := #0;    Key := #0;
 end else begin  end else begin
   if (Sender is TplDateEditEdit) then begin    if (Sender is TplDateEditEdit) then begin
     if ((Key >= '0') and (Key <= '9')) or (Key = #8) or (Key = #27) then begin      if ((Key >= '0') and (Key <= '9')) or (Key = #8) or (Key = #27) then begin
       inherited KeyPress(Key);        inherited KeyPress(Key);
     end else begin      end else begin
       Key := #0;        Key := #0;
     end;      end;
   end else if (Sender is TComboBox) then begin    end else if (Sender is TComboBox) then begin
     if (Key = #8) or (Key = #27) then begin      if (Key = #8) or (Key = #27) then begin
       inherited KeyPress(Key);        inherited KeyPress(Key);
     end else begin      end else begin
       Key := #0;        Key := #0;
     end;      end;
   end else begin    end else begin
     Key := #0;      Key := #0;
   end;    end;
 end;  end;
end; end;
   
{$IFDEF CONDITIONALEXPRESSIONS}   
{$IF RTLVersion >= 24.0}   
function TplDateEdit.FormatDateTime(const Format: string;  
 DateTime: TDateTime): string;  
begin  
 Result := System.SysUtils.FormatDateTime(Format, DateTime, FFormatSettings);  
end;  
{$IFEND}   
{$ENDIF}   
   
//============================================================================= //=============================================================================
//  各種キー押下の処理 //  各種キー押下の処理
//  [DELETE]で元号部の文字をクリア可能にした(Ver1.1) //  [DELETE]で元号部の文字をクリア可能にした(Ver1.1)
// //
//  [Tab]はこのコンポを使用するアプリでCMDialogKeyを定義すると機能しなくなって //  [Tab]はこのコンポを使用するアプリでCMDialogKeyを定義すると機能しなくなって
//  しまう. //  しまう.
// //
//  いままでのコード //  いままでのコード
//  keybd_event( VK_TAB, 0, 0 , 0 ); //  keybd_event( VK_TAB, 0, 0 , 0 );
//  keybd_event( VK_TAB, 0, KEYEVENTF_KEYUP , 0 ); //  keybd_event( VK_TAB, 0, KEYEVENTF_KEYUP , 0 );
//  このコードは[Tab],[Shift]+[Tab],[Enter],[Shift]+[Enter]の全ての処理が実行で //  このコードは[Tab],[Shift]+[Tab],[Enter],[Shift]+[Enter]の全ての処理が実行で
//  きて便利ではあったのだが... //  きて便利ではあったのだが...
// //
//  新しいコードはFindNextControlを使用 //  新しいコードはFindNextControlを使用
//  これだと[Tab]が検出できないので,新たにCM_WantSpeialKeyイベント追加して //  これだと[Tab]が検出できないので,新たにCM_WantSpeialKeyイベント追加して
//  if Key=VK_TAB を処理(Ver1.2) //  if Key=VK_TAB を処理(Ver1.2)
//  Ver1.2ではこの他に,OnKeyPress,OnKeyDownイベントの公開,Focusedプロパティを //  Ver1.2ではこの他に,OnKeyPress,OnKeyDownイベントの公開,Focusedプロパティを
//  追加した. //  追加した.
//============================================================================= //=============================================================================
procedure TplDateEdit.EditKeyDown(Sender: TObject; var Key: Word; procedure TplDateEdit.EditKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);  Shift: TShiftState);
begin begin
 if Assigned(FOnKeyDown) then FOnKeyDown(Sender, Key, Shift);  if Assigned(FOnKeyDown) then FOnKeyDown(Sender, Key, Shift);
   
 //コンボボックス[Enter]で選択決定  //コンボボックス[Enter]で選択決定
 if Key = VK_RETURN then begin  if Key = VK_RETURN then begin
   if TComboBox(Sender).Visible then TComboBox(Sender).DroppedDown := False;    if TComboBox(Sender).Visible then TComboBox(Sender).DroppedDown := False;
   //次のタブコントロールに移動    //次のタブコントロールに移動
   if FEnterNext then begin    if FEnterNext then begin
     if (ssShift in Shift) then begin      if (ssShift in Shift) then begin
       keybd_event( VK_TAB,   0, 0, 0 );        keybd_event( VK_TAB,   0, 0, 0 );
       keybd_event( VK_SHIFT, 0, 0, 0 );        keybd_event( VK_SHIFT, 0, 0, 0 );
       keybd_event( VK_TAB,   0, KEYEVENTF_KEYUP , 0 );        keybd_event( VK_TAB,   0, KEYEVENTF_KEYUP , 0 );
       keybd_event( VK_SHIFT, 0, KEYEVENTF_KEYUP , 0 );        keybd_event( VK_SHIFT, 0, KEYEVENTF_KEYUP , 0 );
     end else begin      end else begin
       keybd_event( VK_TAB, 0, 0 , 0 );        keybd_event( VK_TAB, 0, 0 , 0 );
       keybd_event( VK_TAB, 0, KEYEVENTF_KEYUP , 0 );        keybd_event( VK_TAB, 0, KEYEVENTF_KEYUP , 0 );
     end;      end;
   end;    end;
 end else if Key = VK_TAB then begin  end else if Key = VK_TAB then begin
   if (ssShift in Shift) then begin    if (ssShift in Shift) then begin
     TWinControl(FindNextControl(TWinControl(Sender), False, True, True)).Setfocus;      TWinControl(FindNextControl(TWinControl(Sender), False, True, True)).Setfocus;
   end else begin    end else begin
     TWinControl(FindNextControl(TWinControl(Sender), True, True, True)).Setfocus;      TWinControl(FindNextControl(TWinControl(Sender), True, True, True)).Setfocus;
   end;    end;
 //↓でコンボのドロップダウンリストを表示  //↓でコンボのドロップダウンリストを表示
 end else if Key = VK_DOWN then begin  end else if Key = VK_DOWN then begin
   if FDropDownKey then begin    if FDropDownKey then begin
     if TComboBox(Sender).Visible then begin      if TComboBox(Sender).Visible then begin
       if (TComboBox(Sender).DroppedDown = False) then begin        if (TComboBox(Sender).DroppedDown = False) then begin
         Key := 0;          Key := 0;
         TComboBox(Sender).DroppedDown := True;          TComboBox(Sender).DroppedDown := True;
       end;        end;
     end;      end;
   end;    end;
 end else if Key = VK_DELETE then begin  end else if Key = VK_DELETE then begin
   if Sender is TComboBox then begin    if Sender is TComboBox then begin
     if TComboBox(Sender).Text <> '' then begin      if TComboBox(Sender).Text <> '' then begin
       TComboBox(Sender).ItemIndex := -1;        TComboBox(Sender).ItemIndex := -1;
       if Assigned(FOnChange) then FOnChange(Sender);        if Assigned(FOnChange) then FOnChange(Sender);
     end else begin      end else begin
       TComboBox(Sender).ItemIndex := -1;        TComboBox(Sender).ItemIndex := -1;
     end;      end;
   end;    end;
 end;  end;
   
 inherited;  inherited;
end; end;
   
//============================================================================= //=============================================================================
//   各入力コントロールのOnChangeイベントハンドラ //   各入力コントロールのOnChangeイベントハンドラ
//============================================================================= //=============================================================================
procedure TplDateEdit.EditChange(Sender: TObject); procedure TplDateEdit.EditChange(Sender: TObject);
begin begin
 if Assigned(FOnChange) then FOnChange(Sender);  if Assigned(FOnChange) then FOnChange(Sender);
end; end;
   
//============================================================================= //=============================================================================
//  各入力コントロールのOnClickイベントハンドラ //  各入力コントロールのOnClickイベントハンドラ
//  OnEnterのイベントを定義するとこのOnClickは発生しない //  OnEnterのイベントを定義するとこのOnClickは発生しない
//  (他のコンポーネントと同じ.知りませんでした) //  (他のコンポーネントと同じ.知りませんでした)
//============================================================================= //=============================================================================
procedure TplDateEdit.EditClick(Sender: TObject); procedure TplDateEdit.EditClick(Sender: TObject);
begin begin
 if Assigned(FOnClick) then FOnClick(Sender);  if Assigned(FOnClick) then FOnClick(Sender);
end; end;
   
//============================================================================= //=============================================================================
//  年齢の計算 //  年齢の計算
// //
//  一般的に我々がいう年齢は,誕生日に達した日に加算される //  一般的に我々がいう年齢は,誕生日に達した日に加算される
//  (5月5日生まれの人は次の年の5月5日の午前0時に1つ加算.午前0時は前日の午後12 //  (5月5日生まれの人は次の年の5月5日の午前0時に1つ加算.午前0時は前日の午後12
//  時). //  時).
// //
//  ところが,各法律で「満年齢に達した日」の解釈が違っている. //  ところが,各法律で「満年齢に達した日」の解釈が違っている.
// //
//  法的に年齢計算の仕方を定めているのは「民法」と「年齢計算に関する法律」.民 //  法的に年齢計算の仕方を定めているのは「民法」と「年齢計算に関する法律」.民
//   法では期間を計算するのに, //   法では期間を計算するのに,
//  (1)月,年などである一定の期間を定めた場合は起算日は算入しない //  (1)月,年などである一定の期間を定めた場合は起算日は算入しない
//  (2)起算日の前日で期間を満了とする //  (2)起算日の前日で期間を満了とする
//  年齢は例外として「出生の日よりこれを起算する」となっている. //  年齢は例外として「出生の日よりこれを起算する」となっている.
// //
//  例えば,学校教育法では,4月1日生まれの人が1学年に行くのは「子女の満六歳に達 //  例えば,学校教育法では,4月1日生まれの人が1学年に行くのは「子女の満六歳に達
//  した日の翌日以後における最初の学年の初めから」と定められている(法律の文章 //  した日の翌日以後における最初の学年の初めから」と定められている(法律の文章
//  は難しい!!).つまり,4月1日生まれの子供は,3月31日の午後12時に1年経過して満1 //  は難しい!!).つまり,4月1日生まれの子供は,3月31日の午後12時に1年経過して満1
//  才となるため,次の学年となる. //  才となるため,次の学年となる.
// //
//  また,公職選挙法では,選挙権は満20歳以上の人に認められている.7月29日が投票日 //  また,公職選挙法では,選挙権は満20歳以上の人に認められている.7月29日が投票日
//  の場合,「満20年に達する日が終了したことを要せず,満20年に達する日を含む」で //  の場合,「満20年に達する日が終了したことを要せず,満20年に達する日を含む」で
//  あり「満20年に達する日をもって選挙権取得の始期を定めた」とみなし,20歳にな //  あり「満20年に達する日をもって選挙権取得の始期を定めた」とみなし,20歳にな
//  る午後12時を含めたその日全部が取得の日だとしている.つまり,「投票日の7月29 //  る午後12時を含めたその日全部が取得の日だとしている.つまり,「投票日の7月29
//  日の午後12時に満20歳になる7月30日生まれの人まで」(投票時点ではまだ19歳の人 //  日の午後12時に満20歳になる7月30日生まれの人まで」(投票時点ではまだ19歳の人
//  が含まれる)となる. //  が含まれる)となる.
// //
//  厚生年金法でも,「誕生日」という言葉ではなく「4月1日に生まれた者が65歳にな //  厚生年金法でも,「誕生日」という言葉ではなく「4月1日に生まれた者が65歳にな
//  るのは3月31日」である」という書き方をしている. //  るのは3月31日」である」という書き方をしている.
//  つまり,法律的には誕生日の前日に満年齢に達したとみなされる //  つまり,法律的には誕生日の前日に満年齢に達したとみなされる
// //
//  老人保健法では,70歳の誕生日の属する月の翌月(但し1日が誕生日の者はその月)か //  老人保健法では,70歳の誕生日の属する月の翌月(但し1日が誕生日の者はその月)か
//  らの適用となっている. //  らの適用となっている.
// //
//  そこで,このメソッドではどちらにも対応可能なように,引数AgeTypeの値によって //  そこで,このメソッドではどちらにも対応可能なように,引数AgeTypeの値によって
//  計算する年齢と月を変更可能なようにした. //  計算する年齢と月を変更可能なようにした.
// //
//  AgeType=0 現在の年齢(世間一般でいう年齢) //  AgeType=0 現在の年齢(世間一般でいう年齢)
//  AgeType=1 現在までの期間(誕生日の前日に加齢) //  AgeType=1 現在までの期間(誕生日の前日に加齢)
//============================================================================= //=============================================================================
function TplDateEdit.GetAge(Date1, Date2: TDateTime; AgeType: Integer; function TplDateEdit.GetAge(Date1, Date2: TDateTime; AgeType: Integer;
 var gAge, gMonth: Integer): Boolean;  var gAge, gMonth: Integer): Boolean;
var var
 Year1  : WORD;  Year1  : WORD;
 Month1 : WORD;  Month1 : WORD;
 Day1   : WORD;  Day1   : WORD;
 Year2  : WORD;  Year2  : WORD;
 Month2 : WORD;  Month2 : WORD;
 Day2   : WORD;  Day2   : WORD;
begin begin
 Result := True;  Result := True;
 try  try
   DecodeDate (Date1, Year1, Month1, Day1);    DecodeDate (Date1, Year1, Month1, Day1);
   DecodeDate (Date2, Year2, Month2, Day2);    DecodeDate (Date2, Year2, Month2, Day2);
   //AgeType=0  通常の年齢    //AgeType=0  通常の年齢
   if (AgeType = 0)  then begin    if (AgeType = 0)  then begin
     if (Day1 > Day2) then Dec(Month2);      if (Day1 > Day2) then Dec(Month2);
   //AgeType=1  経過年月    //AgeType=1  経過年月
   end else begin    end else begin
     if (Month2 = 12) then begin      if (Month2 = 12) then begin
       if (Day2 = 31)then begin        if (Day2 = 31)then begin
         Inc(Year2);          Inc(Year2);
         Month2 := 1;          Month2 := 1;
         Day2   := 0;          Day2   := 0;
       end;        end;
     end else if Date2 = EncodeDate(Year2, Month2 + 1, 1) - 1 then begin      end else if Date2 = EncodeDate(Year2, Month2 + 1, 1) - 1 then begin
       Inc(Month2);        Inc(Month2);
       Day2 := 0 ;        Day2 := 0 ;
     end;      end;
     if Day1>Day2 + 1 then Dec(Month2);      if Day1>Day2 + 1 then Dec(Month2);
   end;    end;
   gMonth := Month2-Month1;    gMonth := Month2-Month1;
   gAge := Year2 - Year1;    gAge := Year2 - Year1;
   if (gMonth >= -12) and (gMonth <= -1) then begin    if (gMonth >= -12) and (gMonth <= -1) then begin
     Dec(gAge);      Dec(gAge);
     gMonth := 12 + gMonth;      gMonth := 12 + gMonth;
   end;    end;
   if gAge < 0 then begin    if gAge < 0 then begin
     Result := False;      Result := False;
     gAge   := 0;      gAge   := 0;
     gMonth := 0;      gMonth := 0;
   end;    end;
 except  except
   Result := False;    Result := False;
   gAge   := 0;    gAge   := 0;
   gMonth := 0;    gMonth := 0;
 end;  end;
end; end;
   
{ TplDBDateEdit }  { TplDBDateEdit }
   
//============================================================================= //=============================================================================
//  以下のコードはTAKさんに作成して頂いたコードをほぼそのまま利用. //  以下のコードはTAKさんに作成して頂いたコードをほぼそのまま利用.
//  begin~end; の間のコードのインデント //  begin~end; の間のコードのインデント
//  if then begin else のスタイル //  if then begin else のスタイル
//  等をMr.XRAY方式スタイルに変更 //  等をMr.XRAY方式スタイルに変更
//  このコードの追加にはだいぶ迷った.同一コンポーネントにデータベース対応部分 //  このコードの追加にはだいぶ迷った.同一コンポーネントにデータベース対応部分
//  を追加するか,別のコンポーネントにするか.結局,別コンポーネントとすることに //  を追加するか,別のコンポーネントにするか.結局,別コンポーネントとすることに
//  した. //  した.
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
//  データベース対応コンポーネント生成 //  データベース対応コンポーネント生成
//============================================================================= //=============================================================================
constructor TplDBDateEdit.Create(AOwner: TComponent); constructor TplDBDateEdit.Create(AOwner: TComponent);
begin begin
 inherited;  inherited;
         
 FDataLink := TFieldDataLink.Create;  FDataLink := TFieldDataLink.Create;
 FDataLink.Control := Self;  FDataLink.Control := Self;
 FDataLink.OnDataChange := DataChange;  FDataLink.OnDataChange := DataChange;
 FDataLink.OnUpdateData := UpdateData;  FDataLink.OnUpdateData := UpdateData;
 IsEdit := False;  IsEdit := False;
end; end;
   
//============================================================================= //=============================================================================
//  コンポーネントの破棄 //  コンポーネントの破棄
//============================================================================= //=============================================================================
destructor TplDBDateEdit.Destroy; destructor TplDBDateEdit.Destroy;
begin begin
 FreeAndNil(FDataLink);  FreeAndNil(FDataLink);
 inherited;  inherited;
end; end;
//============================================================================= //=============================================================================
//  データソース破棄時の処理 //  データソース破棄時の処理
//============================================================================= //=============================================================================
procedure TplDBDateEdit.Notification(AComponent: TComponent; procedure TplDBDateEdit.Notification(AComponent: TComponent;
 Operation: TOperation);  Operation: TOperation);
begin begin
 if (Operation = opRemove) and (FDataLink <> nil) and  if (Operation = opRemove) and (FDataLink <> nil) and
    (AComponent = DataSource) then begin     (AComponent = DataSource) then begin
    FDataLink.DataSource := nil;     FDataLink.DataSource := nil;
 end;  end;
end; end;
   
//============================================================================= //=============================================================================
//  データソースの設定 //  データソースの設定
//============================================================================= //=============================================================================
procedure TplDBDateEdit.SetDataSource(const Value: TDataSource); procedure TplDBDateEdit.SetDataSource(const Value: TDataSource);
begin begin
 if FDataLink.DataSource <> Value then begin  if FDataLink.DataSource <> Value then begin
   FDataLink.DataSource := Value;    FDataLink.DataSource := Value;
   //データソースの破棄通知を登録する    //データソースの破棄通知を登録する
   if Value <> nil then Value.FreeNotification(Self);    if Value <> nil then Value.FreeNotification(Self);
 end;  end;
end; end;
   
//============================================================================= //=============================================================================
//  データソースの取得 //  データソースの取得
//============================================================================= //=============================================================================
function TplDBDateEdit.GetDataSource: TDataSource; function TplDBDateEdit.GetDataSource: TDataSource;
begin begin
 Result := FDataLink.DataSource;  Result := FDataLink.DataSource;
end; end;
   
//============================================================================= //=============================================================================
//  データフィールドの設定 //  データフィールドの設定
//============================================================================= //=============================================================================
procedure TplDBDateEdit.SetDataField(const Value: string); procedure TplDBDateEdit.SetDataField(const Value: string);
begin begin
 FDataLink.FieldName := Value;  FDataLink.FieldName := Value;
end; end;
   
//============================================================================= //=============================================================================
//  データフィールドの取得 //  データフィールドの取得
//============================================================================= //=============================================================================
function TplDBDateEdit.GetDataField: string; function TplDBDateEdit.GetDataField: string;
begin begin
 Result := FDataLink.FieldName;  Result := FDataLink.FieldName;
end; end;
   
//============================================================================= //=============================================================================
//  ReadOnlyプロパティのセット //  ReadOnlyプロパティのセット
//  データリンクの ReadOnlyプロパティに書込むだけ //  データリンクの ReadOnlyプロパティに書込むだけ
//============================================================================= //=============================================================================
procedure TplDBDateEdit.SetReadOnly(const Value: Boolean); procedure TplDBDateEdit.SetReadOnly(const Value: Boolean);
begin begin
 FDataLink.ReadOnly := Value;  FDataLink.ReadOnly := Value;
end; end;
   
//============================================================================= //=============================================================================
//  ReadOnlyプロパティの取得 //  ReadOnlyプロパティの取得
//  データリンクの ReadOnlyプロパティを読むだけ //  データリンクの ReadOnlyプロパティを読むだけ
//============================================================================= //=============================================================================
function TplDBDateEdit.GetReadOnly: Boolean; function TplDBDateEdit.GetReadOnly: Boolean;
begin begin
 Result := FDataLink.ReadOnly;  Result := FDataLink.ReadOnly;
end; end;
   
//============================================================================= //=============================================================================
//  OnDataChange イベントの処理 //  OnDataChange イベントの処理
//  コンポのDateTimeプロパティ値をフィールドの値から取得する //  コンポのDateTimeプロパティ値をフィールドの値から取得する
//============================================================================= //=============================================================================
procedure TplDBDateEdit.DataChange(Sender: TObject); procedure TplDBDateEdit.DataChange(Sender: TObject);
var var
 AField : TField;  AField : TField;
begin begin
 //書込み中は読込まない  //書込み中は読込まない
 if IsEdit then exit;  if IsEdit then exit;
   
 AField := FindField;  AField := FindField;
 if Assigned(AField) then begin  if Assigned(AField) then begin
   if AField.IsNull then begin    if AField.IsNull then begin
     SetEditEmpty;      SetEditEmpty;
   end else begin    end else begin
     DateTime := AField.AsDateTime;      DateTime := AField.AsDateTime;
   end;    end;
 end;  end;
end; end;
   
//============================================================================= //=============================================================================
//  フォーカスを失ったらフィールドにデータを書込む //  フォーカスを失ったらフィールドにデータを書込む
//  DBGridなどでセルを移動した時にPostしているのと同じ動作 //  DBGridなどでセルを移動した時にPostしているのと同じ動作
//============================================================================= //=============================================================================
procedure TplDBDateEdit.DoExit; procedure TplDBDateEdit.DoExit;
var var
 AField : TField;  AField : TField;
begin begin
 inherited;  inherited;
   
 AField := FindField;  AField := FindField;
 if Assigned(AField) then begin  if Assigned(AField) then begin
   if DateTime <> AField.AsDateTime then begin    if DateTime <> AField.AsDateTime then begin
     //読込みを禁止するフラグ      //読込みを禁止するフラグ
     IsEdit := True;      IsEdit := True;
     FDataLink.DataSet.Edit;      FDataLink.DataSet.Edit;
     if CanEmpty and IsEmpty then begin      if CanEmpty and IsEmpty then begin
       AField.Value := null;        AField.Value := null;
     end else begin      end else begin
       AField.AsDateTime := DateTime;        AField.AsDateTime := DateTime;
     end;      end;
     //書込む終了      //書込む終了
     IsEdit := False;      IsEdit := False;
     //データを更新      //データを更新
     FDataLink.Reset;      FDataLink.Reset;
   end;    end;
 end;  end;
end; end;
   
//============================================================================= //=============================================================================
//  動作を確実にするためにフィールドを検索 //  動作を確実にするためにフィールドを検索
//  ここで取得したフィールドにアクセスする //  ここで取得したフィールドにアクセスする
//============================================================================= //=============================================================================
function TplDBDateEdit.FindField: TField; function TplDBDateEdit.FindField: TField;
begin begin
 Result := nil;  Result := nil;
 if (FDataLink.FieldName <> '') and Assigned(FDataLink.DataSet) then begin  if (FDataLink.FieldName <> '') and Assigned(FDataLink.DataSet) then begin
   Result := FDataLink.DataSet.FindField(FDataLink.FieldName);    Result := FDataLink.DataSet.FindField(FDataLink.FieldName);
 end;  end;
end; end;
   
//============================================================================= //=============================================================================
//  各コントロールのOnKeyPressイベントの処理 //  各コントロールのOnKeyPressイベントの処理
//  ReadOnly=Trueの時はキー入力を受付けない //  ReadOnly=Trueの時はキー入力を受付けない
//  [Tab][Entr][Shift]などOnKeyDownで処理するキーは受付ける //  [Tab][Entr][Shift]などOnKeyDownで処理するキーは受付ける
//============================================================================= //=============================================================================
procedure TplDBDateEdit.EditKeyPress(Sender: TObject; var Key: Char); procedure TplDBDateEdit.EditKeyPress(Sender: TObject; var Key: Char);
begin begin
 if not FDataLink.CanModify then Key := #0;  if not FDataLink.CanModify then Key := #0;
 inherited;  inherited;
end; end;
   
//============================================================================= //=============================================================================
//  各コントロールのOnKeyDownイベントの処理 //  各コントロールのOnKeyDownイベントの処理
//============================================================================= //=============================================================================
procedure TplDBDateEdit.EditKeyDown(Sender: TObject; var Key: Word; procedure TplDBDateEdit.EditKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);  Shift: TShiftState);
begin begin
 //ESCキーが押されたらフィールド値の編集をキャンセル  //ESCキーが押されたらフィールド値の編集をキャンセル
 if Key = VK_ESCAPE then begin  if Key = VK_ESCAPE then begin
   FDatalink.Reset;    FDatalink.Reset;
   Key := 0;    Key := 0;
 end;  end;
 if not FDataLink.CanModify then Key := 0;  if not FDataLink.CanModify then Key := 0;
   
 inherited;  inherited;
end; end;
   
//============================================================================= //=============================================================================
//  入力コントロールの内容に変更があった場合(OnChageイベントが発生)した場合), //  入力コントロールの内容に変更があった場合(OnChageイベントが発生)した場合),
//  DataSetがEditモードならUpdateDateイベントを呼出して変更をレコードに反映. //  DataSetがEditモードならUpdateDateイベントを呼出して変更をレコードに反映.
//  これがないと,フォーカスを失った時しかレコードの更新ができない //  これがないと,フォーカスを失った時しかレコードの更新ができない
//  (他のデータベース対応コントロールと動作が違ってしまう) //  (他のデータベース対応コントロールと動作が違ってしまう)
//============================================================================= //=============================================================================
procedure TplDBDateEdit.EditChange(Sender: TObject); procedure TplDBDateEdit.EditChange(Sender: TObject);
begin begin
 //ReadOnly=Trueの時はコンボボックスによる選択は無効にする  //ReadOnly=Trueの時はコンボボックスによる選択は無効にする
 //年月日の入力はキー入力そのものを無効にしている  //年月日の入力はキー入力そのものを無効にしている
 if FDataLink.Field = nil then begin  if FDataLink.Field = nil then begin
   SetEditEmpty;    SetEditEmpty;
 end else if not FDataLink.CanModify then begin  end else if not FDataLink.CanModify then begin
   if Sender is TComboBox then begin    if Sender is TComboBox then begin
     FDataLink.Reset;      FDataLink.Reset;
   end;    end;
 end else begin  end else begin
   inherited;    inherited;
   if FDataLink.Edit then FDataLink.Modified;    if FDataLink.Edit then FDataLink.Modified;
 end;  end;
end; end;
   
//============================================================================= //=============================================================================
//  OnUpdateイベントのハンドラ //  OnUpdateイベントのハンドラ
//============================================================================= //=============================================================================
procedure TplDBDateEdit.UpdateData(Sender: TObject); procedure TplDBDateEdit.UpdateData(Sender: TObject);
begin begin
 if CanEmpty and IsEmpty then begin  if CanEmpty and IsEmpty then begin
   FDataLink.Field.Value := null;    FDataLink.Field.Value := null;
 end else begin  end else begin
   FDataLink.Field.AsDateTime := DateTime;    FDataLink.Field.AsDateTime := DateTime;
 end;  end;
end; end;
   
//============================================================================= //=============================================================================
//   コンポーネント登録情報 //   コンポーネント登録情報
//============================================================================= //=============================================================================
procedure Register; procedure Register;
begin begin
 RegisterComponents('plXRAY', [TplDateEdit]);  RegisterComponents('plXRAY', [TplDateEdit]);
 RegisterComponents('plXRAY', [TplDBDateEdit]);  RegisterComponents('plXRAY', [TplDBDateEdit]);
end; end;
   
//============================================================================= //=============================================================================
//  コード終了 //  コード終了
//============================================================================= //=============================================================================
end. end.