unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Forms, Dialogs, ExtCtrls, StdCtrls, Unit2, Controls, ComCtrls;type TForm1 = class(TForm) DateTimePicker1: TDateTimePicker; procedure FormCreate(Sender: TObject); private FOldProc: TWndMethod; procedure NewProc(var Message: TMessage); public { Public declarations } end;var Form1: TForm1;implementationuses commctrl;{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject); begin Self.FOldProc := Self.DateTimePicker1.WindowProc; Self.DateTimePicker1.WindowProc := NewProc; Self.DateTimePicker1.DateMode := dmUpDown; Self.DateTimePicker1.MinDate := StrToDate('2006-1-1'); Self.DateTimePicker1.MaxDate := StrToDate('2009-12-31'); end;procedure TForm1.NewProc(var Message: TMessage); var TempDT: TSystemTime; begin if Message.Msg=CN_NOTIFY then begin with TWMNotify(Message).NMHdr^ do begin if code=DTN_DATETIMECHANGE then begin with PNMDateTimeChange(TWMNotify(Message).NMHdr)^ do begin if dwFlags=GDT_VALID then begin TempDT := st; if FormatDateTime('yyyymmdd',SystemTimeToDateTime(TempDT))=FormatDateTime('yyyymmdd',Self.DateTimePicker1.Date) then showmessage('ÈÕÆÚÔ½½ç'); end; end; end; end; end; Self.FOldProc(Message); end;end.
在onchange里面检测每次修改的日期是否在你设定的日期范围内?如果不在,则提示,并把修改的日期改为你的2个临界区日期值
同时在,onchange的地方检查最大,最小日期。
超过界限,报错。
这样操作,就不用改动显示的日期了。
我用的是updown模式
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Forms,
Dialogs, ExtCtrls, StdCtrls, Unit2, Controls, ComCtrls;type
TForm1 = class(TForm)
DateTimePicker1: TDateTimePicker;
procedure FormCreate(Sender: TObject);
private
FOldProc: TWndMethod;
procedure NewProc(var Message: TMessage);
public
{ Public declarations }
end;var
Form1: TForm1;implementationuses commctrl;{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
Self.FOldProc := Self.DateTimePicker1.WindowProc;
Self.DateTimePicker1.WindowProc := NewProc;
Self.DateTimePicker1.DateMode := dmUpDown;
Self.DateTimePicker1.MinDate := StrToDate('2006-1-1');
Self.DateTimePicker1.MaxDate := StrToDate('2009-12-31');
end;procedure TForm1.NewProc(var Message: TMessage);
var
TempDT: TSystemTime;
begin
if Message.Msg=CN_NOTIFY then
begin
with TWMNotify(Message).NMHdr^ do
begin
if code=DTN_DATETIMECHANGE then
begin
with PNMDateTimeChange(TWMNotify(Message).NMHdr)^ do
begin
if dwFlags=GDT_VALID then
begin
TempDT := st;
if FormatDateTime('yyyymmdd',SystemTimeToDateTime(TempDT))=FormatDateTime('yyyymmdd',Self.DateTimePicker1.Date) then
showmessage('ÈÕÆÚÔ½½ç');
end;
end;
end;
end;
end;
Self.FOldProc(Message);
end;end.
杀鸡也用大炮? 直接在onClick事件里判断一下选择的日期就可以了啥.
软件运行的框架和流程很重要,如果你做不到就是框架或者流程不够好.