📄 tntjvpickdate.pas
字号:
Position := poScreenCenter;
ShowHint := True;
KeyPreview := True;
Control := TTntPanel.Create(Self);
with Control as TTntPanel do
begin
Parent := Self;
SetBounds(0, 0, 222, 22);
Align := alTop;
BevelOuter := bvNone;
BevelInner := bvNone;
ParentColor := True;
ParentFont := True;
end;
TitleLabel := TTntLabel.Create(Self);
with TitleLabel do
begin
Parent := Control;
SetBounds(35, 4, 152, 14);
Alignment := taCenter;
AutoSize := False;
Caption := '';
ParentFont := True;
Font.Color := clNavy;
Font.Style := [fsBold];
Transparent := True;
OnDblClick := TopPanelDblClick;
end;
FBtns[0] := TTntJvTimerSpeedButton.Create(Self);
with FBtns[0] do
begin
Parent := Control;
SetBounds(3, 3, 16, 16);
CreateButtonGlyph(Glyph, 0);
OnClick := PrevYearBtnClick;
Flat := True;
Hint := RsPrevYearHint;
end;
FBtns[1] := TTntJvTimerSpeedButton.Create(Self);
with FBtns[1] do
begin
Parent := Control;
SetBounds(19, 3, 16, 16);
CreateButtonGlyph(Glyph, 1);
OnClick := PrevMonthBtnClick;
Flat := True;
Hint := RsPrevMonthHint;
end;
FBtns[2] := TTntJvTimerSpeedButton.Create(Self);
with FBtns[2] do
begin
Parent := Control;
SetBounds(188, 3, 16, 16);
CreateButtonGlyph(Glyph, 2);
OnClick := NextMonthBtnClick;
Flat := True;
Hint := RsNextMonthHint;
end;
FBtns[3] := TTntJvTimerSpeedButton.Create(Self);
with FBtns[3] do
begin
Parent := Control;
SetBounds(204, 3, 16, 16);
CreateButtonGlyph(Glyph, 3);
OnClick := NextYearBtnClick;
Flat := True;
Hint := RsNextYearHint;
end;
Control := TTntPanel.Create(Self);
with Control as TTntPanel do
begin
Parent := Self;
SetBounds(0, 133, 222, 25); // Polaris
Align := alBottom;
BevelInner := bvNone;
BevelOuter := bvNone;
ParentFont := True;
ParentColor := True;
end;
{ with TTntButton.Create(Self) do
begin
Parent := Control;
SetBounds(0, 0, 112, 21);
Caption := ResStr(SOKButton);
ModalResult := mrOk;
end;
with TTntButton.Create(Self) do
begin
Parent := Control;
SetBounds(111, 0, 111, 21);
Caption := ResStr(SCancelButton);
ModalResult := mrCancel;
Cancel := True;
end; }// Polaris
with TTntButton.Create(Self) do
begin // Polaris
Parent := Control;
SetBounds(0, 0, 111, 25);
Default := True;
ModalResult := mrOk;
Caption := RsButtonOKCaption;
// Kind := bkOk;
end;
with TTntButton.Create(Self) do
begin // Polaris
Parent := Control;
SetBounds(111, 0, 111, 25);
Cancel := True;
ModalResult := mrCancel;
Caption := RsButtonCancelCaption;
// Kind := bkCancel;
end;
Control := TTntPanel.Create(Self);
with Control as TTntPanel do
begin
Parent := Self;
SetBounds(0, 22, 222, 111);
Align := alClient;
BevelInner := bvLowered;
ParentFont := True;
ParentColor := True;
end;
Calendar := TTntJvCalendar.Create(Self);
with Calendar do
begin
Parent := Control;
Align := alClient;
ParentFont := True;
SetBounds(2, 2, 218, 113);
Color := clWhite;
TabOrder := 0;
UseCurrentDate := False;
Options := Options - [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine];
OnChange := CalendarChange;
OnDblClick := CalendarDblClick;
end;
OnKeyDown := FormKeyDown;
Calendar.CalendarDate := Trunc(Now);
ActiveControl := Calendar;
end;
{$IFDEF VisualCLX}
function TJvSelectDateDlg.WidgetFlags: Integer;
begin
Result := inherited WidgetFlags;
end;
{$ENDIF VisualCLX}
procedure TJvSelectDateDlg.SetDate(Date: TDateTime);
begin
if Date = NullDate then
Date := SysUtils.Date;
try
Calendar.CalendarDate := Date;
CalendarChange(nil);
except
Calendar.CalendarDate := SysUtils.Date;
end;
end;
function TJvSelectDateDlg.GetDate: TDateTime;
begin
Result := Calendar.CalendarDate;
end;
procedure TJvSelectDateDlg.TopPanelDblClick(Sender: TObject);
begin
SetDate(Trunc(Now));
end;
procedure TJvSelectDateDlg.PrevYearBtnClick(Sender: TObject);
begin
Calendar.PrevYear;
end;
procedure TJvSelectDateDlg.NextYearBtnClick(Sender: TObject);
begin
Calendar.NextYear;
end;
procedure TJvSelectDateDlg.PrevMonthBtnClick(Sender: TObject);
begin
Calendar.PrevMonth;
end;
procedure TJvSelectDateDlg.NextMonthBtnClick(Sender: TObject);
begin
Calendar.NextMonth;
end;
//>Polaris
procedure TJvSelectDateDlg.CheckButton;
var
// CurDate: TDate;
AYear, AMonth, ADay: Word;
begin
if not Assigned(Calendar) then
Exit;
// CurDate := Calendar.CalendarDate;
if Calendar.MinDate = NullDate then
for AYear := 0 to 1 do
FBtns[AYear].Enabled := True
else
begin
DecodeDate(Calendar.MinDate, AYear, AMonth, ADay);
FBtns[0].Enabled := Calendar.Year > AYear;
FBtns[1].Enabled := (Calendar.Year > AYear) or ((Calendar.Year = AYear) and (Calendar.Month > AMonth));
end;
if Calendar.MaxDate = NullDate then
for AYear := 2 to 3 do
FBtns[AYear].Enabled := True
else
begin
DecodeDate(Calendar.MaxDate, AYear, AMonth, ADay);
FBtns[2].Enabled := (Calendar.Year < AYear) or ((Calendar.Year = AYear) and (Calendar.Month < AMonth));
FBtns[3].Enabled := Calendar.Year < AYear;
end;
end;
//<Polaris
procedure TJvSelectDateDlg.CalendarChange(Sender: TObject);
begin
TitleLabel.Caption := WideFormatDateTime('MMMM, YYYY', Calendar.CalendarDate);
//Polaris
CheckButton;
end;
procedure TJvSelectDateDlg.CalendarDblClick(Sender: TObject);
begin
ModalResult := mrOk;
end;
procedure TJvSelectDateDlg.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case Key of
VK_RETURN:
ModalResult := mrOk;
VK_ESCAPE:
ModalResult := mrCancel;
VK_NEXT:
begin
if ssCtrl in Shift then
Calendar.NextYear
else
Calendar.NextMonth;
TitleLabel.Update;
CheckButton; // Polaris
end;
VK_PRIOR:
begin
if ssCtrl in Shift then
Calendar.PrevYear
else
Calendar.PrevMonth;
TitleLabel.Update;
CheckButton; // Polaris
end;
VK_TAB:
begin
if Shift = [ssShift] then
Calendar.PrevMonth
else
Calendar.NextMonth;
TitleLabel.Update;
CheckButton; // Polaris
end;
end;
end;
{ SelectDateW routines }
function CreateDateDialogW(const DlgCaption: TWideCaption;
MinDate: TDateTime; MaxDate: TDateTime): TJvSelectDateDlg;
begin
Result := TJvSelectDateDlg.Create(Application);
try
if DlgCaption <> '' then
Result.Caption := DlgCaption;
Result.Calendar.MinDate := MinDate; // Polaris
Result.Calendar.MaxDate := MaxDate; // Polaris
if Screen.PixelsPerInch <> 96 then
begin { scale to screen res }
Result.ScaleBy(Screen.PixelsPerInch, 96);
{ The ScaleBy method does not scale the font well, so set the
font back to the original info. }
Result.Calendar.ParentFont := True;
FontSetDefault(Result.Font);
Result.Left := (Screen.Width div 2) - (Result.Width div 2);
Result.Top := (Screen.Height div 2) - (Result.Height div 2);
end;
except
Result.Free;
raise;
end;
end;
function PopupDate(var Date: TDateTime; Edit: TWinControl;
MinDate: TDateTime; MaxDate: TDateTime): Boolean;
var
D: TJvSelectDateDlg;
P: TPoint;
W, H, X, Y: Integer;
begin
Result := False;
D := CreateDateDialogW('', MinDate, MaxDate);
try
D.BorderIcons := [];
D.HandleNeeded;
D.Position := poDesigned;
W := D.Width;
H := D.Height;
P := (Edit.ClientOrigin);
Y := P.Y + Edit.Height - 1;
if (Y + H) > Screen.Height then
Y := P.Y - H + 1;
if Y < 0 then
Y := P.Y + Edit.Height - 1;
X := (P.X + Edit.Width) - W;
if X < 0 then
X := P.X;
D.Left := X;
D.Top := Y;
D.Date := Date;
if D.ShowModal = mrOk then
begin
Date := D.Date;
Result := True;
end;
finally
D.Free;
end;
end;
function SelectDateW(Sender: TWinControl; var Date: TDateTime; const DlgCaption: TWideCaption;
AStartOfWeek: TDayOfWeekName; AWeekends: TDaysOfWeek;
AWeekendColor: TColor; BtnHints: TTntStrings;
MinDate: TDateTime; MaxDate: TDateTime): Boolean;
var
D: TJvSelectDateDlg;
I: Integer;
P: TPoint; // Polaris
begin
Result := False;
D := CreateDateDialogW(DlgCaption, MinDate, MaxDate);
try
// Polaris for Popup position
if Assigned(Sender) then
with D do
begin
Position := poDesigned;
P := (Sender.ClientOrigin);
Top := P.Y + Sender.Height - 1;
if (Top + Height) > Screen.Height then
Top := P.Y - Height + 1;
if Top < 0 then
Top := P.Y + Sender.Height - 1;
Left := (P.X + Sender.Width) - Width;
if (Left + Width) > Screen.Width then
Left := Screen.Width - Width;
if Left < 0 then
Left := Max(P.X, 0);
end;
D.Date := Date;
with D.Calendar do
begin
StartOfWeek := AStartOfWeek;
Weekends := AWeekends;
WeekendColor := AWeekendColor;
end;
if BtnHints <> nil then
for I := 0 to Min(BtnHints.Count - 1, 3) do
begin
if BtnHints[I] <> '' then
D.FBtns[I].Hint := BtnHints[I];
end;
if D.ShowModal = mrOk then
begin
Date := D.Date;
Result := True;
end;
finally
D.Free;
end;
end;
function SelectDateStrW(Sender: TWinControl; var StrDate: WideString; const DlgCaption: TWideCaption;
AStartOfWeek: TDayOfWeekName; AWeekends: TDaysOfWeek;
AWeekendColor: TColor; BtnHints: TTntStrings;
MinDate: TDateTime; MaxDate: TDateTime): Boolean;
var
DateValue: TDateTime;
begin
if StrDate <> '' then
begin
if not TntTryStrToDate (StrDate, DateValue)
then DateValue := Date;
{
try
DateValue := StrToDateFmt(ShortDateFormat, StrDate);
except
DateValue := Date;
end;
}
end
else
DateValue := Date;
Result := SelectDateW(Sender, DateValue, DlgCaption, AStartOfWeek, AWeekends,
AWeekendColor, BtnHints, MinDate, MaxDate); // Polaris
if Result then
StrDate := WideFormatDateTime(ShortDateFormatW, DateValue);
end;
{$IFDEF UNITVERSIONING}
initialization
RegisterUnitVersion(HInstance, UnitVersioning);
finalization
UnregisterUnitVersion(HInstance);
{$ENDIF UNITVERSIONING}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -