你可以参考一下RAIZE的相关控件的源码,如果你想省点事情,你可以看一下
RAIZE控件包里面的TRzPopupPanel这个类,
完全满足你的要求,使用的方法如下:
procedure TRzDateTimeEdit.DisplayCalendar;
var
PopupPanel: TRzPopupPanel;
Calendar: TRzCalendar;
F: TCustomForm;
SaveAutoSelect: Boolean;
DT: TDateTime;
RangeCheck: Integer;
begin
SaveAutoSelect := AutoSelect;
AutoSelect := False;
try
F := GetParentForm( Self );
if F <> nil then
begin
PopupPanel := TRzPopupPanel.Create( Self );
try
Calendar := TRzCalendar.Create( PopupPanel );
Calendar.Parent := PopupPanel;
(*
// This is the kind of code that needs to be added to change the
// size of the calendar. Of course, would need to be more flexible.
Calendar.AutoSize := False;
Calendar.Width := 200;
Calendar.Height := 300;
*)
DT := GetDate;
if DT = 0 then
begin
Calendar.Date := SysUtils.Date;
end
else
begin
RangeCheck := DateInRange( DT );
if RangeCheck > 0 then
Calendar.Date := FMaxDate
else if RangeCheck < 0 then
Calendar.Date := FMinDate
else
Calendar.Date := DT;
end;
if FFrameVisible and not UseThemes and ( FFrameStyle = fsFlat ) or ( FFrameStyle = fsFlatBold ) then
begin
Calendar.BorderOuter := fsFlat;
Calendar.FlatColor := FFrameColor;
end;
Calendar.Visible := True;
Calendar.CalendarColors := FCalendarColors;
Calendar.OnClick := PopupPanel.Close;
// Setting FValidating to True before popping up calendar prevents the
// exceptions during reformatting if the current date is out of range
// when the focus is changed to the popup calendar.
FValidating := True;
try
if PopupPanel.Popup( Self ) then
begin
FDatePicked := True;
if Calendar.ClearClicked then
Clear
else
SetDate( Calendar.Date );
FDatePicked := False;
end;
finally
FValidating := False;
end;
finally
PopupPanel.Free;
end;
end;
finally
AutoSelect := SaveAutoSelect;
end;
end; {= TRzDateTimeEdit.DisplayCalendar =}