| [459] | 1 | unit ORDtTm;
 | 
|---|
 | 2 | 
 | 
|---|
 | 3 | {$O-}
 | 
|---|
 | 4 | 
 | 
|---|
 | 5 | interface
 | 
|---|
 | 6 | 
 | 
|---|
 | 7 | uses
 | 
|---|
 | 8 |   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons,
 | 
|---|
 | 9 |   Grids, Calendar, ExtCtrls, ORFn, ORNet, ORDtTmCal, Mask, ComCtrls, ORCtrls;
 | 
|---|
 | 10 | 
 | 
|---|
 | 11 | type
 | 
|---|
 | 12 |   TORfrmDtTm = class(TForm)
 | 
|---|
 | 13 |     bvlFrame: TBevel;
 | 
|---|
 | 14 |     lblDate: TPanel;
 | 
|---|
 | 15 |     txtTime: TEdit;
 | 
|---|
 | 16 |     lstHour: TListBox;
 | 
|---|
 | 17 |     lstMinute: TListBox;
 | 
|---|
 | 18 |     cmdOK: TButton;
 | 
|---|
 | 19 |     cmdCancel: TButton;
 | 
|---|
 | 20 |     calSelect: TORCalendar;
 | 
|---|
 | 21 |     pnlPrevMonth: TPanel;
 | 
|---|
 | 22 |     pnlNextMonth: TPanel;
 | 
|---|
 | 23 |     imgPrevMonth: TImage;
 | 
|---|
 | 24 |     imgNextMonth: TImage;
 | 
|---|
 | 25 |     bvlRButton: TBevel;
 | 
|---|
 | 26 |     cmdToday: TButton;
 | 
|---|
 | 27 |     cmdNow: TButton;
 | 
|---|
 | 28 |     cmdMidnight: TButton;
 | 
|---|
 | 29 |     procedure FormCreate(Sender: TObject);
 | 
|---|
 | 30 |     procedure calSelectChange(Sender: TObject);
 | 
|---|
 | 31 |     procedure cmdTodayClick(Sender: TObject);
 | 
|---|
 | 32 |     procedure txtTimeChange(Sender: TObject);
 | 
|---|
 | 33 |     procedure lstHourClick(Sender: TObject);
 | 
|---|
 | 34 |     procedure lstMinuteClick(Sender: TObject);
 | 
|---|
 | 35 |     procedure cmdNowClick(Sender: TObject);
 | 
|---|
 | 36 |     procedure cmdOKClick(Sender: TObject);
 | 
|---|
 | 37 |     procedure cmdCancelClick(Sender: TObject);
 | 
|---|
 | 38 |     procedure imgPrevMonthClick(Sender: TObject);
 | 
|---|
 | 39 |     procedure imgNextMonthClick(Sender: TObject);
 | 
|---|
 | 40 |     procedure imgPrevMonthMouseDown(Sender: TObject; Button: TMouseButton;
 | 
|---|
 | 41 |       Shift: TShiftState; X, Y: Integer);
 | 
|---|
 | 42 |     procedure imgNextMonthMouseDown(Sender: TObject; Button: TMouseButton;
 | 
|---|
 | 43 |       Shift: TShiftState; X, Y: Integer);
 | 
|---|
 | 44 |     procedure imgPrevMonthMouseUp(Sender: TObject; Button: TMouseButton;
 | 
|---|
 | 45 |       Shift: TShiftState; X, Y: Integer);
 | 
|---|
 | 46 |     procedure imgNextMonthMouseUp(Sender: TObject; Button: TMouseButton;
 | 
|---|
 | 47 |       Shift: TShiftState; X, Y: Integer);
 | 
|---|
 | 48 |     procedure cmdMidnightClick(Sender: TObject);
 | 
|---|
 | 49 |   private
 | 
|---|
 | 50 |     FFromSelf: Boolean;
 | 
|---|
 | 51 |     FNowPressed:  Boolean;
 | 
|---|
 | 52 |     TimeIsRequired: Boolean;
 | 
|---|
 | 53 |   end;
 | 
|---|
 | 54 | 
 | 
|---|
 | 55 |   { TORDateTimeDlg }
 | 
|---|
 | 56 | 
 | 
|---|
 | 57 |   TORDateTimeDlg = class(TComponent)
 | 
|---|
 | 58 |   private
 | 
|---|
 | 59 |     FDateTime:     TDateTime;
 | 
|---|
 | 60 |     FDateOnly:     Boolean;
 | 
|---|
 | 61 |     FRequireTime:  Boolean;
 | 
|---|
 | 62 |     FRelativeTime: string;
 | 
|---|
 | 63 |     function GetFMDateTime: TFMDateTime;
 | 
|---|
 | 64 |     procedure SetDateOnly(Value: Boolean);
 | 
|---|
 | 65 |     procedure SetFMDateTime(Value: TFMDateTime);
 | 
|---|
 | 66 |     procedure SetRequireTime(Value: Boolean);
 | 
|---|
 | 67 |   public
 | 
|---|
 | 68 |     constructor Create(AOwner: TComponent); override;
 | 
|---|
 | 69 |     function Execute: Boolean;
 | 
|---|
 | 70 |     property RelativeTime: string     read FRelativeTime;
 | 
|---|
 | 71 |   published
 | 
|---|
 | 72 |     property FMDateTime:  TFMDateTime read GetFMDateTime   write SetFMDateTime;
 | 
|---|
 | 73 |     property DateOnly:    Boolean     read FDateOnly       write SetDateOnly;
 | 
|---|
 | 74 |     property RequireTime: Boolean     read FRequireTime    write SetRequireTime;
 | 
|---|
 | 75 |   end;
 | 
|---|
 | 76 | 
 | 
|---|
 | 77 |   { TORDateBox }
 | 
|---|
 | 78 | 
 | 
|---|
 | 79 |   TORDateEdit = class(TEdit)
 | 
|---|
 | 80 |   protected
 | 
|---|
 | 81 |     procedure CreateParams(var Params: TCreateParams); override;
 | 
|---|
 | 82 |   end;
 | 
|---|
 | 83 | 
 | 
|---|
 | 84 |   TORDateBox = class(TORDateEdit)
 | 
|---|
 | 85 |   private
 | 
|---|
 | 86 |     FFMDateTime: TFMDateTime;
 | 
|---|
 | 87 |     FDateOnly: Boolean;
 | 
|---|
 | 88 |     FRequireTime: Boolean;
 | 
|---|
 | 89 |     FButton: TBitBtn;
 | 
|---|
 | 90 |     FFormat: string;
 | 
|---|
 | 91 |     FTimeIsNow: Boolean;
 | 
|---|
 | 92 |     FTemplateField: boolean;
 | 
|---|
 | 93 |     FCaption: TStaticText;
 | 
|---|
 | 94 |     procedure ButtonClick(Sender: TObject);
 | 
|---|
 | 95 |     function GetFMDateTime: TFMDateTime;
 | 
|---|
 | 96 |     function GetRelativeTime: string;
 | 
|---|
 | 97 |     procedure SetDateOnly(Value: Boolean);
 | 
|---|
 | 98 |     procedure SetFMDateTime(Value: TFMDateTime);
 | 
|---|
 | 99 |     procedure SetEditRect;
 | 
|---|
 | 100 |     procedure SetRequireTime(Value: Boolean);
 | 
|---|
 | 101 |     procedure UpdateText;
 | 
|---|
 | 102 |     procedure WMSize(var Message: TWMSize); message WM_SIZE;
 | 
|---|
 | 103 |     procedure SetTemplateField(const Value: boolean);
 | 
|---|
 | 104 |     procedure SetCaption(const Value: string);
 | 
|---|
 | 105 |     function  GetCaption(): string;
 | 
|---|
 | 106 |                                                              
 | 
|---|
 | 107 |   protected
 | 
|---|
 | 108 |     procedure Change; override;
 | 
|---|
 | 109 |     procedure KeyDown(var Key: Word; Shift: TShiftState); override;
 | 
|---|
 | 110 |   public
 | 
|---|
 | 111 |     constructor Create(AOwner: TComponent); override;
 | 
|---|
 | 112 |     function IsValid: Boolean;
 | 
|---|
 | 113 |     procedure Validate(var ErrMsg: string);
 | 
|---|
 | 114 |     property Format: string read FFormat write FFormat;
 | 
|---|
 | 115 |     property RelativeTime: string     read GetRelativeTime;
 | 
|---|
 | 116 |     property TemplateField: boolean read FTemplateField write SetTemplateField;
 | 
|---|
 | 117 |   published
 | 
|---|
 | 118 |     property FMDateTime:  TFMDateTime read GetFMDateTime  write SetFMDateTime;
 | 
|---|
 | 119 |     property DateOnly:    Boolean     read FDateOnly    write SetDateOnly;
 | 
|---|
 | 120 |     property RequireTime: Boolean     read FRequireTime write SetRequireTime;
 | 
|---|
 | 121 |     property Caption: string read GetCaption write SetCaption;
 | 
|---|
 | 122 |   end;
 | 
|---|
 | 123 | 
 | 
|---|
 | 124 |   TORDateCombo = class(TCustomPanel)
 | 
|---|
 | 125 |   private
 | 
|---|
 | 126 |     FYearChanging: boolean;
 | 
|---|
 | 127 |     FMonthCombo: TORComboBox;
 | 
|---|
 | 128 |     FDayCombo: TORComboBox;
 | 
|---|
 | 129 |     FYearEdit: TMaskEdit;
 | 
|---|
 | 130 |     FYearUD: TUpDown;
 | 
|---|
 | 131 |     FCalBtn: TSpeedButton;
 | 
|---|
 | 132 |     FIncludeMonth: boolean;
 | 
|---|
 | 133 |     FIncludeDay: boolean;
 | 
|---|
 | 134 |     FIncludeBtn: boolean;
 | 
|---|
 | 135 |     FLongMonths: boolean;
 | 
|---|
 | 136 |     FMonth: integer;
 | 
|---|
 | 137 |     FDay: integer;
 | 
|---|
 | 138 |     FYear: integer;
 | 
|---|
 | 139 |     FCtrlsCreated: boolean;
 | 
|---|
 | 140 |     FOnChange: TNotifyEvent;
 | 
|---|
 | 141 |     FRebuilding: boolean;
 | 
|---|
 | 142 |     FTemplateField: boolean;
 | 
|---|
 | 143 |     procedure SetIncludeBtn(const Value: boolean);
 | 
|---|
 | 144 |     procedure SetIncludeDay(Value: boolean);
 | 
|---|
 | 145 |     procedure SetIncludeMonth(const Value: boolean);
 | 
|---|
 | 146 |     procedure SetLongMonths(const Value: boolean);
 | 
|---|
 | 147 |     procedure SetDay(Value: integer);
 | 
|---|
 | 148 |     procedure SetMonth(Value: integer);
 | 
|---|
 | 149 |     procedure SetYear(const Value: integer);
 | 
|---|
 | 150 |     function GetFMDate: TFMDateTime;
 | 
|---|
 | 151 |     procedure SetFMDate(const Value: TFMDateTime);
 | 
|---|
 | 152 |     procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
 | 
|---|
 | 153 |     procedure SetTemplateField(const Value: boolean);
 | 
|---|
 | 154 |   protected
 | 
|---|
 | 155 |     procedure Rebuild;
 | 
|---|
 | 156 |     function InitDays(GetSize: boolean): integer;
 | 
|---|
 | 157 |     function InitMonths(GetSize: boolean): integer;
 | 
|---|
 | 158 |     function GetYearSize: integer;
 | 
|---|
 | 159 |     procedure DoChange;
 | 
|---|
 | 160 |     procedure MonthChanged(Sender: TObject);
 | 
|---|
 | 161 |     procedure DayChanged(Sender: TObject);
 | 
|---|
 | 162 |     procedure YearChanged(Sender: TObject);
 | 
|---|
 | 163 |     procedure BtnClicked(Sender: TObject);
 | 
|---|
 | 164 |     procedure YearUDChange(Sender: TObject; var AllowChange: Boolean;
 | 
|---|
 | 165 |                            NewValue: Smallint; Direction: TUpDownDirection);
 | 
|---|
 | 166 |     procedure YearKeyPress(Sender: TObject; var Key: Char);
 | 
|---|
 | 167 |     procedure CheckDays;
 | 
|---|
 | 168 |     procedure Loaded; override;
 | 
|---|
 | 169 |     procedure Paint; override;
 | 
|---|
 | 170 |     procedure Resized(Sender: TObject);
 | 
|---|
 | 171 |   public
 | 
|---|
 | 172 |     constructor Create(AOwner: TComponent); override;
 | 
|---|
 | 173 |     destructor Destroy; override;
 | 
|---|
 | 174 |     function DateText: string;
 | 
|---|
 | 175 |     property TemplateField: boolean read FTemplateField write SetTemplateField;
 | 
|---|
 | 176 |     property FMDate: TFMDateTime read GetFMDate write SetFMDate;
 | 
|---|
 | 177 |   published
 | 
|---|
 | 178 |     function Text: string;
 | 
|---|
 | 179 |     property IncludeBtn: boolean read FIncludeBtn write SetIncludeBtn;
 | 
|---|
 | 180 |     property IncludeDay: boolean read FIncludeDay write SetIncludeDay;
 | 
|---|
 | 181 |     property IncludeMonth: boolean read FIncludeMonth write SetIncludeMonth;
 | 
|---|
 | 182 |     property LongMonths: boolean read FLongMonths write SetLongMonths default FALSE;
 | 
|---|
 | 183 |     property Month: integer read FMonth write SetMonth;
 | 
|---|
 | 184 |     property Day: integer read FDay write SetDay;
 | 
|---|
 | 185 |     property Year: integer read FYear write SetYear;
 | 
|---|
 | 186 |     property OnChange: TNotifyEvent read FOnChange write FOnChange;
 | 
|---|
 | 187 |     property Anchors;
 | 
|---|
 | 188 |     property Enabled;
 | 
|---|
 | 189 |     property Font;
 | 
|---|
 | 190 |     property ParentColor;
 | 
|---|
 | 191 |     property ParentFont;
 | 
|---|
 | 192 |     property TabOrder;
 | 
|---|
 | 193 |     property TabStop;
 | 
|---|
 | 194 |     property Visible;
 | 
|---|
 | 195 |   end;
 | 
|---|
 | 196 | 
 | 
|---|
 | 197 | function IsLeapYear(AYear: Integer): Boolean;
 | 
|---|
 | 198 | function DaysPerMonth(AYear, AMonth: Integer): Integer;
 | 
|---|
 | 199 | 
 | 
|---|
 | 200 | procedure Register;
 | 
|---|
 | 201 | 
 | 
|---|
 | 202 | implementation
 | 
|---|
 | 203 | 
 | 
|---|
 | 204 | {$R *.DFM}
 | 
|---|
 | 205 | {$R ORDtTm}
 | 
|---|
 | 206 | 
 | 
|---|
 | 207 | const
 | 
|---|
 | 208 |   FMT_DATETIME = 'mmm d,yyyy@hh:nn';
 | 
|---|
 | 209 |   FMT_DATEONLY = 'mmm d,yyyy';
 | 
|---|
 | 210 |   (*
 | 
|---|
 | 211 |   HOURS_AMPM: array[0..23] of string[3] =
 | 
|---|
 | 212 |     ('12a','  1','  2','  3','  4','  5','  6','  7','  8','  9','10 ','11 ',
 | 
|---|
 | 213 |      '12p','  1','  2','  3','  4','  5','  6','  7','  8','  9','10 ','11 ');
 | 
|---|
 | 214 |   HOURS_MIL:  array[0..23] of string[2] =
 | 
|---|
 | 215 |     ('00','01','02','03','04','05','06','07','08','09','10','11',
 | 
|---|
 | 216 |      '12','13','14','15','16','17','18','19','20','21','22','23');
 | 
|---|
 | 217 |   *)
 | 
|---|
 | 218 |   AdjVertSize = 8;
 | 
|---|
 | 219 |   FontHeightText = 'BEFHILMSTVWXZfgjmpqtyk';
 | 
|---|
 | 220 | 
 | 
|---|
 | 221 | var
 | 
|---|
 | 222 |   uServerToday: TFMDateTime;
 | 
|---|
 | 223 | 
 | 
|---|
 | 224 | { Server-dependent functions ---------------------------------------------------------------- }
 | 
|---|
 | 225 | 
 | 
|---|
 | 226 | function ActiveBroker: Boolean;
 | 
|---|
 | 227 | begin
 | 
|---|
 | 228 |   Result := False;
 | 
|---|
 | 229 |   if (RPCBrokerV <> nil) and RPCBrokerV.Connected then Result := True;
 | 
|---|
 | 230 | end;
 | 
|---|
 | 231 | 
 | 
|---|
 | 232 | function ServerFMNow: TFMDateTime;
 | 
|---|
 | 233 | begin
 | 
|---|
 | 234 |   if ActiveBroker
 | 
|---|
 | 235 |     then Result := StrToFloat(sCallV('ORWU DT', ['NOW']))
 | 
|---|
 | 236 |     else Result := DateTimeToFMDateTime(Now);
 | 
|---|
 | 237 | end;
 | 
|---|
 | 238 | 
 | 
|---|
 | 239 | function ServerNow: TDateTime;
 | 
|---|
 | 240 | begin
 | 
|---|
 | 241 |   if ActiveBroker
 | 
|---|
 | 242 |     then Result := FMDateTimeToDateTime(ServerFMNow)
 | 
|---|
 | 243 |     else Result := Now;
 | 
|---|
 | 244 | end;
 | 
|---|
 | 245 | 
 | 
|---|
 | 246 | function ServerToday: TDateTime;
 | 
|---|
 | 247 | begin
 | 
|---|
 | 248 |   if uServerToday = 0 then uServerToday := Int(ServerFMNow);
 | 
|---|
 | 249 |   Result := FMDateTimeToDateTime(uServerToday);
 | 
|---|
 | 250 | end;
 | 
|---|
 | 251 | 
 | 
|---|
 | 252 | (*
 | 
|---|
 | 253 | function ServerFMToday: TFMDateTime;    // never referenced in this unit
 | 
|---|
 | 254 | begin
 | 
|---|
 | 255 |   if uServerToday = 0 then uServerToday := Int(ServerFMNow);
 | 
|---|
 | 256 |   Result := uServerToday;
 | 
|---|
 | 257 | end;
 | 
|---|
 | 258 | *)
 | 
|---|
 | 259 | 
 | 
|---|
 | 260 | function ServerParseFMDate(const AString: string): TFMDateTime;
 | 
|---|
 | 261 | begin
 | 
|---|
 | 262 |   if ActiveBroker
 | 
|---|
 | 263 |     then Result := StrToFloat(sCallV('ORWU DT', [AString, 'TSX']))
 | 
|---|
 | 264 |     else Result := 0;
 | 
|---|
 | 265 | end;
 | 
|---|
 | 266 | 
 | 
|---|
 | 267 | function RelativeDateTime(ADateTime: TDateTime): string;
 | 
|---|
 | 268 | var
 | 
|---|
 | 269 |   Offset: Integer;
 | 
|---|
 | 270 |   h,n,s,l: Word;
 | 
|---|
 | 271 |   ATime: string;
 | 
|---|
 | 272 | begin
 | 
|---|
 | 273 |   Offset := Trunc(Int(ADateTime) - Int(ServerToday));
 | 
|---|
 | 274 |   if Offset < 0 then Result := 'T' + IntToStr(Offset)
 | 
|---|
 | 275 |   else if Offset = 0 then Result := 'T'
 | 
|---|
 | 276 |   else Result := 'T+' + IntToStr(Offset);
 | 
|---|
 | 277 |   DecodeTime(ADateTime, h, n, s, l);
 | 
|---|
 | 278 |   ATime := Format('@%.2d:%.2d', [h, n]);
 | 
|---|
 | 279 |   if ATime <> '@00:00' then Result := Result + ATime;
 | 
|---|
 | 280 | end;
 | 
|---|
 | 281 | 
 | 
|---|
 | 282 | { TfrmORDtTm -------------------------------------------------------------------------------- }
 | 
|---|
 | 283 | 
 | 
|---|
 | 284 | procedure TORfrmDtTm.FormCreate(Sender: TObject);
 | 
|---|
 | 285 | begin
 | 
|---|
 | 286 |   ResizeAnchoredFormToFont(self);
 | 
|---|
| [460] | 287 |   //FormStyle := fsStayOnTop;
 | 
|---|
| [459] | 288 |   lstHour.TopIndex := 6;
 | 
|---|
 | 289 |   FFromSelf := False;
 | 
|---|
 | 290 |   calSelectChange(Self);
 | 
|---|
 | 291 | end;
 | 
|---|
 | 292 | 
 | 
|---|
 | 293 | procedure TORfrmDtTm.calSelectChange(Sender: TObject);
 | 
|---|
 | 294 | begin
 | 
|---|
 | 295 |   lblDate.Caption := FormatDateTime('mmmm d, yyyy', calSelect.CalendarDate);
 | 
|---|
 | 296 |   FNowPressed := False;
 | 
|---|
 | 297 | end;
 | 
|---|
 | 298 | 
 | 
|---|
 | 299 | procedure TORfrmDtTm.imgPrevMonthMouseDown(Sender: TObject;
 | 
|---|
 | 300 |   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 | 
|---|
 | 301 | begin
 | 
|---|
 | 302 |   pnlPrevMonth.BevelOuter := bvLowered;
 | 
|---|
 | 303 | end;
 | 
|---|
 | 304 | 
 | 
|---|
 | 305 | procedure TORfrmDtTm.imgNextMonthMouseDown(Sender: TObject;
 | 
|---|
 | 306 |   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 | 
|---|
 | 307 | begin
 | 
|---|
 | 308 |   pnlNextMonth.BevelOuter := bvLowered;
 | 
|---|
 | 309 | end;
 | 
|---|
 | 310 | 
 | 
|---|
 | 311 | procedure TORfrmDtTm.imgPrevMonthClick(Sender: TObject);
 | 
|---|
 | 312 | begin
 | 
|---|
 | 313 |   calSelect.PrevMonth;
 | 
|---|
 | 314 | end;
 | 
|---|
 | 315 | 
 | 
|---|
 | 316 | procedure TORfrmDtTm.imgNextMonthClick(Sender: TObject);
 | 
|---|
 | 317 | begin
 | 
|---|
 | 318 |   calSelect.NextMonth;
 | 
|---|
 | 319 | end;
 | 
|---|
 | 320 | 
 | 
|---|
 | 321 | procedure TORfrmDtTm.imgPrevMonthMouseUp(Sender: TObject;
 | 
|---|
 | 322 |   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 | 
|---|
 | 323 | begin
 | 
|---|
 | 324 |   pnlPrevMonth.BevelOuter := bvRaised;
 | 
|---|
 | 325 | end;
 | 
|---|
 | 326 | 
 | 
|---|
 | 327 | procedure TORfrmDtTm.imgNextMonthMouseUp(Sender: TObject;
 | 
|---|
 | 328 |   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 | 
|---|
 | 329 | begin
 | 
|---|
 | 330 |    pnlNextMonth.BevelOuter := bvRaised;
 | 
|---|
 | 331 | end;
 | 
|---|
 | 332 | 
 | 
|---|
 | 333 | procedure TORfrmDtTm.cmdTodayClick(Sender: TObject);
 | 
|---|
 | 334 | begin
 | 
|---|
 | 335 |   calSelect.CalendarDate := ServerToday;
 | 
|---|
 | 336 |   lstHour.ItemIndex := -1;
 | 
|---|
 | 337 |   lstMinute.ItemIndex := -1;
 | 
|---|
 | 338 |   txtTime.Text := '';
 | 
|---|
 | 339 | end;
 | 
|---|
 | 340 | 
 | 
|---|
 | 341 | procedure TORfrmDtTm.txtTimeChange(Sender: TObject);
 | 
|---|
 | 342 | begin
 | 
|---|
 | 343 |   if not FFromSelf then
 | 
|---|
 | 344 |   begin
 | 
|---|
 | 345 |     lstHour.ItemIndex := -1;
 | 
|---|
 | 346 |     lstMinute.ItemIndex := -1;
 | 
|---|
 | 347 |   end;
 | 
|---|
 | 348 |   FNowPressed := False;
 | 
|---|
 | 349 | end;
 | 
|---|
 | 350 | 
 | 
|---|
 | 351 | procedure TORfrmDtTm.lstHourClick(Sender: TObject);
 | 
|---|
 | 352 | begin
 | 
|---|
 | 353 |   if lstMinute.ItemIndex < 0 then lstMinute.ItemIndex := 0;
 | 
|---|
 | 354 |   lstMinuteClick(Self);
 | 
|---|
 | 355 | end;
 | 
|---|
 | 356 | 
 | 
|---|
 | 357 | procedure TORfrmDtTm.lstMinuteClick(Sender: TObject);
 | 
|---|
 | 358 | var
 | 
|---|
 | 359 |   AnHour, AMinute: Integer;
 | 
|---|
 | 360 | //  AmPm: string;
 | 
|---|
 | 361 | begin
 | 
|---|
 | 362 |   if lstHour.ItemIndex < 0 then Exit;
 | 
|---|
 | 363 | 
 | 
|---|
 | 364 |   // if ampm time -
 | 
|---|
 | 365 |   //case lstHour.ItemIndex of
 | 
|---|
 | 366 |   //    0: AnHour := 12;
 | 
|---|
 | 367 |   //1..12: AnHour := lstHour.ItemIndex;
 | 
|---|
 | 368 |   //else   AnHour := lstHour.ItemIndex - 12;
 | 
|---|
 | 369 |   //end;
 | 
|---|
 | 370 |   //if lstHour.ItemIndex > 11 then AmPm := 'PM' else AmPm := 'AM';
 | 
|---|
 | 371 | 
 | 
|---|
 | 372 |   // if military time
 | 
|---|
 | 373 |   AnHour := lstHour.ItemIndex;
 | 
|---|
 | 374 | 
 | 
|---|
 | 375 |   AMinute := lstMinute.ItemIndex * 5;
 | 
|---|
 | 376 |   FFromSelf := True;
 | 
|---|
 | 377 |   // if ampm time -
 | 
|---|
 | 378 |   //txtTime.Text := Format('%d:%.2d ' + AmPm, [AnHour, AMinute]);
 | 
|---|
 | 379 | 
 | 
|---|
 | 380 |   // if military time
 | 
|---|
 | 381 |   txtTime.Text := Format('%.2d:%.2d ', [AnHour, AMinute]);
 | 
|---|
 | 382 | 
 | 
|---|
 | 383 |   FFromSelf := False;
 | 
|---|
 | 384 | end;
 | 
|---|
 | 385 | 
 | 
|---|
 | 386 | procedure TORfrmDtTm.cmdNowClick(Sender: TObject);
 | 
|---|
 | 387 | begin
 | 
|---|
 | 388 |   calSelect.CalendarDate := ServerToday;
 | 
|---|
 | 389 |   //txtTime.Text := FormatDateTime('h:nn ampm', ServerNow);  // if ampm time
 | 
|---|
 | 390 |   txtTime.Text := FormatDateTime('hh:nn', ServerNow);        // if ampm time
 | 
|---|
 | 391 |   FNowPressed := True;
 | 
|---|
 | 392 | end;
 | 
|---|
 | 393 | 
 | 
|---|
 | 394 | procedure TORfrmDtTm.cmdMidnightClick(Sender: TObject);
 | 
|---|
 | 395 | begin
 | 
|---|
 | 396 |   //txtTime.Text := '11:59 PM';  // if ampm time
 | 
|---|
 | 397 |   txtTime.Text := '23:59';      // if military time
 | 
|---|
 | 398 | end;
 | 
|---|
 | 399 | 
 | 
|---|
 | 400 | procedure TORfrmDtTm.cmdOKClick(Sender: TObject);
 | 
|---|
 | 401 | var
 | 
|---|
 | 402 |   x: string;
 | 
|---|
 | 403 | begin
 | 
|---|
 | 404 |   if TimeIsRequired and (Length(txtTime.Text) = 0) then
 | 
|---|
 | 405 |   begin
 | 
|---|
 | 406 |     InfoBox('An entry for time is required.', 'Missing Time', MB_OK);
 | 
|---|
 | 407 |     Exit;
 | 
|---|
 | 408 |   end;
 | 
|---|
 | 409 |   if Length(txtTime.Text) > 0 then
 | 
|---|
 | 410 |   begin
 | 
|---|
 | 411 |     x := Trim(txtTime.Text);
 | 
|---|
 | 412 |     if (x='00:00') or (x='0:00') or (x='00:00:00') or (x='0:00:00') then x := '00:00:01';
 | 
|---|
 | 413 |     StrToTime(x);
 | 
|---|
 | 414 |     txtTime.Text := x;
 | 
|---|
 | 415 |   end;
 | 
|---|
 | 416 |   ModalResult := mrOK;
 | 
|---|
 | 417 | end;
 | 
|---|
 | 418 | 
 | 
|---|
 | 419 | procedure TORfrmDtTm.cmdCancelClick(Sender: TObject);
 | 
|---|
 | 420 | begin
 | 
|---|
 | 421 |   ModalResult := mrCancel;
 | 
|---|
 | 422 | end;
 | 
|---|
 | 423 | 
 | 
|---|
 | 424 | { TORDateTimeDlg }
 | 
|---|
 | 425 | 
 | 
|---|
 | 426 | constructor TORDateTimeDlg.Create(AOwner: TComponent);
 | 
|---|
 | 427 | begin
 | 
|---|
 | 428 |   inherited Create(AOwner);
 | 
|---|
 | 429 |   if not (csDesigning in ComponentState)
 | 
|---|
 | 430 |     then FDateTime := ServerToday
 | 
|---|
 | 431 |     else FDateTime  := SysUtils.Date;
 | 
|---|
 | 432 | end;
 | 
|---|
 | 433 | 
 | 
|---|
 | 434 | function TORDateTimeDlg.Execute: Boolean;
 | 
|---|
 | 435 | const
 | 
|---|
 | 436 |   HORZ_SPACING = 8;
 | 
|---|
 | 437 | var
 | 
|---|
 | 438 |   frmDtTm: TORfrmDtTm;
 | 
|---|
 | 439 | begin
 | 
|---|
 | 440 |   frmDtTm := TORfrmDtTm.Create(Application);
 | 
|---|
 | 441 |   try
 | 
|---|
 | 442 |     with frmDtTm do
 | 
|---|
 | 443 |     begin
 | 
|---|
 | 444 |       calSelect.CalendarDate := Int(FDateTime);
 | 
|---|
 | 445 |       if Frac(FDateTime) > 0
 | 
|---|
 | 446 |         //then txtTime.Text := FormatDateTime('h:nn ampm', FDateTime);  // if ampm time
 | 
|---|
 | 447 |         then txtTime.Text := FormatDateTime('hh:nn', FDateTime);        // if military time
 | 
|---|
 | 448 |       if RequireTime then TimeIsRequired := True;
 | 
|---|
 | 449 |       if DateOnly then
 | 
|---|
 | 450 |       begin
 | 
|---|
 | 451 |         txtTime.Visible     := False;
 | 
|---|
 | 452 |         lstHour.Visible     := False;
 | 
|---|
 | 453 |         lstMinute.Visible   := False;
 | 
|---|
 | 454 |         cmdNow.Visible      := False;
 | 
|---|
 | 455 |         cmdMidnight.Visible := False;
 | 
|---|
 | 456 |         bvlFrame.Width := bvlFrame.Width - txtTime.Width - HORZ_SPACING;
 | 
|---|
 | 457 |         cmdOK.Left := cmdOK.Left - txtTime.Width - HORZ_SPACING;
 | 
|---|
 | 458 |         cmdCancel.Left := cmdOK.Left;
 | 
|---|
 | 459 |         ClientWidth := ClientWidth - txtTime.Width - HORZ_SPACING;
 | 
|---|
 | 460 |       end;
 | 
|---|
 | 461 |       Result := (ShowModal = IDOK);
 | 
|---|
 | 462 |       if Result then
 | 
|---|
 | 463 |       begin
 | 
|---|
 | 464 |         FDateTime := Int(calSelect.CalendarDate);
 | 
|---|
 | 465 |         if Length(txtTime.Text) > 0 then FDateTime := FDateTime + StrToTime(txtTime.Text);
 | 
|---|
 | 466 |         if FNowPressed
 | 
|---|
 | 467 |           then FRelativeTime := 'NOW'
 | 
|---|
 | 468 |           else FRelativeTime := RelativeDateTime(FDateTime);
 | 
|---|
 | 469 |       end;
 | 
|---|
 | 470 |     end;
 | 
|---|
 | 471 |   finally
 | 
|---|
 | 472 |     frmDtTm.Free;
 | 
|---|
 | 473 |   end;
 | 
|---|
 | 474 | end;
 | 
|---|
 | 475 | 
 | 
|---|
 | 476 | function TORDateTimeDlg.GetFMDateTime: TFMDateTime;
 | 
|---|
 | 477 | begin
 | 
|---|
 | 478 |   Result := DateTimeToFMDateTime(FDateTime);
 | 
|---|
 | 479 | end;
 | 
|---|
 | 480 | 
 | 
|---|
 | 481 | procedure TORDateTimeDlg.SetDateOnly(Value: Boolean);
 | 
|---|
 | 482 | begin
 | 
|---|
 | 483 |   FDateOnly := Value;
 | 
|---|
 | 484 |   if FDateOnly then
 | 
|---|
 | 485 |   begin
 | 
|---|
 | 486 |     FRequireTime := False;
 | 
|---|
 | 487 |     FDateTime := Int(FDateTime);
 | 
|---|
 | 488 |   end;
 | 
|---|
 | 489 | end;
 | 
|---|
 | 490 | 
 | 
|---|
 | 491 | procedure TORDateTimeDlg.SetFMDateTime(Value: TFMDateTime);
 | 
|---|
 | 492 | begin
 | 
|---|
 | 493 |   if Value > 0 then FDateTime := FMDateTimeToDateTime(Value);
 | 
|---|
 | 494 | end;
 | 
|---|
 | 495 | 
 | 
|---|
 | 496 | procedure TORDateTimeDlg.SetRequireTime(Value: Boolean);
 | 
|---|
 | 497 | begin
 | 
|---|
 | 498 |   FRequireTime := Value;
 | 
|---|
 | 499 |   if FRequireTime then FDateOnly := False;
 | 
|---|
 | 500 | end;
 | 
|---|
 | 501 | 
 | 
|---|
 | 502 | { TORDateEdit ----------------------------------------------------------------------------- }
 | 
|---|
 | 503 | 
 | 
|---|
 | 504 | procedure TORDateEdit.CreateParams(var Params: TCreateParams);
 | 
|---|
 | 505 | { sets a one line edit box to multiline style so the editing rectangle can be changed }
 | 
|---|
 | 506 | begin
 | 
|---|
 | 507 |   inherited CreateParams(Params);
 | 
|---|
 | 508 |   Params.Style := Params.Style or ES_MULTILINE or WS_CLIPCHILDREN;
 | 
|---|
 | 509 | end;
 | 
|---|
 | 510 | 
 | 
|---|
 | 511 | 
 | 
|---|
 | 512 | { TORDateBox -------------------------------------------------------------------------------- }
 | 
|---|
 | 513 | 
 | 
|---|
 | 514 | constructor TORDateBox.Create(AOwner: TComponent);
 | 
|---|
 | 515 | begin
 | 
|---|
 | 516 |   inherited Create(AOwner);
 | 
|---|
 | 517 |   FButton := TBitBtn.Create(Self);
 | 
|---|
 | 518 |   FButton.Parent := Self;
 | 
|---|
 | 519 |   FButton.Width := 18;
 | 
|---|
 | 520 |   FButton.Height := 17;
 | 
|---|
 | 521 |   FButton.OnClick := ButtonClick;
 | 
|---|
 | 522 |   FButton.TabStop := False;
 | 
|---|
 | 523 |   FButton.Glyph.LoadFromResourceName(hInstance, 'BMP_ELLIPSIS');
 | 
|---|
 | 524 |   FButton.Visible := True;
 | 
|---|
 | 525 |   FFormat := FMT_DATETIME;
 | 
|---|
 | 526 | end;
 | 
|---|
 | 527 | 
 | 
|---|
 | 528 | procedure TORDateBox.WMSize(var Message: TWMSize);
 | 
|---|
 | 529 | var
 | 
|---|
 | 530 |   ofs: integer;
 | 
|---|
 | 531 | 
 | 
|---|
 | 532 | begin
 | 
|---|
 | 533 |   inherited;
 | 
|---|
 | 534 |   if assigned(FButton) then
 | 
|---|
 | 535 |   begin
 | 
|---|
 | 536 |     if BorderStyle = bsNone then
 | 
|---|
 | 537 |       ofs := 0
 | 
|---|
 | 538 |     else
 | 
|---|
 | 539 |       ofs := 4;
 | 
|---|
 | 540 |     FButton.SetBounds(Width - FButton.Width - ofs, 0, FButton.Width, Height - ofs);
 | 
|---|
 | 541 |   end;
 | 
|---|
 | 542 |   SetEditRect;
 | 
|---|
 | 543 | end;
 | 
|---|
 | 544 | 
 | 
|---|
 | 545 | procedure TORDateBox.SetTemplateField(const Value: boolean);
 | 
|---|
 | 546 | var
 | 
|---|
 | 547 |   Y: integer;
 | 
|---|
 | 548 | 
 | 
|---|
 | 549 | begin
 | 
|---|
 | 550 |   if(FTemplateField <> Value) then
 | 
|---|
 | 551 |   begin
 | 
|---|
 | 552 |     FTemplateField := Value;
 | 
|---|
 | 553 |     Y := TextHeightByFont(Font.Handle, FontHeightText);
 | 
|---|
 | 554 |     if Value then
 | 
|---|
 | 555 |     begin
 | 
|---|
 | 556 |       FButton.Width := Y+2;
 | 
|---|
 | 557 |       Height := Y;
 | 
|---|
 | 558 |       BorderStyle := bsNone;
 | 
|---|
 | 559 |     end
 | 
|---|
 | 560 |     else
 | 
|---|
 | 561 |     begin
 | 
|---|
 | 562 |       FButton.Width := 18;
 | 
|---|
 | 563 |       Height := y + AdjVertSize;
 | 
|---|
 | 564 |       BorderStyle := bsSingle;
 | 
|---|
 | 565 |     end;
 | 
|---|
 | 566 |   end;
 | 
|---|
 | 567 | end;
 | 
|---|
 | 568 | 
 | 
|---|
 | 569 | procedure TORDateBox.ButtonClick(Sender: TObject);
 | 
|---|
 | 570 | var
 | 
|---|
 | 571 |   DateDialog: TORDateTimeDlg;
 | 
|---|
 | 572 |   ParsedDate: TFMDateTime;
 | 
|---|
 | 573 | begin
 | 
|---|
 | 574 |   DateDialog := TORDateTimeDlg.Create(Application);
 | 
|---|
 | 575 |   if Length(Text) > 0 then
 | 
|---|
 | 576 |   begin
 | 
|---|
 | 577 |     ParsedDate := ServerParseFMDate(Text);
 | 
|---|
 | 578 |     if ParsedDate > -1 then FFMDateTime := ParsedDate else FFMDateTime := 0;
 | 
|---|
 | 579 |   end;
 | 
|---|
 | 580 |   DateDialog.DateOnly := FDateOnly;
 | 
|---|
 | 581 |   DateDialog.FMDateTime := FFMDateTime;
 | 
|---|
 | 582 |   DateDialog.RequireTime := FRequireTime;
 | 
|---|
 | 583 |   if DateDialog.Execute then
 | 
|---|
 | 584 |   begin
 | 
|---|
 | 585 |     FFMDateTime := DateDialog.FMDateTime;
 | 
|---|
 | 586 |     UpdateText;
 | 
|---|
 | 587 |     FTimeIsNow := DateDialog.RelativeTime = 'NOW';
 | 
|---|
 | 588 |   end;
 | 
|---|
 | 589 |   DateDialog.Free;
 | 
|---|
 | 590 |   if Visible and Enabled then //Some events may hide the component
 | 
|---|
 | 591 |     SetFocus;
 | 
|---|
 | 592 | end;
 | 
|---|
 | 593 | 
 | 
|---|
 | 594 | procedure TORDateBox.Change;
 | 
|---|
 | 595 | begin
 | 
|---|
 | 596 |   inherited Change;
 | 
|---|
 | 597 |   FTimeIsNow := False;
 | 
|---|
 | 598 | end;
 | 
|---|
 | 599 | 
 | 
|---|
 | 600 | procedure TORDateBox.KeyDown(var Key: Word; Shift: TShiftState);
 | 
|---|
 | 601 | begin
 | 
|---|
 | 602 |   inherited KeyDown(Key, Shift);
 | 
|---|
 | 603 |   if (Key = VK_RETURN) then begin
 | 
|---|
 | 604 |     FButton.Click;
 | 
|---|
 | 605 |     Key := 0;
 | 
|---|
 | 606 |   end;
 | 
|---|
 | 607 | end;
 | 
|---|
 | 608 | 
 | 
|---|
 | 609 | function TORDateBox.GetFMDateTime: TFMDateTime;
 | 
|---|
 | 610 | begin
 | 
|---|
 | 611 |   Result := 0;
 | 
|---|
 | 612 |   if Length(Text) > 0 then Result := ServerParseFMDate(Text);
 | 
|---|
 | 613 |   FFMDateTime := Result;
 | 
|---|
 | 614 | end;
 | 
|---|
 | 615 | 
 | 
|---|
 | 616 | function TORDateBox.GetRelativeTime: string;
 | 
|---|
 | 617 | begin
 | 
|---|
 | 618 |   Result := '';
 | 
|---|
 | 619 |   if FTimeIsNow then Result := 'NOW'
 | 
|---|
 | 620 |   else if UpperCase(Text) = 'NOW' then Result := 'NOW'
 | 
|---|
 | 621 |   else if Length(Text) > 0 then
 | 
|---|
 | 622 |   begin
 | 
|---|
 | 623 |     FFMDateTime := ServerParseFMDate(Text);
 | 
|---|
 | 624 |     if FFMDateTime > 0 then Result := RelativeDateTime(FMDateTimeToDateTime(FFMDateTime));
 | 
|---|
 | 625 |   end;
 | 
|---|
 | 626 | end;
 | 
|---|
 | 627 | 
 | 
|---|
 | 628 | procedure TORDateBox.SetDateOnly(Value: Boolean);
 | 
|---|
 | 629 | begin
 | 
|---|
 | 630 |   FDateOnly := Value;
 | 
|---|
 | 631 |   if FDateOnly then
 | 
|---|
 | 632 |   begin
 | 
|---|
 | 633 |     FRequireTime := False;
 | 
|---|
 | 634 |     FFMDateTime := Int(FFMDateTime);
 | 
|---|
 | 635 |     if FFormat = FMT_DATETIME then FFormat := FMT_DATEONLY;
 | 
|---|
 | 636 |   end;
 | 
|---|
 | 637 |   UpdateText;
 | 
|---|
 | 638 | end;
 | 
|---|
 | 639 | 
 | 
|---|
 | 640 | procedure TORDateBox.SetFMDateTime(Value: TFMDateTime);
 | 
|---|
 | 641 | begin
 | 
|---|
 | 642 |   FFMDateTime := Value;
 | 
|---|
 | 643 |   UpdateText;
 | 
|---|
 | 644 | end;
 | 
|---|
 | 645 | 
 | 
|---|
 | 646 | procedure TORDateBox.SetRequireTime(Value: Boolean);
 | 
|---|
 | 647 | begin
 | 
|---|
 | 648 |   FRequireTime := Value;
 | 
|---|
 | 649 |   if FRequireTime then
 | 
|---|
 | 650 |   begin
 | 
|---|
 | 651 |     if FFormat = FMT_DATEONLY then FFormat := FMT_DATETIME;
 | 
|---|
 | 652 |     SetDateOnly(False);
 | 
|---|
 | 653 |   end;
 | 
|---|
 | 654 | end;
 | 
|---|
 | 655 | 
 | 
|---|
 | 656 | procedure TORDateBox.SetEditRect;
 | 
|---|
 | 657 | { change the edit rectangle to not hide the calendar button - taken from SPIN.PAS sample }
 | 
|---|
 | 658 | var
 | 
|---|
 | 659 |   Loc: TRect;
 | 
|---|
 | 660 | begin
 | 
|---|
 | 661 |   SendMessage(Handle, EM_GETRECT, 0, LongInt(@Loc));
 | 
|---|
 | 662 |   Loc.Bottom := ClientHeight + 1;               // +1 is workaround for windows paint bug
 | 
|---|
 | 663 |   Loc.Right  := FButton.Left - 2;
 | 
|---|
 | 664 |   Loc.Top    := 0;
 | 
|---|
 | 665 |   Loc.Left   := 0;
 | 
|---|
 | 666 |   SendMessage(Handle, EM_SETRECTNP, 0, LongInt(@Loc));
 | 
|---|
 | 667 | end;
 | 
|---|
 | 668 | 
 | 
|---|
 | 669 | procedure TORDateBox.UpdateText;
 | 
|---|
 | 670 | begin
 | 
|---|
 | 671 |   if FFMDateTime > 0 then
 | 
|---|
 | 672 |   begin
 | 
|---|
 | 673 |     if (FFormat =FMT_DATETIME) and (Frac(FFMDateTime) = 0)
 | 
|---|
 | 674 |       then Text := FormatFMDateTime(FMT_DATEONLY, FFMDateTime)
 | 
|---|
 | 675 |       else Text := FormatFMDateTime(FFormat, FFMDateTime);
 | 
|---|
 | 676 |   end;
 | 
|---|
 | 677 | end;
 | 
|---|
 | 678 | 
 | 
|---|
 | 679 | procedure TORDateBox.Validate(var ErrMsg: string);
 | 
|---|
 | 680 | begin
 | 
|---|
 | 681 |   ErrMsg := '';
 | 
|---|
 | 682 |   if Length(Text) > 0 then
 | 
|---|
 | 683 |   begin
 | 
|---|
 | 684 |     FFMDateTime := ServerParseFMDate(Text);
 | 
|---|
 | 685 |     if FFMDateTime <= 0 then Errmsg := 'Invalid Date/Time';
 | 
|---|
 | 686 |     if FRequireTime and (Frac(FFMDateTime) = 0) then ErrMsg := 'Time Required';
 | 
|---|
 | 687 |     if FDateOnly    and (Frac(FFMDateTime) > 0) then ErrMsg := 'Time not Required';
 | 
|---|
 | 688 |   end;
 | 
|---|
 | 689 | end;
 | 
|---|
 | 690 | 
 | 
|---|
 | 691 | function TORDateBox.IsValid: Boolean;
 | 
|---|
 | 692 | var
 | 
|---|
 | 693 |   x: string;
 | 
|---|
 | 694 | begin
 | 
|---|
 | 695 |   Validate(x);
 | 
|---|
 | 696 |   if Length(x) = 0 then Result := True else Result := False;
 | 
|---|
 | 697 |   if Length(Text) = 0 then Result := False;
 | 
|---|
 | 698 | end;
 | 
|---|
 | 699 | 
 | 
|---|
 | 700 | procedure TORDateBox.SetCaption(const Value: string);
 | 
|---|
 | 701 | begin
 | 
|---|
 | 702 |     if not Assigned(FCaption) then begin
 | 
|---|
 | 703 |        FCaption := TStaticText.Create(self);
 | 
|---|
 | 704 |        FCaption.AutoSize := False;
 | 
|---|
 | 705 |        FCaption.Height := 0;
 | 
|---|
 | 706 |        FCaption.Width  := 0;
 | 
|---|
 | 707 |        FCaption.Visible := True;
 | 
|---|
 | 708 |        FCaption.Parent := Parent;
 | 
|---|
 | 709 |        FCaption.BringtoFront;
 | 
|---|
 | 710 |     end;
 | 
|---|
 | 711 |     FCaption.Caption := Value;
 | 
|---|
 | 712 | end;
 | 
|---|
 | 713 | 
 | 
|---|
 | 714 | function TORDateBox.GetCaption(): string;
 | 
|---|
 | 715 | begin
 | 
|---|
 | 716 |     result := FCaption.Caption;
 | 
|---|
 | 717 | end;
 | 
|---|
 | 718 | 
 | 
|---|
 | 719 | function IsLeapYear(AYear: Integer): Boolean;
 | 
|---|
 | 720 | begin
 | 
|---|
 | 721 |   Result := (AYear mod 4 = 0) and ((AYear mod 100 <> 0) or (AYear mod 400 = 0));
 | 
|---|
 | 722 | end;
 | 
|---|
 | 723 | 
 | 
|---|
 | 724 | function DaysPerMonth(AYear, AMonth: Integer): Integer;
 | 
|---|
 | 725 | const
 | 
|---|
 | 726 |   DaysInMonth: array[1..12] of Integer = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
 | 
|---|
 | 727 | 
 | 
|---|
 | 728 | begin
 | 
|---|
 | 729 |   if(AYear < 1) or (AMonth < 1) then
 | 
|---|
 | 730 |     Result := 0
 | 
|---|
 | 731 |   else
 | 
|---|
 | 732 |   begin
 | 
|---|
 | 733 |     Result := DaysInMonth[AMonth];
 | 
|---|
 | 734 |     if (AMonth = 2) and IsLeapYear(AYear) then Inc(Result); { leap-year Feb is special }
 | 
|---|
 | 735 |   end;
 | 
|---|
 | 736 | end;
 | 
|---|
 | 737 | 
 | 
|---|
 | 738 | { TORDateCombo ------------------------------------------------------------------------- }
 | 
|---|
 | 739 | 
 | 
|---|
 | 740 | const
 | 
|---|
 | 741 |   ComboBoxAdjSize = 24;
 | 
|---|
 | 742 |   EditAdjHorzSize = 8;
 | 
|---|
 | 743 |   DateComboCtrlGap = 2;
 | 
|---|
 | 744 |   FirstYear = 1800;
 | 
|---|
 | 745 |   LastYear = 2200;
 | 
|---|
 | 746 | 
 | 
|---|
 | 747 | type
 | 
|---|
 | 748 |   TORDateComboEdit = class(TMaskEdit)
 | 
|---|
 | 749 |   private
 | 
|---|
 | 750 |     FTemplateField: boolean;
 | 
|---|
 | 751 |     procedure SetTemplateField(const Value: boolean);
 | 
|---|
 | 752 |   protected
 | 
|---|
 | 753 |     property TemplateField: boolean read FTemplateField write SetTemplateField;
 | 
|---|
 | 754 |   end;
 | 
|---|
 | 755 | 
 | 
|---|
 | 756 | { TORDateComboEdit }
 | 
|---|
 | 757 | 
 | 
|---|
 | 758 | procedure TORDateComboEdit.SetTemplateField(const Value: boolean);
 | 
|---|
 | 759 | begin
 | 
|---|
 | 760 |   if(FTemplateField <> Value) then
 | 
|---|
 | 761 |   begin
 | 
|---|
 | 762 |     FTemplateField := Value;
 | 
|---|
 | 763 |     if Value then
 | 
|---|
 | 764 |       BorderStyle := bsNone
 | 
|---|
 | 765 |     else
 | 
|---|
 | 766 |       BorderStyle := bsSingle;
 | 
|---|
 | 767 |   end;
 | 
|---|
 | 768 | end;
 | 
|---|
 | 769 | 
 | 
|---|
 | 770 | { TORDateCombo }
 | 
|---|
 | 771 | 
 | 
|---|
 | 772 | constructor TORDateCombo.Create(AOwner: TComponent);
 | 
|---|
 | 773 | begin
 | 
|---|
 | 774 |   inherited;
 | 
|---|
 | 775 |   ControlStyle := ControlStyle - [csSetCaption, csAcceptsControls];
 | 
|---|
 | 776 |   BevelOuter := bvNone;
 | 
|---|
 | 777 |   FIncludeMonth := TRUE;
 | 
|---|
 | 778 |   FIncludeDay := TRUE;
 | 
|---|
 | 779 |   FIncludeBtn := TRUE;
 | 
|---|
 | 780 |   OnResize := Resized;
 | 
|---|
 | 781 | end;
 | 
|---|
 | 782 | 
 | 
|---|
 | 783 | destructor TORDateCombo.Destroy;
 | 
|---|
 | 784 | begin
 | 
|---|
 | 785 |   KillObj(@FMonthCombo);
 | 
|---|
 | 786 |   KillObj(@FDayCombo);
 | 
|---|
 | 787 |   KillObj(@FYearEdit);
 | 
|---|
 | 788 |   KillObj(@FYearUD);
 | 
|---|
 | 789 |   KillObj(@FCalBtn);
 | 
|---|
 | 790 |   inherited;
 | 
|---|
 | 791 | end;
 | 
|---|
 | 792 | 
 | 
|---|
 | 793 | function TORDateCombo.GetYearSize: integer;
 | 
|---|
 | 794 | begin
 | 
|---|
 | 795 |   Result := TextWidthByFont(Font.Handle, '8888') + EditAdjHorzSize;
 | 
|---|
 | 796 | end;
 | 
|---|
 | 797 | 
 | 
|---|
 | 798 | function TORDateCombo.InitDays(GetSize: boolean): integer;
 | 
|---|
 | 799 | var
 | 
|---|
 | 800 |   dy: integer;
 | 
|---|
 | 801 | 
 | 
|---|
 | 802 | begin
 | 
|---|
 | 803 |   Result := 0;
 | 
|---|
 | 804 |   if(assigned(FDayCombo)) then
 | 
|---|
 | 805 |   begin
 | 
|---|
 | 806 |     dy := DaysPerMonth(FYear, FMonth) + 1;
 | 
|---|
 | 807 |     while (FDayCombo.Items.Count < dy) do
 | 
|---|
 | 808 |     begin
 | 
|---|
 | 809 |       if(FDayCombo.Items.Count = 0) then
 | 
|---|
 | 810 |         FDayCombo.Items.Add(' ')
 | 
|---|
 | 811 |       else
 | 
|---|
 | 812 |         FDayCombo.Items.Add(inttostr(FDayCombo.Items.Count));
 | 
|---|
 | 813 |     end;
 | 
|---|
 | 814 |     while (FDayCombo.Items.Count > dy) do
 | 
|---|
 | 815 |       FDayCombo.Items.Delete(FDayCombo.Items.Count-1);
 | 
|---|
 | 816 |     if(GetSize) then
 | 
|---|
 | 817 |       Result := TextWidthByFont(Font.Handle, '88') + ComboBoxAdjSize;
 | 
|---|
 | 818 |     if(FDay > (dy-1)) then
 | 
|---|
 | 819 |       SetDay(dy-1);
 | 
|---|
 | 820 |   end;
 | 
|---|
 | 821 | end;
 | 
|---|
 | 822 | 
 | 
|---|
 | 823 | function TORDateCombo.InitMonths(GetSize: boolean): integer;
 | 
|---|
 | 824 | var
 | 
|---|
 | 825 |   i, Size: integer;
 | 
|---|
 | 826 | 
 | 
|---|
 | 827 | begin
 | 
|---|
 | 828 |   Result := 0;
 | 
|---|
 | 829 |   if(assigned(FMonthCombo)) then
 | 
|---|
 | 830 |   begin
 | 
|---|
 | 831 |     FMonthCombo.Items.Clear;
 | 
|---|
 | 832 |     FMonthCombo.Items.Add(' ');
 | 
|---|
 | 833 |     for i := 1 to 12 do
 | 
|---|
 | 834 |     begin
 | 
|---|
 | 835 |       if FLongMonths then
 | 
|---|
 | 836 |         FMonthCombo.Items.Add(LongMonthNames[i])
 | 
|---|
 | 837 |       else
 | 
|---|
 | 838 |         FMonthCombo.Items.Add(ShortMonthNames[i]);
 | 
|---|
 | 839 |       if(GetSize) then
 | 
|---|
 | 840 |       begin
 | 
|---|
 | 841 |         Size := TextWidthByFont(Font.Handle, FMonthCombo.Items[i]);
 | 
|---|
 | 842 |         if(Result < Size) then
 | 
|---|
 | 843 |           Result := Size;
 | 
|---|
 | 844 |       end;
 | 
|---|
 | 845 |     end;
 | 
|---|
 | 846 |     if(GetSize) then
 | 
|---|
 | 847 |       inc(Result, ComboBoxAdjSize);
 | 
|---|
 | 848 |   end;
 | 
|---|
 | 849 | end;
 | 
|---|
 | 850 | 
 | 
|---|
 | 851 | procedure TORDateCombo.Rebuild;
 | 
|---|
 | 852 | var
 | 
|---|
 | 853 |   Wide, X, Y: integer;
 | 
|---|
 | 854 | 
 | 
|---|
 | 855 | begin
 | 
|---|
 | 856 |   if(not FRebuilding) then
 | 
|---|
 | 857 |   begin
 | 
|---|
 | 858 |     FRebuilding := TRUE;
 | 
|---|
 | 859 |     try
 | 
|---|
 | 860 |       ControlStyle := ControlStyle + [csAcceptsControls];
 | 
|---|
 | 861 |       try
 | 
|---|
 | 862 |         Y := TextHeightByFont(Font.Handle, FontHeightText);
 | 
|---|
 | 863 |         if not FTemplateField then
 | 
|---|
 | 864 |           inc(Y,AdjVertSize);
 | 
|---|
 | 865 |         X := 0;
 | 
|---|
 | 866 |         if(FIncludeMonth) then
 | 
|---|
 | 867 |         begin
 | 
|---|
 | 868 |           if(not assigned(FMonthCombo)) then
 | 
|---|
 | 869 |           begin
 | 
|---|
 | 870 |             FMonthCombo := TORComboBox.Create(Self);
 | 
|---|
 | 871 |             FMonthCombo.Parent := Self;
 | 
|---|
 | 872 |             FMonthCombo.Top := 0;
 | 
|---|
 | 873 |             FMonthCombo.Left := 0;
 | 
|---|
 | 874 |             FMonthCombo.Style := orcsDropDown;
 | 
|---|
 | 875 |             FMonthCombo.DropDownCount := 13;
 | 
|---|
 | 876 |             FMonthCombo.OnChange := MonthChanged;
 | 
|---|
 | 877 |           end;
 | 
|---|
 | 878 |           FMonthCombo.Font := Font;
 | 
|---|
 | 879 |           FMonthCombo.TemplateField := FTemplateField;
 | 
|---|
 | 880 |           Wide := InitMonths(TRUE);
 | 
|---|
 | 881 |           FMonthCombo.Width := Wide;
 | 
|---|
 | 882 |           FMonthCombo.Height := Y;
 | 
|---|
 | 883 |           FMonthCombo.ItemIndex := FMonth;
 | 
|---|
 | 884 |           inc(X, Wide + DateComboCtrlGap);
 | 
|---|
 | 885 | 
 | 
|---|
 | 886 |           if(FIncludeDay) then
 | 
|---|
 | 887 |           begin
 | 
|---|
 | 888 |             if(not assigned(FDayCombo)) then
 | 
|---|
 | 889 |             begin
 | 
|---|
 | 890 |               FDayCombo := TORComboBox.Create(Self);
 | 
|---|
 | 891 |               FDayCombo.Parent := Self;
 | 
|---|
 | 892 |               FDayCombo.Top := 0;
 | 
|---|
 | 893 |               FDayCombo.Style := orcsDropDown;
 | 
|---|
 | 894 |               FDayCombo.OnChange := DayChanged;
 | 
|---|
 | 895 |               FDayCombo.DropDownCount := 11;
 | 
|---|
 | 896 |             end;
 | 
|---|
 | 897 |             FDayCombo.Font := Font;
 | 
|---|
 | 898 |             FDayCombo.TemplateField := FTemplateField;
 | 
|---|
 | 899 |             Wide := InitDays(TRUE);
 | 
|---|
 | 900 |             FDayCombo.Width := Wide;
 | 
|---|
 | 901 |             FDayCombo.Height := Y;
 | 
|---|
 | 902 |             FDayCombo.Left := X;
 | 
|---|
 | 903 |             FDayCombo.ItemIndex := FDay;
 | 
|---|
 | 904 |             inc(X, Wide + DateComboCtrlGap);
 | 
|---|
 | 905 |           end
 | 
|---|
 | 906 |           else
 | 
|---|
 | 907 |             KillObj(@FDayCombo);
 | 
|---|
 | 908 |         end
 | 
|---|
 | 909 |         else
 | 
|---|
 | 910 |         begin
 | 
|---|
 | 911 |           KillObj(@FDayCombo);
 | 
|---|
 | 912 |           KillObj(@FMonthCombo);
 | 
|---|
 | 913 |         end;
 | 
|---|
 | 914 |         if(not assigned(FYearEdit)) then
 | 
|---|
 | 915 |         begin
 | 
|---|
 | 916 |           FYearEdit := TORDateComboEdit.Create(Self);
 | 
|---|
 | 917 |           FYearEdit.Parent := Self;
 | 
|---|
 | 918 |           FYearEdit.Top := 0;
 | 
|---|
 | 919 |           FYearEdit.EditMask := '9999;1; ';
 | 
|---|
 | 920 |           FYearEdit.OnKeyPress := YearKeyPress;
 | 
|---|
 | 921 |           FYearEdit.OnChange := YearChanged;
 | 
|---|
 | 922 |         end;
 | 
|---|
 | 923 |         FYearEdit.Font := Font;
 | 
|---|
 | 924 |         TORDateComboEdit(FYearEdit).TemplateField := FTemplateField;
 | 
|---|
 | 925 |         Wide := GetYearSize;
 | 
|---|
 | 926 |         FYearEdit.Width := Wide;
 | 
|---|
 | 927 |         FYearEdit.Height := Y;
 | 
|---|
 | 928 |         FYearEdit.Left := X;
 | 
|---|
 | 929 |         inc(X, Wide);
 | 
|---|
 | 930 |         if(not assigned(FYearUD)) then
 | 
|---|
 | 931 |         begin
 | 
|---|
 | 932 |           FYearUD := TUpDown.Create(Self);
 | 
|---|
 | 933 |           FYearUD.Parent := Self;
 | 
|---|
 | 934 |           FYearUD.Thousands := FALSE;
 | 
|---|
 | 935 |           FYearUD.Min := FirstYear-1;
 | 
|---|
 | 936 |           FYearUD.Max := LastYear;
 | 
|---|
 | 937 |           FYearUD.OnChangingEx := YearUDChange;
 | 
|---|
 | 938 |         end;
 | 
|---|
 | 939 |         FYearEdit.TabOrder := 0;
 | 
|---|
 | 940 |         FYearUD.Top := 0;
 | 
|---|
 | 941 |         FYearUD.Left := X;
 | 
|---|
 | 942 |         FYearUD.Height := Y;
 | 
|---|
 | 943 |         FYearUD.Position := FYear;
 | 
|---|
 | 944 |         inc(X, FYearUD.Width + DateComboCtrlGap);
 | 
|---|
 | 945 |         if(FIncludeBtn) then
 | 
|---|
 | 946 |         begin
 | 
|---|
 | 947 |           if(not assigned(FCalBtn)) then
 | 
|---|
 | 948 |           begin
 | 
|---|
 | 949 |             FCalBtn := TSpeedButton.Create(Self);
 | 
|---|
 | 950 |             FCalBtn.Parent := Self;
 | 
|---|
 | 951 |             FCalBtn.Top := 0;
 | 
|---|
 | 952 |             FCalBtn.Glyph.LoadFromResourceName(hInstance, 'BMP_ELLIPSIS');
 | 
|---|
 | 953 |             FCalBtn.OnClick := BtnClicked;
 | 
|---|
 | 954 |           end;
 | 
|---|
 | 955 |           Wide := FYearEdit.Height;
 | 
|---|
 | 956 |           if(Wide > Y) then Wide := Y;
 | 
|---|
 | 957 |           FCalBtn.Width := Wide;
 | 
|---|
 | 958 |           FCalBtn.Height := Wide;
 | 
|---|
 | 959 |           FCalBtn.Left := X;
 | 
|---|
 | 960 |           inc(X, Wide + DateComboCtrlGap);
 | 
|---|
 | 961 |         end
 | 
|---|
 | 962 |         else
 | 
|---|
 | 963 |           KillObj(@FCalBtn);
 | 
|---|
 | 964 |         Self.Width := X - DateComboCtrlGap;
 | 
|---|
 | 965 |         Self.Height := Y;
 | 
|---|
 | 966 |         CheckDays;
 | 
|---|
 | 967 |         FCtrlsCreated := TRUE;
 | 
|---|
 | 968 |         DoChange;
 | 
|---|
 | 969 |       finally
 | 
|---|
 | 970 |         ControlStyle := ControlStyle - [csAcceptsControls];
 | 
|---|
 | 971 |       end;
 | 
|---|
 | 972 |     finally
 | 
|---|
 | 973 |       FRebuilding := FALSE;
 | 
|---|
 | 974 |     end;
 | 
|---|
 | 975 |   end;
 | 
|---|
 | 976 | end;
 | 
|---|
 | 977 | 
 | 
|---|
 | 978 | procedure TORDateCombo.SetDay(Value: integer);
 | 
|---|
 | 979 | begin
 | 
|---|
 | 980 |   if(not assigned(FDayCombo)) and (not (csLoading in ComponentState)) then
 | 
|---|
 | 981 |     Value := 0;
 | 
|---|
 | 982 |   if(Value > DaysPerMonth(FYear, FMonth)) then
 | 
|---|
 | 983 |     Value := 0;
 | 
|---|
 | 984 |   if(FDay <> Value) then
 | 
|---|
 | 985 |   begin
 | 
|---|
 | 986 |     FDay := Value;
 | 
|---|
 | 987 |     if(assigned(FDayCombo)) then
 | 
|---|
 | 988 |     begin
 | 
|---|
 | 989 |       if(FDayCombo.Items.Count <= FDay) then
 | 
|---|
 | 990 |         InitDays(FALSE);
 | 
|---|
 | 991 |       FDayCombo.ItemIndex := FDay;
 | 
|---|
 | 992 |     end;
 | 
|---|
 | 993 |     DoChange;
 | 
|---|
 | 994 |   end;
 | 
|---|
 | 995 | end;
 | 
|---|
 | 996 | 
 | 
|---|
 | 997 | procedure TORDateCombo.SetIncludeBtn(const Value: boolean);
 | 
|---|
 | 998 | begin
 | 
|---|
 | 999 |   if(FIncludeBtn <> Value) then
 | 
|---|
 | 1000 |   begin
 | 
|---|
 | 1001 |     FIncludeBtn := Value;
 | 
|---|
 | 1002 |     Rebuild;
 | 
|---|
 | 1003 |   end;
 | 
|---|
 | 1004 | end;
 | 
|---|
 | 1005 | 
 | 
|---|
 | 1006 | procedure TORDateCombo.SetIncludeDay(Value: boolean);
 | 
|---|
 | 1007 | begin
 | 
|---|
 | 1008 |   if(Value) and (not FIncludeMonth) then
 | 
|---|
 | 1009 |     Value := FALSE;
 | 
|---|
 | 1010 |   if(FIncludeDay <> Value) then
 | 
|---|
 | 1011 |   begin
 | 
|---|
 | 1012 |     FIncludeDay := Value;
 | 
|---|
 | 1013 |     if(not Value) then FDay := 0;
 | 
|---|
 | 1014 |     Rebuild;
 | 
|---|
 | 1015 |   end;
 | 
|---|
 | 1016 | end;
 | 
|---|
 | 1017 | 
 | 
|---|
 | 1018 | procedure TORDateCombo.SetIncludeMonth(const Value: boolean);
 | 
|---|
 | 1019 | begin
 | 
|---|
 | 1020 |   if(FIncludeMonth <> Value) then
 | 
|---|
 | 1021 |   begin
 | 
|---|
 | 1022 |     FIncludeMonth := Value;
 | 
|---|
 | 1023 |     if(not Value) then
 | 
|---|
 | 1024 |     begin
 | 
|---|
 | 1025 |       FIncludeDay := FALSE;
 | 
|---|
 | 1026 |       FMonth := 0;
 | 
|---|
 | 1027 |       FDay := 0;
 | 
|---|
 | 1028 |     end;
 | 
|---|
 | 1029 |     Rebuild;
 | 
|---|
 | 1030 |   end;
 | 
|---|
 | 1031 | end;
 | 
|---|
 | 1032 | 
 | 
|---|
 | 1033 | procedure TORDateCombo.SetMonth(Value: integer);
 | 
|---|
 | 1034 | begin
 | 
|---|
 | 1035 |   if(not assigned(FMonthCombo)) and (not (csLoading in ComponentState)) then
 | 
|---|
 | 1036 |     Value := 0;
 | 
|---|
 | 1037 |   if(Value <0) or (Value > 12) then
 | 
|---|
 | 1038 |     Value := 0;
 | 
|---|
 | 1039 |   if(FMonth <> Value) then
 | 
|---|
 | 1040 |   begin
 | 
|---|
 | 1041 |     FMonth := Value;
 | 
|---|
 | 1042 |     if(assigned(FMonthCombo)) then
 | 
|---|
 | 1043 |       FMonthCombo.ItemIndex := FMonth;
 | 
|---|
 | 1044 |     CheckDays;
 | 
|---|
 | 1045 |     DoChange;
 | 
|---|
 | 1046 |   end;
 | 
|---|
 | 1047 | end;
 | 
|---|
 | 1048 | 
 | 
|---|
 | 1049 | procedure TORDateCombo.SetLongMonths(const Value: boolean);
 | 
|---|
 | 1050 | begin
 | 
|---|
 | 1051 |   if(FLongMonths <> Value) then
 | 
|---|
 | 1052 |   begin
 | 
|---|
 | 1053 |     FLongMonths := Value;
 | 
|---|
 | 1054 |     Rebuild;
 | 
|---|
 | 1055 |   end;
 | 
|---|
 | 1056 | end;
 | 
|---|
 | 1057 | 
 | 
|---|
 | 1058 | procedure TORDateCombo.SetYear(const Value: integer);
 | 
|---|
 | 1059 | begin
 | 
|---|
 | 1060 |   if(FYear <> Value) then
 | 
|---|
 | 1061 |   begin
 | 
|---|
 | 1062 |     FYear := Value;
 | 
|---|
 | 1063 |     if(FYear < FirstYear) or (FYear > LastYear) then
 | 
|---|
 | 1064 |       FYear := 0;
 | 
|---|
 | 1065 |     if(not FYearChanging) and (assigned(FYearEdit)) and (assigned(FYearUD)) then
 | 
|---|
 | 1066 |     begin
 | 
|---|
 | 1067 |       FYearChanging := TRUE;
 | 
|---|
 | 1068 |       try
 | 
|---|
 | 1069 |         if(FYear = 0) then
 | 
|---|
 | 1070 |         begin
 | 
|---|
 | 1071 |           FYearEdit.Text := '    ';
 | 
|---|
 | 1072 |           FYearUD.Position := FirstYear-1
 | 
|---|
 | 1073 |         end
 | 
|---|
 | 1074 |         else
 | 
|---|
 | 1075 |         begin
 | 
|---|
 | 1076 |           FYearEdit.Text := IntToStr(FYear);
 | 
|---|
 | 1077 |           FYearUD.Position := FYear;
 | 
|---|
 | 1078 |         end;
 | 
|---|
 | 1079 |       finally
 | 
|---|
 | 1080 |         FYearChanging := FALSE;
 | 
|---|
 | 1081 |       end;
 | 
|---|
 | 1082 |     end;
 | 
|---|
 | 1083 |     if(FMonth = 2) then
 | 
|---|
 | 1084 |       InitDays(FALSE);
 | 
|---|
 | 1085 |     CheckDays;
 | 
|---|
 | 1086 |     DoChange;
 | 
|---|
 | 1087 |   end;
 | 
|---|
 | 1088 | end;
 | 
|---|
 | 1089 | 
 | 
|---|
 | 1090 | procedure TORDateCombo.DayChanged(Sender: TObject);
 | 
|---|
 | 1091 | begin
 | 
|---|
 | 1092 |   FDay := FDayCombo.ItemIndex;
 | 
|---|
 | 1093 |   if(FDay < 0) then
 | 
|---|
 | 1094 |     FDay := 0;
 | 
|---|
 | 1095 |   CheckDays;
 | 
|---|
 | 1096 |   DoChange;
 | 
|---|
 | 1097 | end;
 | 
|---|
 | 1098 | 
 | 
|---|
 | 1099 | procedure TORDateCombo.MonthChanged(Sender: TObject);
 | 
|---|
 | 1100 | begin
 | 
|---|
 | 1101 |   FMonth := FMonthCombo.ItemIndex;
 | 
|---|
 | 1102 |   if(FMonth < 0) then
 | 
|---|
 | 1103 |     FMonth := 0;
 | 
|---|
 | 1104 |   InitDays(FALSE);
 | 
|---|
 | 1105 |   CheckDays;
 | 
|---|
 | 1106 |   DoChange;
 | 
|---|
 | 1107 | end;
 | 
|---|
 | 1108 | 
 | 
|---|
 | 1109 | procedure TORDateCombo.YearChanged(Sender: TObject);
 | 
|---|
 | 1110 | begin
 | 
|---|
 | 1111 |   if FYearChanging then exit;
 | 
|---|
 | 1112 |   FYearChanging := TRUE;
 | 
|---|
 | 1113 |   try
 | 
|---|
 | 1114 |     FYear := StrToIntDef(FYearEdit.Text, 0);
 | 
|---|
 | 1115 |     if(FYear < FirstYear) or (FYear > LastYear) then
 | 
|---|
 | 1116 |       FYear := 0;
 | 
|---|
 | 1117 |     if(FYear = 0) then
 | 
|---|
 | 1118 |       FYearUD.Position := FirstYear-1
 | 
|---|
 | 1119 |     else
 | 
|---|
 | 1120 |       FYearUD.Position := FYear;
 | 
|---|
 | 1121 |     if(FMonth = 2) then
 | 
|---|
 | 1122 |       InitDays(FALSE);
 | 
|---|
 | 1123 |     CheckDays;
 | 
|---|
 | 1124 |     DoChange;
 | 
|---|
 | 1125 |   finally
 | 
|---|
 | 1126 |     FYearChanging := FALSE;
 | 
|---|
 | 1127 |   end;
 | 
|---|
 | 1128 | end;
 | 
|---|
 | 1129 | 
 | 
|---|
 | 1130 | procedure TORDateCombo.CheckDays;
 | 
|---|
 | 1131 | var
 | 
|---|
 | 1132 |   MaxDays: integer;
 | 
|---|
 | 1133 | 
 | 
|---|
 | 1134 | begin
 | 
|---|
 | 1135 |   if(FIncludeMonth and assigned(FMonthCombo)) then
 | 
|---|
 | 1136 |   begin
 | 
|---|
 | 1137 |     FMonthCombo.Enabled := (FYear > 0);
 | 
|---|
 | 1138 |     if (FYear = 0) then
 | 
|---|
 | 1139 |       SetMonth(0); 
 | 
|---|
 | 1140 |     if(FIncludeMonth and FIncludeDay and assigned(FDayCombo)) then
 | 
|---|
 | 1141 |     begin
 | 
|---|
 | 1142 |       FDayCombo.Enabled := ((FYear > 0) and (FMonth > 0));
 | 
|---|
 | 1143 |       MaxDays := DaysPerMonth(FYear, FMonth);
 | 
|---|
 | 1144 |       if(FDay > MaxDays) then
 | 
|---|
 | 1145 |         SetDay(MaxDays);
 | 
|---|
 | 1146 |     end;
 | 
|---|
 | 1147 |   end;
 | 
|---|
 | 1148 | end;
 | 
|---|
 | 1149 | 
 | 
|---|
 | 1150 | procedure TORDateCombo.Loaded;
 | 
|---|
 | 1151 | begin
 | 
|---|
 | 1152 |   inherited;
 | 
|---|
 | 1153 |   if(not FCtrlsCreated) then
 | 
|---|
 | 1154 |     Rebuild;
 | 
|---|
 | 1155 | end;
 | 
|---|
 | 1156 | 
 | 
|---|
 | 1157 | procedure TORDateCombo.Paint;
 | 
|---|
 | 1158 | begin
 | 
|---|
 | 1159 |   if(not FCtrlsCreated) then
 | 
|---|
 | 1160 |     Rebuild;
 | 
|---|
 | 1161 |   inherited;
 | 
|---|
 | 1162 | end;
 | 
|---|
 | 1163 | 
 | 
|---|
 | 1164 | procedure TORDateCombo.BtnClicked(Sender: TObject);
 | 
|---|
 | 1165 | var
 | 
|---|
 | 1166 |   mm, dd, yy: integer;
 | 
|---|
 | 1167 |   m, d, y: word;
 | 
|---|
 | 1168 |   DateDialog: TORDateTimeDlg;
 | 
|---|
 | 1169 | 
 | 
|---|
 | 1170 | begin
 | 
|---|
 | 1171 |   DateDialog := TORDateTimeDlg.Create(self);
 | 
|---|
 | 1172 |   try
 | 
|---|
 | 1173 |     mm := FMonth;
 | 
|---|
 | 1174 |     dd := FDay;
 | 
|---|
 | 1175 |     yy := FYear;
 | 
|---|
 | 1176 |     DecodeDate(Now, y, m, d);
 | 
|---|
 | 1177 |     if(FYear = 0) then FYear := y;
 | 
|---|
 | 1178 |     if(FYear = y) then
 | 
|---|
 | 1179 |     begin
 | 
|---|
 | 1180 |       if((FMonth = 0) or (FMonth = m)) and (FDay = 0) then
 | 
|---|
 | 1181 |       begin
 | 
|---|
 | 1182 |         FMonth := m;
 | 
|---|
 | 1183 |         FDay := d;
 | 
|---|
 | 1184 |       end;
 | 
|---|
 | 1185 |     end;
 | 
|---|
 | 1186 |     if(FMonth = 0) then
 | 
|---|
 | 1187 |       FMonth := 1;
 | 
|---|
 | 1188 |     if(FDay = 0) then
 | 
|---|
 | 1189 |       FDay := 1;
 | 
|---|
 | 1190 |     DateDialog.FMDateTime := GetFMDate;
 | 
|---|
 | 1191 |     DateDialog.DateOnly := TRUE;
 | 
|---|
 | 1192 |     DateDialog.RequireTime := FALSE;
 | 
|---|
 | 1193 |     if DateDialog.Execute then
 | 
|---|
 | 1194 |     begin
 | 
|---|
 | 1195 |       FYear := 0;
 | 
|---|
 | 1196 |       FMonth := 0;
 | 
|---|
 | 1197 |       FDay := 0;
 | 
|---|
 | 1198 |       SetFMDate(DateDialog.FMDateTime);
 | 
|---|
 | 1199 |     end
 | 
|---|
 | 1200 |     else
 | 
|---|
 | 1201 |     begin
 | 
|---|
 | 1202 |       SetYear(yy);
 | 
|---|
 | 1203 |       SetMonth(mm);
 | 
|---|
 | 1204 |       SetDay(dd);
 | 
|---|
 | 1205 |     end;
 | 
|---|
 | 1206 |   finally
 | 
|---|
 | 1207 |     DateDialog.Free;
 | 
|---|
 | 1208 |   end;
 | 
|---|
 | 1209 | end;
 | 
|---|
 | 1210 | 
 | 
|---|
 | 1211 | procedure TORDateCombo.YearUDChange(Sender: TObject; var AllowChange: Boolean;
 | 
|---|
 | 1212 |                                     NewValue: Smallint; Direction: TUpDownDirection);
 | 
|---|
 | 1213 | var
 | 
|---|
 | 1214 |   y, m, d: word;
 | 
|---|
 | 1215 | 
 | 
|---|
 | 1216 | begin
 | 
|---|
 | 1217 |   if FYearChanging then exit;
 | 
|---|
 | 1218 |   FYearChanging := TRUE;
 | 
|---|
 | 1219 |   try
 | 
|---|
 | 1220 |     if FYearUD.Position = (FirstYear-1) then
 | 
|---|
 | 1221 |     begin
 | 
|---|
 | 1222 |       DecodeDate(Now, y, m, d);
 | 
|---|
 | 1223 |       FYear := y;
 | 
|---|
 | 1224 |       FYearUD.Position := y;
 | 
|---|
 | 1225 |       AllowChange := FALSE;
 | 
|---|
 | 1226 |     end
 | 
|---|
 | 1227 |     else
 | 
|---|
 | 1228 |       FYear := NewValue;
 | 
|---|
 | 1229 |     if(FYear < FirstYear) or (FYear > LastYear) then
 | 
|---|
 | 1230 |       FYear := 0;
 | 
|---|
 | 1231 |     if(FYear = 0) then
 | 
|---|
 | 1232 |       FYearEdit.Text := '    '
 | 
|---|
 | 1233 |     else
 | 
|---|
 | 1234 |       FYearEdit.Text := IntToStr(FYear);
 | 
|---|
 | 1235 |     if(FMonth = 2) then
 | 
|---|
 | 1236 |       InitDays(FALSE);
 | 
|---|
 | 1237 |     CheckDays;
 | 
|---|
 | 1238 |     DoChange;
 | 
|---|
 | 1239 |   finally
 | 
|---|
 | 1240 |     FYearChanging := FALSE;
 | 
|---|
 | 1241 |   end;
 | 
|---|
 | 1242 | end;
 | 
|---|
 | 1243 | 
 | 
|---|
 | 1244 | procedure TORDateCombo.YearKeyPress(Sender: TObject; var Key: Char);
 | 
|---|
 | 1245 | begin
 | 
|---|
 | 1246 |   if(Key in ['0'..'9']) and (FYearEdit.Text = '    ') then
 | 
|---|
 | 1247 |   begin
 | 
|---|
 | 1248 |     FYearEdit.Text := Key + '   ';
 | 
|---|
 | 1249 |     Key := #0;
 | 
|---|
 | 1250 |     FYearEdit.SelStart := 1;
 | 
|---|
 | 1251 |     FYearEdit.SelText := '';
 | 
|---|
 | 1252 |   end;
 | 
|---|
 | 1253 | end;
 | 
|---|
 | 1254 | 
 | 
|---|
 | 1255 | function TORDateCombo.GetFMDate: TFMDateTime;
 | 
|---|
 | 1256 | begin
 | 
|---|
 | 1257 |   if(FYear < FirstYear) then
 | 
|---|
 | 1258 |     Result := 0
 | 
|---|
 | 1259 |   else
 | 
|---|
 | 1260 |     Result := ((FYear - 1700) * 10000 + FMonth * 100 + FDay);
 | 
|---|
 | 1261 | end;
 | 
|---|
 | 1262 | 
 | 
|---|
 | 1263 | procedure TORDateCombo.SetFMDate(const Value: TFMDateTime);
 | 
|---|
 | 1264 | var
 | 
|---|
 | 1265 |   ival, mo, dy: integer;
 | 
|---|
 | 1266 |               
 | 
|---|
 | 1267 | begin
 | 
|---|
 | 1268 |   if(Value = 0) then
 | 
|---|
 | 1269 |   begin
 | 
|---|
 | 1270 |     SetYear(0);
 | 
|---|
 | 1271 |     SetMonth(0);
 | 
|---|
 | 1272 |   end
 | 
|---|
 | 1273 |   else
 | 
|---|
 | 1274 |   begin
 | 
|---|
 | 1275 |     ival := trunc(Value);
 | 
|---|
 | 1276 |     if(length(inttostr(ival)) <> 7) then
 | 
|---|
 | 1277 |       exit;
 | 
|---|
 | 1278 |     dy := (ival mod 100);
 | 
|---|
 | 1279 |     ival := ival div 100;
 | 
|---|
 | 1280 |     mo := ival mod 100;
 | 
|---|
 | 1281 |     ival := ival div 100;
 | 
|---|
 | 1282 |     SetYear(ival + 1700);
 | 
|---|
 | 1283 |     SetMonth(mo);
 | 
|---|
 | 1284 |     InitDays(FALSE);
 | 
|---|
 | 1285 |     SetDay(dy);
 | 
|---|
 | 1286 |   end;
 | 
|---|
 | 1287 | end;
 | 
|---|
 | 1288 | 
 | 
|---|
 | 1289 | function TORDateCombo.DateText: string;
 | 
|---|
 | 1290 | begin
 | 
|---|
 | 1291 |   Result := '';
 | 
|---|
 | 1292 |   if(FYear > 0) then
 | 
|---|
 | 1293 |   begin
 | 
|---|
 | 1294 |     if(FMonth > 0) then
 | 
|---|
 | 1295 |     begin
 | 
|---|
 | 1296 |       if FLongMonths then
 | 
|---|
 | 1297 |         Result := LongMonthNames[FMonth]
 | 
|---|
 | 1298 |       else
 | 
|---|
 | 1299 |         Result := ShortMonthNames[FMonth];
 | 
|---|
 | 1300 |       if(FDay > 0) then
 | 
|---|
 | 1301 |         Result := Result + ' ' + IntToStr(FDay);
 | 
|---|
 | 1302 |       Result := Result + ', ';
 | 
|---|
 | 1303 |     end;
 | 
|---|
 | 1304 |     Result := Result + IntToStr(FYear);
 | 
|---|
 | 1305 |   end;
 | 
|---|
 | 1306 | end;
 | 
|---|
 | 1307 | 
 | 
|---|
 | 1308 | procedure TORDateCombo.DoChange;
 | 
|---|
 | 1309 | begin
 | 
|---|
 | 1310 |   if assigned(FOnChange) then
 | 
|---|
 | 1311 |     FOnChange(Self);
 | 
|---|
 | 1312 | end;
 | 
|---|
 | 1313 | 
 | 
|---|
 | 1314 | procedure TORDateCombo.Resized(Sender: TObject);
 | 
|---|
 | 1315 | begin
 | 
|---|
 | 1316 |   Rebuild;
 | 
|---|
 | 1317 | end;
 | 
|---|
 | 1318 | 
 | 
|---|
 | 1319 | procedure TORDateCombo.CMFontChanged(var Message: TMessage);
 | 
|---|
 | 1320 | begin
 | 
|---|
 | 1321 |   inherited;
 | 
|---|
 | 1322 |   Rebuild;
 | 
|---|
 | 1323 | end;
 | 
|---|
 | 1324 | 
 | 
|---|
 | 1325 | function TORDateCombo.Text: string;
 | 
|---|
 | 1326 | var
 | 
|---|
 | 1327 |   tmp, fmt, m: string;
 | 
|---|
 | 1328 | 
 | 
|---|
 | 1329 | begin
 | 
|---|
 | 1330 |   Result := '';
 | 
|---|
 | 1331 |   tmp := FloatToStr(FMDate);
 | 
|---|
 | 1332 |   if(tmp <> '') and (tmp <> '0') and (length(Tmp) >= 7) then
 | 
|---|
 | 1333 |   begin
 | 
|---|
 | 1334 |     if FLongMonths then
 | 
|---|
 | 1335 |       m := 'mmmm'
 | 
|---|
 | 1336 |     else
 | 
|---|
 | 1337 |       m := 'mmm';
 | 
|---|
 | 1338 |     if(copy(tmp,4,4) = '0000') then
 | 
|---|
 | 1339 |       fmt := 'yyyy'
 | 
|---|
 | 1340 |     else
 | 
|---|
 | 1341 |     if(copy(tmp,6,2) = '00') then
 | 
|---|
 | 1342 |       fmt := m + ', YYYY'
 | 
|---|
 | 1343 |     else
 | 
|---|
 | 1344 |       fmt := m + ' D, YYYY';
 | 
|---|
 | 1345 |     Result := FormatFMDateTimeStr(fmt, tmp)
 | 
|---|
 | 1346 |   end;
 | 
|---|
 | 1347 | end;
 | 
|---|
 | 1348 | 
 | 
|---|
 | 1349 | 
 | 
|---|
 | 1350 | procedure Register;
 | 
|---|
 | 1351 | { used by Delphi to put components on the Palette }
 | 
|---|
 | 1352 | begin
 | 
|---|
 | 1353 |   RegisterComponents('CPRS', [TORDateTimeDlg, TORDateBox, TORDateCombo]);
 | 
|---|
 | 1354 | end;
 | 
|---|
 | 1355 | 
 | 
|---|
 | 1356 | procedure TORDateCombo.SetTemplateField(const Value: boolean);
 | 
|---|
 | 1357 | begin
 | 
|---|
 | 1358 |   if FTemplateField <> Value then
 | 
|---|
 | 1359 |   begin
 | 
|---|
 | 1360 |     FTemplateField := Value;
 | 
|---|
 | 1361 |     Rebuild;
 | 
|---|
 | 1362 |   end;
 | 
|---|
 | 1363 | end;
 | 
|---|
 | 1364 | 
 | 
|---|
 | 1365 | initialization
 | 
|---|
 | 1366 |   uServerToday := 0;
 | 
|---|
 | 1367 | 
 | 
|---|
 | 1368 | end.
 | 
|---|