打印本文 打印本文 关闭窗口 关闭窗口
限制并方便用户输入
作者:武汉SEO闵涛  文章来源:敏韬网  点击数2051  更新时间:2009/4/23 18:39:06  文章录入:mintao  责任编辑:mintao
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] 

打印本文 打印本文 关闭窗口 关闭窗口