我用的是cxDBEdit,我现在整个表单已经能够实现按回车或TAB向下一控件跳的功能..
但我现在要实现的是控件指定只能输入9.9或是99.999以内的数字,小数位可变,输完后自动跳到下一控件,有人可以实现不?或是需要MASKEDIT???
有人用过foxPro的就知道,FOXPRO的EDIT 有设置9.99这样的INPUTMASK属性,只能输入数字,然后输完会自动跳出该控件到下一控件,请问大家有人有实现过这样的功能不??非常感谢

解决方案 »

  1.   

    TMaskEdit  跳出到下一个控件要自己判断。
      

  2.   

    谢谢楼上的,最好是用CXDBEDIT能用的:)呵呵...
      

  3.   

    cxDBEdit可以设置,它也有INPUTMASK属性,自己找找,可以出对话框设置正则表达式。时间长了,我忘记了。
      

  4.   

    cxDbedit 没看到有INPUTMASK呀.
      

  5.   

    hys_427  真是热心人啊 楼主碰到你是他的造化啊 o(∩_∩)o...哈哈 
      

  6.   

    function GetNumDotAfter(S:string):integer;//得到小数点后有几位小数
    var
    i,j,len:integer;
    begin
    j:=length(s);
    len:=j;
    for i:=len downto 1 do
       if s[i]='.' then
          begin
          j:=i;
          break;
          end;
    result:=len-j;
    end;procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
    begin
    if key in ['0'..'9'] then
       begin
       if GetNumDotAfter(edit1.Text)<1 then
          exit else edit2.SetFocus;
       end else if key=#8 then exit else
    if key='.' then
       if edit1.Text='' then
          key:=#0
          else begin
          if Pos('.',edit1.Text)>0 then
             key:=#0 else exit;
          end else key:=#0;
    end;
      

  7.   

    谢谢hys_427 ,的确很热心,非常感谢,我试了一下
    不能单代码去写下个控件得到焦点,因为控件会很多,这样写会晕死了,有没什么办法不要一个个控件去写的?看来EDIT是没有MASK功能了,可能只能用MASKEDIT,但MASKEDIT设置了输入格式后也不会自动往下跳呀...怎样在写最少的代码的情况下实现呢?而且小数位要能够让自己去设置..是几个小数位,几个整数位..
      

  8.   

    谢谢hys_427 ,的确很热心,非常感谢,我试了一下
    不能单代码去写下个控件得到焦点,因为控件会很多,这样写会晕死了,有没什么办法不要一个个控件去写的?看来EDIT是没有MASK功能了,可能只能用MASKEDIT,但MASKEDIT设置了输入格式后也不会自动往下跳呀...怎样在写最少的代码的情况下实现呢?而且小数位要能够让自己去设置..是几个小数位,几个整数位..
      

  9.   

    hys_427能不能看看我帖子,关于hook的
      

  10.   

    又重新修改了一下,不过我是设所有的edit的名字都为edit加一个数字的,使用时从对象浏览器中把每一个edit的OnKeyPress事件设置成NumEditKeyPress即可使用,你也可以把它封装成一个控件,然后就可以直接使用了
    现在我把整个单元给你放上来,当然我仅仅使用了3个edit进行测试,更多的你自己找找,我最烦不结贴的人了,注意结贴呀
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Edit2: TEdit;
        Edit3: TEdit;
        Procedure NumEditKeyPress(Sender:TObject; var Key: Char);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}
    function GetNumDotAfter(S:string):integer;//得到小数点后有几位小数
    var
    i,j,len:integer; 
    begin 
    j:=length(s); 
    len:=j; 
    for i:=len downto 1 do
       if s[i]='.' then
          begin 
          j:=i;
          break; 
          end; 
    result:=len-j; 
    end; function GetNextEditName(EditName:string):string;
    var //取得下一个edit控件的名称
    i:integer;
    begin   //假设所有的edit控件名称都是'edit'+一个数字
    delete(editname,1,4);//把前面的4个字符即edit删除掉剩下的就是数字了
    result:='Edit'+inttostr(strtoint(editname)+1);
    end;procedure TForm1.NumEditKeyPress(Sender: TObject; var Key: Char);
    var
    NextEditName:string;
    NextComponent:TComponent;
    begin
    if key in ['0'..'9'] then
       begin
       if GetNumDotAfter((Sender as TEdit).text) <1 then
          exit else
          begin
          NextEditName:=GetNextEditName((Sender as TEdit).name);
          NextComponent:=Form1.FindComponent(NextEditName);
          if NextComponent<>nil then
          (NextComponent as TEdit).SetFocus;
           end;
       end else if key=#8 then exit else
    if key='.' then
       if edit1.Text='' then
          key:=#0
          else begin
          if Pos('.',(Sender as TEdit).text)>0 then
             key:=#0 else exit;
          end else key:=#0;
    end;end.
      

  11.   

    procedure TForm1.Button1Click(Sender: TObject);
    var E:Extended;
    begin
        if not TryStrtofloat(edit1.Text ,E)    then
        MessageBox(self.Handle,'请输入数值','提示',64);
    end;
    这个就可以了.
    TAB功能我就不清楚了/