dbplannerdatepicker.pas
来自「tms25_vcl TMS公司出品的与INTRAWEBSH相关控件」· PAS 代码 · 共 269 行
PAS
269 行
{***********************************************************************}
{ TDBPlannerDatePicker component }
{ for Delphi 3.0,4.0,5.0,6.0 & C++ Builder 3.0, 4.0, 5.0 }
{ version 1.0 }
{***********************************************************************}
{$I TMSDEFS.INC}
unit DBPlannerDatePicker;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, EditBtn, ExtCtrls, PlannerCal, DBPlannerCal;
type
TDBPlannerDatePicker = class(TEditBtn)
private
FPlannerCalendar: TDBPlannerCalendar;
APlannerCalendar: TDBPlannerCalendar;
PlannerParent : TForm;
CancelThisBtnClick : Boolean;
FHideCalendarAfterSelection: boolean;
function GetOnGetDateHint: TGetDateEvent;
function GetOnGetDateHintString: TGetDateEventHint;
procedure SetOnGetDateHint(const Value: TGetDateEvent);
procedure SetOnGetDateHintString(const Value: TGetDateEventHint);
procedure HideParent;
{ Private declarations }
protected
{ Protected declarations }
procedure BtnClick(Sender: TObject); override;
procedure PlannerParentDeactivate(Sender: TObject);
procedure PlannerCalendarDaySelect(Sender: TObject; SelDate: TDateTime);
procedure PlannerCalendarKeyPress(Sender: TObject; var Key: Char);
procedure PlannerCalendarKeyDown(Sender: TObject; var Key: Integer;
Shift: TShiftState);
procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
// methods to do correct streaming, because the planner calendar is
// stored on a hidden form
procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
function GetChildParent : TComponent; override;
function GetChildOwner : TComponent; override;
procedure Loaded; override;
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
procedure CancelBtnClick;
destructor Destroy; override;
published
{ Published declarations }
property Calendar : TDBPlannerCalendar read FPlannerCalendar
write FPlannerCalendar;
property HideCalendarAfterSelection : boolean read FHideCalendarAfterSelection
write FHideCalendarAfterSelection;
property OnGetDateHint: TGetDateEvent read GetOnGetDateHint
write SetOnGetDateHint;
property OnGetDateHintString: TGetDateEventHint read GetOnGetDateHintString
write SetOnGetDateHintString;
end;
implementation
{ TDBPlannerDatePicker }
procedure TDBPlannerDatePicker.BtnClick(Sender: TObject);
var
PlannerPosition : TPoint;
begin
CancelThisBtnClick := False;
inherited;
// call event OnClick - the user can cancel calendar appearance of calendar by calling .CancelBtnClick
if CancelThisBtnClick then
Exit;
// Set planner position
PlannerPosition.x := 0;
PlannerPosition.y := Height;
PlannerPosition := ClientToScreen(PlannerPosition);
PlannerParent.Left := PlannerPosition.x;
PlannerParent.Top := PlannerPosition.y;
// Set planner date
if FPlannerCalendar.MultiSelect then
Text := FPlannerCalendar.DatesAsText
else
begin
try
if Text = '' then
FPlannerCalendar.Date := Now
else
FPlannerCalendar.Date := StrToDate(Text);
except
on Exception do
Text := FPlannerCalendar.DatesAsText;
end;
end;
PlannerParent.Show;
FPlannerCalendar.SetFocus;
end;
procedure TDBPlannerDatePicker.CancelBtnClick;
begin
CancelThisBtnClick := True;
end;
constructor TDBPlannerDatePicker.Create(AOwner: TComponent);
begin
inherited;
// Make planner parent form and a planner, put planner on parent form
Text := '';
PlannerParent := TForm.Create(Self);
PlannerParent.BorderStyle := bsNone;
FPlannerCalendar := TDBPlannerCalendar.Create(Self);
FPlannerCalendar.Parent := PlannerParent;
{$IFDEF DELPHI4_LVL}
PlannerParent.Autosize := True;
{$ELSE}
PlannerParent.Width := FPlannerCalendar.Width;
PlannerParent.Height := FPlannerCalendar.Height;
{$ENDIF}
PlannerParent.OnDeactivate := PlannerParentDeactivate;
FPlannerCalendar.OnDaySelect := PlannerCalendarDaySelect;
Width := FPlannerCalendar.Width;
FHideCalendarAfterSelection := True;
Button.Glyph.Handle := LoadBitmap(0, MakeIntResource(OBM_COMBO));
// Make the button NOT change the focus
Button.FocusControl := nil;
end;
destructor TDBPlannerDatePicker.Destroy;
begin
FPlannerCalendar.Free;
PlannerParent.Free;
inherited;
end;
function TDBPlannerDatePicker.GetChildOwner: TComponent;
begin
Result := PlannerParent;
end;
function TDBPlannerDatePicker.GetChildParent: TComponent;
begin
Result := PlannerParent;
end;
procedure TDBPlannerDatePicker.GetChildren(Proc: TGetChildProc; Root: TComponent);
begin
inherited;
Proc(FPlannerCalendar);
FPlannerCalendar.Parent := PlannerParent;
end;
function TDBPlannerDatePicker.GetOnGetDateHint: TGetDateEvent;
begin
Result := FPlannerCalendar.OnGetDateHint;
end;
function TDBPlannerDatePicker.GetOnGetDateHintString: TGetDateEventHint;
begin
Result := FPlannerCalendar.OnGetDateHintString;
end;
procedure TDBPlannerDatePicker.HideParent;
begin
PlannerParent.Hide;
SetFocus;
end;
procedure TDBPlannerDatePicker.KeyDown(var Key: Word; Shift: TShiftState);
begin
inherited;
if key = VK_F4 then
if PlannerParent.Visible then
HideParent
else
BtnClick(Self);
end;
procedure TDBPlannerDatePicker.Loaded;
begin
inherited;
outputdebugstring('loaded picker');
if FPlannerCalendar.Color = clWhite then
outputdebugstring('is white');
if PlannerParent.ComponentCount > 0 then
begin
APlannerCalendar := (PlannerParent.Components[0] as TDBPlannerCalendar);
APlannerCalendar.OnDaySelect := PlannerCalendarDaySelect;
APlannerCalendar.OnGetDateHint := FPlannerCalendar.OnGetDateHint;
APlannerCalendar.OnGetDateHintString := FPlannerCalendar.OnGetDateHintString;
APlannerCalendar.OnKeyPress := PlannerCalendarKeypress;
FPlannerCalendar.Free;
FPlannerCalendar := APlannerCalendar;
end;
end;
procedure TDBPlannerDatePicker.PlannerCalendarDaySelect(Sender: TObject; SelDate: TDateTime);
begin
Text := FPlannerCalendar.DatesAsText;
if FHideCalendarAfterSelection then
HideParent;
end;
procedure TDBPlannerDatePicker.PlannerCalendarKeyDown(Sender: TObject;
var Key: Integer; Shift: TShiftState);
begin
if Key = VK_F4 then
HideParent;
end;
procedure TDBPlannerDatePicker.PlannerCalendarKeyPress(Sender: TObject;
var Key: Char);
begin
if Key = #13 then
begin
PlannerCalendarDaySelect(Sender, FPlannerCalendar.Date);
end;
if Key = #27 then
begin
HideParent;
end;
end;
procedure TDBPlannerDatePicker.PlannerParentDeactivate(Sender: TObject);
begin
(Sender as TForm).Hide;
end;
procedure TDBPlannerDatePicker.SetOnGetDateHint(const Value: TGetDateEvent);
begin
FPlannerCalendar.OnGetDateHint := Value;
end;
procedure TDBPlannerDatePicker.SetOnGetDateHintString(
const Value: TGetDateEventHint);
begin
FPlannerCalendar.OnGetDateHintString := Value;
end;
procedure TDBPlannerDatePicker.WMSetFocus(var Message: TWMSetFocus);
begin
if EditorEnabled then
inherited
else
Button.SetFocus;
end;
initialization
RegisterClass(TDBPlannerCalendar);
end.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?