📄 tntjvpickdate.pas
字号:
FMinDate := Value;
if FDate < FMinDate then
SetCalendarDate(FMinDate)
;
// else
UpdateCalendar;
end;
end;
procedure TTntJvCalendar.SetMaxDate(Value: TDateTime);
begin
if FMaxDate <> Value then
begin
FMaxDate := Value;
if FDate > FMaxDate then
SetCalendarDate(FMaxDate);
// else
UpdateCalendar;
end;
end;
function TTntJvCalendar.GetCellDate(ACol, ARow: Integer): TDateTime;
var
DayNum: Integer;
begin
Result := NullDate;
if (ARow > 0) and (GetCellText(ACol, ARow) <> '') then
begin
DayNum := FMonthOffset + ACol + (ARow - 1) * 7;
if (DayNum < 1) or (DayNum > DaysThisMonth) then
Result := NullDate
else
Result := EncodeDate(GetDateElement(1), GetDateElement(2), DayNum);
end;
end;
function TTntJvCalendar.CellInRange(ACol, ARow: Integer): Boolean;
begin
if (Row < 1) {or ((FMinDate = NullDate) and (FMaxDate = NullDate))} then
Result := True
else
Result := DateInRange(GetCellDate(ACol, ARow));
end;
function TTntJvCalendar.DateInRange(ADate: TDateTime): Boolean;
begin
if ((FMinDate = NullDate) and (FMaxDate = NullDate)) or (ADate = NullDate) then
Result := True
else
begin
Result := False;
if ADate = NullDate then
Result := True
else
if (FMinDate <> NullDate) and (FMaxDate <> NullDate) then
Result := (ADate >= FMinDate) and (ADate <= FMaxDate)
else
if FMinDate <> NullDate then
Result := ADate >= FMinDate
else
if FMaxDate <> NullDate then
Result := ADate <= FMaxDate
end;
end;
//<Polaris
procedure TTntJvCalendar.KeyDown(var Key: Word; Shift: TShiftState);
//>Polaris
var
OldDay: Integer;
//<Polaris
begin
OldDay := Day;
if Shift = [] then
case Key of
VK_LEFT, VK_SUBTRACT:
begin
if Day > 1 then
Day := Day - 1
else
CalendarDate := CalendarDate - 1;
if not DateInRange(FDate) then
Day := OldDay;
Exit;
end;
VK_RIGHT, VK_ADD:
begin
if Day < DaysThisMonth then
Day := Day + 1
else
CalendarDate := CalendarDate + 1;
if not DateInRange(FDate) then
Day := OldDay;
Exit;
end;
end;
inherited KeyDown(Key, Shift);
end;
procedure TTntJvCalendar.KeyPress(var Key: Char);
begin
if Key in ['T', 't'] then
begin
CalendarDate := Trunc(Now);
Key := #0;
end;
inherited KeyPress(Key);
end;
function TTntJvCalendar.SelectCell(ACol, ARow: Longint): Boolean;
begin
if ((not FUpdating) and FReadOnly) or (CellText[ACol, ARow] = '') or
//>Polaris
not CellInRange(ACol, ARow) then {//<Polaris}
Result := False
else
Result := inherited SelectCell(ACol, ARow);
end;
procedure TTntJvCalendar.SetCalendarDate(Value: TDateTime);
begin
//if FDate <> Value then
//begin
if (FMinDate <> NullDate) and (Value < FMinDate) then
Value := FMinDate
else
if (FMaxDate <> NullDate) and (Value > FMaxDate) then
Value := FMaxDate;
FDate := Value;
UpdateCalendar;
Change;
//end;
end;
function TTntJvCalendar.StoreCalendarDate: Boolean;
begin
Result := not FUseCurrentDate;
end;
function TTntJvCalendar.GetDateElement(Index: Integer): Integer;
var
AYear, AMonth, ADay: Word;
begin
DecodeDate(FDate, AYear, AMonth, ADay);
case Index of
1:
Result := AYear;
2:
Result := AMonth;
3:
Result := ADay;
else
Result := -1;
end;
end;
procedure TTntJvCalendar.SetDateElement(Index: Integer; Value: Integer);
var
iValue: Word;
TYear, TMonth, TDay: Word;
AYear, AMonth, ADay: Word;
//>Polaris
TmpDate: TDateTime;
//<Polaris
begin
if Value > 0 then
begin
DecodeDate(FDate, AYear, AMonth, ADay);
iValue := Value;
case Index of
1:
begin
//>Polaris
if FMinDate <> NullDate then
begin
DecodeDate(FMinDate, TYear, TMonth, TDay);
if Value < TYear then
Value := TYear;
if (Value = TYear) and (AMonth < TMonth) then
AMonth := TMonth;
if (Value = TYear) and (AMonth = TMonth) and (ADay < TDay) then
ADay := TDay;
end;
if FMaxDate <> NullDate then
begin
DecodeDate(FMaxDate, TYear, TMonth, TDay);
if Value > TYear then
Value := TYear;
if (Value = TYear) and (AMonth > TMonth) then
AMonth := TMonth;
if (Value = TYear) and (AMonth = TMonth) and (ADay > TDay) then
ADay := TDay;
end;
//<Polaris
if AYear <> Value then
AYear := Value
else
Exit;
end;
2:
if (Value <= 12) and (Value <> AMonth) then
begin
//>Polaris
if FMinDate <> NullDate then
begin
DecodeDate(FMinDate, TYear, TMonth, TDay);
if (AYear = TYear) and (Value < TMonth) then
Value := TMonth;
if (Value = TYear) and (AMonth = TMonth) and (ADay < TDay) then
ADay := TDay;
end;
if FMaxDate <> NullDate then
begin
DecodeDate(FMaxDate, TYear, TMonth, TDay);
if (AYear = TYear) and (Value > TMonth) then
Value := TMonth;
if (Value = TYear) and (AMonth = TMonth) and (ADay > TDay) then
ADay := TDay;
end;
//<Polaris
AMonth := Value;
if ADay > DaysPerMonth(Year, Value) then
ADay := DaysPerMonth(Year, Value);
//>Polaris
{
TmpDate := EncodeDate(AYear, AMonth, ADay);
if (FMinDate <> NullDate) and (TmpDate < FMinDate) then DecodeDate(FMinDate, TYear, TMonth, ADay);
if (FMaxDate <> NullDate) and (TmpDate > FMaxDate) then DecodeDate(FMaxDate, TYear, TMonth, ADay)
}
//<Polaris
end
else
Exit;
3:
if (Value <= DaysThisMonth) and (Value <> ADay) then
begin
//>Polaris
TmpDate := EncodeDate(AYear, AMonth, Value);
if (FMinDate <> NullDate) and (TmpDate < FMinDate) then
DecodeDate(FMinDate, TYear, TMonth, iValue);
if (FMaxDate <> NullDate) and (TmpDate > FMaxDate) then
DecodeDate(FMaxDate, TYear, TMonth, iValue);
//<Polaris
ADay := iValue
end
else
Exit;
else
Exit;
end;
FDate := EncodeDate(AYear, AMonth, ADay);
FUseCurrentDate := False;
CalendarUpdate(Index = 3);
Change;
end;
end;
procedure TTntJvCalendar.SetWeekendColor(Value: TColor);
begin
if Value <> FWeekendColor then
begin
FWeekendColor := Value;
Invalidate;
end;
end;
procedure TTntJvCalendar.SetWeekends(Value: TDaysOfWeek);
begin
if Value <> FWeekends then
begin
FWeekends := Value;
UpdateCalendar;
end;
end;
function TTntJvCalendar.IsWeekend(ACol, ARow: Integer): Boolean;
begin
Result := TDayOfWeekName((Integer(StartOfWeek) + ACol) mod 7) in FWeekends;
end;
procedure TTntJvCalendar.SetStartOfWeek(Value: TDayOfWeekName);
begin
if Value <> FStartOfWeek then
begin
FStartOfWeek := Value;
UpdateCalendar;
end;
end;
procedure TTntJvCalendar.SetUseCurrentDate(Value: Boolean);
begin
if Value <> FUseCurrentDate then
begin
FUseCurrentDate := Value;
if Value then
begin
FDate := Date; { use the current date, then }
UpdateCalendar;
end;
end;
end;
{ Given a value of 1 or -1, moves to Next or Prev month accordingly }
procedure TTntJvCalendar.ChangeMonth(Delta: Integer);
var
AYear, AMonth, ADay: Word;
NewDate: TDateTime;
CurDay: Integer;
begin
DecodeDate(FDate, AYear, AMonth, ADay);
CurDay := ADay;
if Delta > 0 then
ADay := DaysPerMonth(AYear, AMonth)
else
ADay := 1;
NewDate := EncodeDate(AYear, AMonth, ADay);
NewDate := NewDate + Delta;
DecodeDate(NewDate, AYear, AMonth, ADay);
if DaysPerMonth(AYear, AMonth) > CurDay then
ADay := CurDay
else
ADay := DaysPerMonth(AYear, AMonth);
CalendarDate := EncodeDate(AYear, AMonth, ADay);
end;
procedure TTntJvCalendar.PrevMonth;
begin
ChangeMonth(-1);
end;
procedure TTntJvCalendar.NextMonth;
begin
ChangeMonth(1);
end;
procedure TTntJvCalendar.NextYear;
begin
if IsLeapYear(Year) and (Month = 2) and (Day = 29) then
Day := 28;
Year := Year + 1;
end;
procedure TTntJvCalendar.PrevYear;
begin
if IsLeapYear(Year) and (Month = 2) and (Day = 29) then
Day := 28;
Year := Year - 1;
end;
procedure TTntJvCalendar.CalendarUpdate(DayOnly: Boolean);
var
AYear, AMonth, ADay: Word;
FirstDate: TDateTime;
begin
FUpdating := True;
try
DecodeDate(FDate, AYear, AMonth, ADay);
FirstDate := EncodeDate(AYear, AMonth, 1);
FMonthOffset := 2 - ((DayOfWeek(FirstDate) - Ord(StartOfWeek) + 7) mod 7);
{ day of week for 1st of month }
if FMonthOffset = 2 then
FMonthOffset := -5;
MoveColRow((ADay - FMonthOffset) mod 7, (ADay - FMonthOffset) div 7 + 1,
False, False);
if DayOnly then
Update
else
Invalidate;
finally
FUpdating := False;
end;
end;
procedure TTntJvCalendar.UpdateCalendar;
begin
CalendarUpdate(False);
end;
procedure TTntJvCalendar.BoundsChanged;
var
GridLinesH, GridLinesW: Integer;
begin
GridLinesH := 6 * GridLineWidth;
if (goVertLine in Options) or (goFixedVertLine in Options) then
GridLinesW := 6 * GridLineWidth
else
GridLinesW := 0;
DefaultColWidth := (Width - GridLinesW) div 7;
DefaultRowHeight := (Height - GridLinesH) div 7;
inherited BoundsChanged;
end;
//=== { TJvLocCalendar } =====================================================
type
TJvLocCalendar = class(TTntJvCalendar)
protected
procedure EnabledChanged; override;
procedure ParentColorChanged; override;
{$IFDEF VCL}
procedure CreateParams(var Params: TCreateParams); override;
{$ENDIF VCL}
procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); override;
public
constructor Create(AOwner: TComponent); override;
procedure MouseToCell(X, Y: Integer; var ACol, ARow: Longint);
property GridLineWidth;
property DefaultColWidth;
property DefaultRowHeight;
end;
constructor TJvLocCalendar.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := [csCaptureMouse, csClickEvents, csDoubleClicks];
ControlStyle := ControlStyle + [csReplicatable];
{$IFDEF VCL}
Ctl3D := False;
{$ENDIF VCL}
Enabled := False;
BorderStyle := bsNone;
ParentColor := True;
CalendarDate := Trunc(Now);
UseCurrentDate := False;
FixedColor := Self.Color;
Options := [goFixedHorzLine];
TabStop := False;
end;
procedure TJvLocCalendar.ParentColorChanged;
begin
inherited ParentColorChanged;
if ParentColor then
FixedColor := Self.Color;
end;
procedure TJvLocCalendar.EnabledChanged;
begin
inherited EnabledChanged;
if HandleAllocated and not (csDesigning in ComponentState) then
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -