cxcalendar.pas

来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 1,978 行 · 第 1/5 页

PAS
1,978
字号
    property ShowTime: Boolean read FShowTime write SetShowTime default True;
    property WeekNumbers: Boolean read FWeekNumbers write SetWeekNumbers
      default False;
    property YearsInMonthList: Boolean read FYearsInMonthList
      write SetYearsInMonthList default True;
  end;

  { TcxDateEditProperties }

  TcxDateEditProperties = class(TcxCustomDateEditProperties)
  published
    property Alignment;
    property ArrowsForYear;
    property AssignedValues;
    property AutoSelect;
    property ButtonGlyph;
    property ClearKey;
    property DateButtons;
    property DateOnError;
    property ImeMode;
    property ImeName;
    property ImmediatePost;
    property InputKind;
    property Kind;
    property MaxDate;
    property MinDate;
    property PostPopupValueOnTab;
    property ReadOnly;
    property SaveTime;
    property ShowTime;
    property UseLeftAlignmentOnEditing;
    property ValidateOnEnter;
    property WeekNumbers;
    property YearsInMonthList;
    property OnChange;
    property OnCloseUp;
    property OnEditValueChanged;
    property OnInitPopup;
    property OnPopup;
    property OnValidate;
  end;

  { TcxDateEditPopupWindow }

  TcxDateEditPopupWindow = class(TcxPopupEditPopupWindow)
  protected
    procedure KeyDown(var Key: Word; Shift: TShiftState); override;
    function IsPopupCalendarKey(Key: Word; Shift: TShiftState): Boolean; virtual;
  public
    constructor Create(AOwnerControl: TWinControl); override;
  end;

  { TcxDateEditMaskStandardMode }

  TcxDateEditMaskStandardMode = class(TcxMaskEditStandardMode)
  protected
    function GetBlank(APos: Integer): Char; override;
  end;

  { TcxCustomDateEdit }

  TcxCustomDateEdit = class(TcxCustomPopupEdit)
  private
    FDateDropDown: TDateTime;
    FSavedTime: TDateTime;
    procedure DateChange(Sender: TObject);
    function GetActiveProperties: TcxCustomDateEditProperties;
    function GetCurrentDate: TDateTime;
    function GetProperties: TcxCustomDateEditProperties;
    function GetRecognizableDisplayValue(ADate: TDateTime): TcxEditValue;
    procedure SetProperties(Value: TcxCustomDateEditProperties);
  protected
    FCalendar: TcxPopupCalendar;
    function CanSynchronizeModeText: Boolean; override;
    procedure CheckEditorValueBounds; override;
    procedure CreatePopupWindow; override;
//    procedure DoEditKeyDown(var Key: Word; Shift: TShiftState); override;
    procedure DropDown; override;
    procedure Initialize; override;
    procedure InitializePopupWindow; override;
    function InternalGetEditingValue: TcxEditValue; override;
    function InternalGetText: string; override;
    procedure InternalSetEditValue(const Value: TcxEditValue;
      AValidateEditValue: Boolean); override;
    function InternalSetText(const Value: string): Boolean; override;
    procedure InternalValidateDisplayValue(const ADisplayValue: TcxEditValue); override;
    function IsCharValidForPos(var AChar: Char; APos: Integer): Boolean; override;
    procedure PopupWindowClosed(Sender: TObject); override;
    procedure PopupWindowShowed(Sender: TObject); override;
    procedure UpdateTextFormatting; override;
    procedure CreateCalendar; virtual;
    function GetCalendarClass: TcxPopupCalendarClass; virtual;
    function GetDate: TDateTime; virtual;
    function GetDateFromStr(const S: string): TDateTime;
    procedure SetDate(Value: TDateTime); virtual;
    procedure SetupPopupWindow; override;
    property Calendar: TcxPopupCalendar read FCalendar;
  public
    destructor Destroy; override;
    procedure Clear; override;
    class function GetPropertiesClass: TcxCustomEditPropertiesClass; override;
    procedure PrepareEditValue(const ADisplayValue: TcxEditValue;
      out EditValue: TcxEditValue; AEditFocused: Boolean); override;
    property ActiveProperties: TcxCustomDateEditProperties read GetActiveProperties;
    property CurrentDate: TDateTime read GetCurrentDate;
    property Date: TDateTime read GetDate write SetDate stored False;
    property Properties: TcxCustomDateEditProperties read GetProperties
      write SetProperties;
  end;

  { TcxDateEdit }

  TcxDateEdit = class(TcxCustomDateEdit)
  private
    function GetActiveProperties: TcxDateEditProperties;
    function GetProperties: TcxDateEditProperties;
    procedure SetProperties(Value: TcxDateEditProperties);
  public
    class function GetPropertiesClass: TcxCustomEditPropertiesClass; override;
    property ActiveProperties: TcxDateEditProperties read GetActiveProperties;
  published
    property Anchors;
    property AutoSize;
    property BeepOnEnter;
    property BiDiMode;
    property Constraints;
    property DragCursor;
    property DragKind;
    property Date;
    property DragMode;
    property EditValue;
    property Enabled;
    property ImeMode;
    property ImeName;
    property ParentBiDiMode;
    property ParentColor;
    property ParentFont;
    property ParentShowHint;
    property PopupMenu;
    property Properties: TcxDateEditProperties read GetProperties
      write SetProperties;
    property ShowHint;
    property Style;
    property StyleDisabled;
    property StyleFocused;
    property StyleHot;
    property TabOrder;
    property TabStop default True;
    property Visible;
    property OnClick;
  {$IFDEF DELPHI5}
    property OnContextPopup;
  {$ENDIF}
    property OnDblClick;
    property OnDragDrop;
    property OnDragOver;
    property OnEditing;
    property OnEndDock;
    property OnEndDrag;
    property OnEnter;
    property OnExit;
    property OnKeyDown;
    property OnKeyPress;
    property OnKeyUp;
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
    property OnStartDrag;
    property OnStartDock;
  end;

  { TcxFilterDateEditHelper }

  TcxFilterDateEditHelper = class(TcxFilterDropDownEditHelper)
  public
    class function GetFilterEditClass: TcxCustomEditClass; override;
    class function GetSupportedFilterOperators(
      AProperties: TcxCustomEditProperties;
      AValueTypeClass: TcxValueTypeClass;
      AExtendedSet: Boolean = False): TcxFilterControlOperators; override;
    class procedure InitializeProperties(AProperties,
      AEditProperties: TcxCustomEditProperties; AHasButtons: Boolean); override;
  end;

function cxEditIsDateValid(ADate: Double): Boolean;
function VarIsNullDate(const AValue: Variant): Boolean;

implementation

uses
  Math,
  dxOffice11, dxThemeConsts, dxThemeManager, dxUxTheme,
  cxEditPaintUtils, cxEditUtils, cxLookAndFeelPainters,
  cxLookAndFeels, cxSpinEdit, cxVariants;

type
  TDelimiterOffset = record
    Left, Right: Integer;
  end;

const
  cxEditTimeFormatA: array [TcxTimeEditTimeFormat, Boolean] of string = (
    ('hh:nn:ss ampm', 'hh:nn:ss'),
    ('hh:nn ampm', 'hh:nn'),
    ('hh ampm', 'hh')
  );
  DateNavigatorTime = 200;
  Office11HeaderOffset = 2;

  WeekNumbersDelimiterOffset: TDelimiterOffset = (Left: 3; Right: 1);
  WeekNumbersDelimiterWidth = 1;

function cxEditIsDateValid(ADate: Double): Boolean;
begin
  Result := (ADate = NullDate) or
    ((ADate >= cxMinDateTime) and (ADate <= cxMaxDateTime));
end;

function VarIsNullDate(const AValue: Variant): Boolean;
begin
  Result := (VarIsDate(AValue) or VarIsNumericEx(AValue)) and (AValue = NullDate);
end;

function cxEncodeDate(AYear, AMonth, ADay: Word): Double;
begin
  if (AYear < MinYear) or (AYear > MaxYear) or
    (AMonth < 1) or (AMonth > 12) or
    (ADay < 1) or (ADay > DaysInAMonth(AYear, AMonth)) then
    Result := InvalidDate
  else
    Result := EncodeDate(AYear, AMonth, ADay);
end;

procedure GetTimeFormat(const ADateTimeFormatInfo: TcxDateTimeFormatInfo;
  out ATimeFormat: TcxTimeEditTimeFormat; out AUse24HourFormat: Boolean);

  function GetFormatInfoItemIndex(
    AItemKind: TcxDateTimeFormatItemKind): Integer;
  var
    I: Integer;
  begin
    Result := -1;
    for I := 0 to Length(ADateTimeFormatInfo.Items) - 1 do
      if ADateTimeFormatInfo.Items[I].Kind = AItemKind then
      begin
        Result := I;
        Break;
      end;
  end;

var
  AFormatInfoItemIndex: Integer;
begin
  if GetFormatInfoItemIndex(dtikSec) <> -1 then
    ATimeFormat := tfHourMinSec
  else if GetFormatInfoItemIndex(dtikMin) <> -1 then
    ATimeFormat := tfHourMin
  else if GetFormatInfoItemIndex(dtikHour) <> -1 then
    ATimeFormat := tfHour
  else
    ATimeFormat := tfHourMinSec;

  AFormatInfoItemIndex := GetFormatInfoItemIndex(dtikHour);
  if AFormatInfoItemIndex <> -1 then
    AUse24HourFormat := Copy(ADateTimeFormatInfo.Items[AFormatInfoItemIndex].Data, 1, 2) = '24'
  else
    AUse24HourFormat := False;
end;

procedure TrueTextRect(ACanvas: TCanvas; R: TRect; X, Y: Integer;
  const Text: WideString);
begin
  ACanvas.TextRect(R, X, Y, Text);
end;

{ TcxClock }

constructor TcxClock.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FMinuteDotColor := clWindow;
end;

procedure TcxClock.Paint;
begin
  LookAndFeel.Painter.DrawClock(Canvas, ClientRect, TDateTime(FTime), Color);
end;

procedure TcxClock.SetMinuteDotColor(Value: TColor);
begin
  if Value <> FMinuteDotColor then
  begin
    FMinuteDotColor := Value;
    Invalidate;
  end;
end;

procedure TcxClock.SetTime(Value: TTime);
begin
  Value := Frac(Value);
  if Value <> FTime then
  begin
    FTime := Value;
    Invalidate;
  end;
end;

{ TcxMonthListBox }

constructor TcxMonthListBox.Create(AOwnerControl: TWinControl);
begin
  inherited Create(AOwnerControl);
  ControlStyle := [csCaptureMouse, csOpaque];
  if not ShowYears then
    ControlStyle := ControlStyle + [csClickEvents];
  FTimer := TcxTimer.Create(nil);
  FTimer.Enabled := False;
  FTimer.Interval := 200;
  FTimer.OnTimer := DoTimer;
  Adjustable := False;
  BorderStyle := pbsFlat;
end;

destructor TcxMonthListBox.Destroy;
begin
  FreeAndNil(FTimer);
  inherited Destroy;
end;

procedure TcxMonthListBox.CloseUp;
var
  ADate: TDateTime;
begin
  if GetCaptureControl = Self then
    SetCaptureControl(nil);
  if not Visible then
    Exit;
  inherited CloseUp;
  FTimer.Enabled := False;
  if ShowYears then
  begin
    ADate := GetDate;
    if ADate <> NullDate then
      Calendar.SetFirstDate(ADate);
  end;
end;

procedure TcxMonthListBox.Popup(AFocusedControl: TWinControl);
var
  R: TRect;
begin
  FCurrentDate := CalendarTable.FromDateTime(Calendar.FirstDate);
  if ShowYears then
    FItemCount := 7
  else
    FItemCount := CalendarTable.GetMonthsInYear(FCurrentDate.Year);
  Font := Calendar.Font;
  FontChanged;
  if ShowYears then
    TopMonthDelta := -3
  else
    TopMonthDelta := 1 - FCurrentDate.Month;
  R := Calendar.FViewInfo.MonthRegion;
  R.TopLeft := Calendar.ClientToScreen(R.TopLeft);
  R.BottomRight := Calendar.ClientToScreen(R.BottomRight);
  FOrigin.X := R.Left + (R.Right - R.Left - Self.Width) div 2;
  FOrigin.Y := (R.Top + R.Bottom) div 2 - Self.Height div 2;
  FItemIndex := -1;
  inherited Popup(AFocusedControl);
end;

procedure TcxMonthListBox.DoTimer(Sender: TObject);
begin
  TopMonthDelta := TopMonthDelta + FSign;
end;

function TcxMonthListBox.GetCalendar: TcxCustomCalendar;
begin
  Result := TcxCustomCalendar(OwnerControl);
end;

function TcxMonthListBox.GetCalendarTable: TcxCustomCalendarTable;
begin
  Result := TcxCustomCalendar(OwnerControl).CalendarTable;
end;

function TcxMonthListBox.GetDate: TDateTime;
var
  ADate: TcxDateTime;
begin
  if ItemIndex = -1 then Result := NullDate
  else
    with CalendarTable do
    begin
      ADate := FromDateTime(AddMonths(FCurrentDate, TopMonthDelta + ItemIndex));
      ADate.Day := 1;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?