转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
限制并方便用户输入         ★★★★

限制并方便用户输入

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1657 更新时间:2009/4/23 18:39:06
in [vk_delete,vk_back,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;
  //////////////////////////////////////
  TextSave:=ctl.Text;
  SelStartSave:=ctl.SelStart;
  SelLengthSave:=ctl.SelLength;
  case SelStartSave of
    0,1: EditingPos:=1;
    3,4: EditingPos:=2;
    6,7: EditingPos:=3;
    else EditingPos:=0;
  end;
  if SelStartSave=length(TextSave) then
    EditingPos:=TimeFormat;
  if Key=vk_delete then begin
    if SelLengthSave=length(TextSave) then TextSave:=''''''''
    else begin
      if not (SelStartSave in [2,5]) then TextSave[SelStartSave+1]:=''''0'''';
      if SelLengthSave>1 then begin
        for i:=SelStartSave+2 to SelStartSave+SelLengthSave do
          if i in [1,2,4,5,7,8] then TextSave[i]:=''''0'''';
        SelLengthSave:=1;
      end;
    end;
    Key:=0;
  end;
  if Key=vk_back then begin
    if SelLengthSave=length(TextSave) then TextSave:=''''''''
    else if SelLengthSave<=1 then begin
      if not (SelStartSave in [3,6]) then begin
        TextSave[SelStartSave]:=''''0'''';
        SelStartSave:=SelStartSave-1;
      end else begin
        TextSave[SelStartSave-1]:=''''0'''';
        SelStartSave:=SelStartSave-2;
      end;
      SelLengthSave:=1;
    end else begin
      for i:=SelStartSave+1 to SelStartSave+SelLengthSave do
        if i in [1,2,4,5,7,8] then TextSave[i]:=''''0'''';
      SelLengthSave:=1;
    end;
    Key:=0;
  end;
  ///////////////////////////////////////
  if (Key=vk_up) or (Key=vk_down ) then begin
    if trim(TextSave)='''':'''' then begin
      if TimeFormat=2 then TextSave:=''''00:00''''
      else TextSave:=''''00:00:00''''
    end else begin
      if Key=vk_up then
        case EditingPos of
          1: TextSave:=TimeAdd(TextSave,TimeFormat,1,0,0);
          2: TextSave:=TimeAdd(TextSave,TimeFormat,0,1,0);
          3: TextSave:=TimeAdd(TextSave,TimeFormat,0,0,1);
        end;
      if Key=vk_down then
        case EditingPos of
          1: TextSave:=TimeAdd(TextSave,TimeFormat,-1,0,0);
          2: TextSave:=TimeAdd(TextSave,TimeFormat,0,-1,0);
          3: TextSave:=TimeAdd(TextSave,TimeFormat,0,0,-1);
        end;
    end;
  end;
  ///////////////////////////////////////
  ctl.Text :=TextSave;
  ctl.SelStart :=SelStartSave;
  ctl.SelLength :=SelLengthSave;
end;
以上函数的TimeFormat参数代表时间的类型:1-时:分;2-时:分:秒
要完成对时间的输入限制,只需调用上面的MxFormatTimeKeyPress,
MxFormatTimeKeyDown两个函数。
调用示例:
(1)TMaskEdit
procedure TForm1.MaskEdit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  MxFormatTimeKeyDown(Sender as TCustomMaskEdit,2,Key,Shift,nil);
end;

procedure TForm1.MaskEdit1KeyPress(Sender: TObject; var Key: Char);
begin
  MxFormatTimeKeyPress(Sender as TCustomMaskEdit,2,Key,nil);
end;
并且,TMaskEdit的EditMask属性设为''''99:99''''
(2)TDBEdit

procedure TForm1.DBEdit1KeyPress(Sender: TObject; var Key: Char);
begin
  MxFormatTimeKeyPress(Sender as TCustomMaskEdit,2,Key,(Sender as TDBEdit).DataSource);
end;

procedure TForm1.DBEdit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  MxFormatTimeKeyDown(Sender as TCustomMaskEdit,2,Key,Shift,(Sender as TDBEdit).DataSource);
end;
在TDBEdit所连接的数据源打开后,设定所连字段的EditMask属性为99:99:
  DBEdit1.Field.EditMask :=''''99:99'''';

(三)日期的输入
采用Rx的日期组件TDateEdit、TDBDateEdit。如果你还没安装,请在本站下载。
无需对日期的输入作限制,只需方便用户的输入。即:箭头键可以改变相应的
日期元素,因为Rx五次功能。函数如下:
procedure MxSpinRxDateEdit(Edit:TCustomDateEdit;Key:word;Shift:TShiftState;
        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;

更多文章请访问三金主页http://vip.6to23.com/tianmingxin

上一页  [1] [2] 


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台