dts:tdatasource);
var
datestr,mark,str:string;
markpos1,markpos2:integer;
dateord:tdateorder;
dateflag,step:integer;
oldselstart:integer;
begin
if shift<>[] then exit;
if not (key in [vk_up,vk_down] ) then exit;
if (dts<>nil ) and (not dts.dataset.active ) then exit;
if (dts<>nil ) and (not dts.dataset.modified) then
dts.dataset.edit;
oldselstart:=edit.selstart;
datestr:=edit.edittext;
mark:=getdatemark(datestr);
markpos1:=pos(mark,datestr);
str:=copy(datestr,markpos1+1,length(datestr)-markpos1);
markpos2:=markpos1+pos(mark,str);
dateord:=getdateorder(shortdateformat);
dateflag:=getdateflag(markpos1,markpos2,edit.selstart,dateord);
if key=vk_up then step:=1
else if key=vk_down then step:=-1
else step:=0;
case dateflag of
1: edit.date := incyear(edit.date ,step);
2: edit.date := incmonth(edit.date ,step);
3: edit.date := incday(edit.date ,step);
end;
edit.selstart :=oldselstart;
end;
此函数在组件的onkeydown事件中调用,对于tdateedit,datasoure参数为nil。
记着引用rx的单元tooledit和dateutil。
调用示例:
procedure tform1.dateedit1keydown(sender: tobject; var key: word;
shift: tshiftstate);
begin
mxspinrxdateedit(sender as tcustomdateedit,key,shift,nil);
end;
procedure tform1.dbdateedit1keydown(sender: tobject; var key: word;
shift: tshiftstate);
begin
mxspinrxdateedit(sender as tcustomdateedit,key,shift,(sender as tdbdateedit).datasource);
end;