unit keyPro;interface
uses
  Controls, Forms, DBGrids, Messages, SysUtils, Grids, DBCtrls,
  StdCtrls, ComCtrls, Dialogs;type
  TInteger = set of Char;procedure pKeyPress(var pForm: TForm; var Key: Char);
procedure pInputMode(var Key: Char; InputMode: string; Sender: TObject; IntNum: integer = 0; DecimalNum: integer = 0);
//Key 输入的键值  InputText 输入的所有字符  IntNum  整数个数或英文整个个数  DecimaNum  数值中小数个数
function pJudgeValue(pStr: string): Boolean;implementationprocedure pKeyPress(var pForm: TForm; var Key: Char);
begin
//回车自动移动
//调用方式  pKeyPress(Tform(form1), key);
  if key = #13 then { 判断是按执行键}
    begin
      if pForm.ActiveControl is TDBGrid then {是在Tdbgrid控件内}
        begin
          with TDBGrid(pForm.ActiveControl) do
            if SelectedIndex < (FieldCount - 1) then
              SelectedIndex := SelectedIndex + 1 { 移动到下一字段}
            else
              SelectedIndex := 0;
          Exit;
        end;
      if pForm.ActiveControl is TMemo then {是在TMemo控件内}
        Exit;
      if pForm.ActiveControl is TDBMemo then {是在TDBMemo控件内}
        Exit;
      if pForm.ActiveControl is TStringGrid then {是在TStringGrid控件内}
        begin
          with TStringGrid(pForm.ActiveControl) do
            begin
              if Col < (ColCount - 1) then
                Col := Col + 1 { 移动到下一字段}
              else if Row < (RowCount - 1) then
                begin
                  Row := Row + 1;
                  Col := 0;
                end
              else
                begin
                  Row := FixedRows;
                  Col := FixedCols;
                end;
              Exit;
            end;
        end;      if pForm.ActiveControl is TListView then {是在TListView控件内}
        begin
          with TListView(pForm.ActiveControl) do
            begin
              if Selected.Index < (Items.Count - 1) then
                begin
                  Items[Selected.Index + 1].Selected := true;
                  Exit;
                end
              else
                begin
                  Items[0].Selected := true;
                  Exit;
                end;
            end;
        end;      key := #0;
      pForm.Perform(WM_NEXTDLGCTL, 0, 0); {移动到下一个控件}
    end;
end;procedure pInputMode(var Key: Char; InputMode: string; Sender: TObject; IntNum: integer = 0; DecimalNum: integer = 0);
var
  mInteger: TInteger;
  InputText: string;
  mSelStart: integer;
begin
//控制输入方式
  if Sender is TComboBox then
  begin
    mSelStart := TComboBox(Sender).SelStart;
    TComboBox(Sender).Text := Copy(TComboBox(Sender).Text, 0, TComboBox(Sender).SelStart) + Copy(TComboBox(Sender).Text, TComboBox(Sender).SelStart + TComboBox(Sender).SelLength + 1, Length(TComboBox(Sender).Text) - TComboBox(Sender).SelStart + TComboBox(Sender).SelLength);
    TComboBox(Sender).SelStart := mSelStart;
    InputText := TComboBox(Sender).Text;
  end;
  if Sender is TEdit then
  begin
    mSelStart := TEdit(Sender).SelStart;
    TEdit(Sender).Text := Copy(TEdit(Sender).Text, 0, TEdit(Sender).SelStart) + Copy(TEdit(Sender).Text, TEdit(Sender).SelStart + TEdit(Sender).SelLength + 1, Length(TEdit(Sender).Text) - TEdit(Sender).SelStart + TEdit(Sender).SelLength);
    TEdit(Sender).SelStart := mSelStart;
    InputText := TEdit(Sender).Text;
  end;
  if Sender is TDBEdit then
  begin
    mSelStart := TDBEdit(Sender).SelStart;
    TDBEdit(Sender).Text := Copy(TDBEdit(Sender).Text, 0, TDBEdit(Sender).SelStart) + Copy(TDBEdit(Sender).Text, TDBEdit(Sender).SelStart + TDBEdit(Sender).SelLength + 1, Length(TDBEdit(Sender).Text) - TDBEdit(Sender).SelStart + TDBEdit(Sender).SelLength);
    TDBEdit(Sender).SelStart := mSelStart;
    InputText := TDBEdit(Sender).Text;
  end;
  if Sender is TDBComboBox then
  begin
    mSelStart := TDBComboBox(Sender).SelStart;
    TDBComboBox(Sender).Text := Copy(TDBComboBox(Sender).Text, 0, TDBComboBox(Sender).SelStart) + Copy(TDBComboBox(Sender).Text, TDBComboBox(Sender).SelStart + TDBComboBox(Sender).SelLength + 1, Length(TDBComboBox(Sender).Text) - TDBComboBox(Sender).SelStart + TDBComboBox(Sender).SelLength);
    TDBComboBox(Sender).SelStart := mSelStart;
    InputText := TDBComboBox(Sender).Text;
  end;
  if InputMode = '整数' then
    begin
      mInteger := ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', #8];
      if not (Key in mInteger) then
        begin
          Key := #0;
        end
      else
        begin
          if Key <> #8 then
            if (IntNum <> 0) and (Length(InputText) >= IntNum) then
              begin
                Key := #0;
              end;
        end;
    end
  else if InputMode = '数值' then
    begin
      mInteger := ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '.', #8];
      if not (Key in mInteger) then
        begin
          Key := #0;
          Beep;
        end
      else
        begin
          if Key <> #8 then
            begin
              if DecimalNum = 0 then
                begin
                  if (Key = '.') then
                    Key := #0;
                  if (IntNum <> 0) and (Length(Copy(InputText, 0, Length(InputText) - Pos('.', InputText))) >= IntNum) then
                    begin
                      Key := #0;
                      Exit;
                    end;
                end
              else
                begin
                  //判断小数点
                  if (Key = '.') then
                    if (Pos('.', InputText) <> 0) then
                      begin
                        Key := #0;
                        Exit;
                      end
                    else
                      Exit;
                  if (Pos('.', InputText) <> 0) then
                    begin
                      //判断整数值
                      if TEdit(Sender).SelStart < Pos('.', InputText) then
                        if (Length(Copy(InputText, 0, Pos('.', InputText) - 1)) >= IntNum) then
                          Key := #0;
                      //判断小数值
                      if TEdit(Sender).SelStart > Pos('.', InputText) then
                        if (Length(Copy(InputText, Pos(InputText, '.'), Length(InputText) - Pos('.', InputText))) >= DecimalNum) then
                          Key := #0;
                    end
                  else
                    if (Length(InputText) >= IntNum) then
                      Key := #0;
                end;
            end;
        end;
    end
  else if InputMode = '英文' then
    begin
      mInteger := ['A', 'a', 'B', 'b', 'C', 'c', 'D', 'd',
        'E', 'e', 'F', 'f', 'G', 'g', 'H', 'h', 'I', 'i',
        'J', 'j', 'K', 'k', 'L', 'l', 'M', 'm', 'N', 'n',
        'O', 'o', 'P', 'p', 'Q', 'q', 'R', 'r', 'S', 's',
        'T', 't', 'U', 'u', 'V', 'v', 'W', 'w', 'X', 'x',
        'Y', 'y', 'Z', 'z', #8];
      if not (Key in mInteger) then
        begin
          Key := #0;
          Beep;
        end
      else
        begin
          if Key <> #8 then
            if (IntNum <> 0) and (Length(InputText) >= IntNum) then
              begin
                Key := #0;
                Beep;
              end;
        end;
    end;
end;function pJudgeValue(pStr: string): Boolean;
var
  mResult: Boolean;
begin
//判断字符串是否为数值型
  if Pstr <> '' then
    begin
      try
        strTOfloat(pStr);
        mResult := True;
      except
        mResult := False;
      end;
      Result := mResult;
    end
  else
    Result := True;
end;end.