delphi中stringGrid输入的高级验证

时间:2011-02-14 11:12:58

标签: delphi

我有一个字符串网格,其中每列都有不同类型的验证。例如,第一列接受与此正则表达式[0-9]+[U-Wu-w]匹配的字符串。第二列和第三列仅接受浮点数。我知道有很多高级表可以在市场上买到,但这对我来说是不行的(事实上,我的老板反对使用delphi标准库没有的任何东西) )但是在我显示它包含在最新版本中后,我设法使用TPerlRegex

如果没有简单的方法,验证的代码是什么?假设在每次更改后,实数将被分配给double类型的变量然后重新绘制? (这让我放松了小数分隔符)

修改 我应该写这个表代表一些结构的值,只有当字符串与表达式匹配时才应该设置这个值。

2 个答案:

答案 0 :(得分:0)

假设格式化stringgrid单元格中的字符串值是主要问题,您可以尝试检查字符串是否为数字,如果是,则

使用sysutils;

var 
inputstring:double;  
begin  // for columns 2 and 3 
 inputstring:=123.5678; //if it is input as a double 
 StringGrid2.Cells[0,1]:= FloatToStrF(inputstring, ffFixed, 8, 2);
end;

对于第一列,您可以检查第一个字符串位置的整数?类似的东西:

if copy(yourinputstring,1,1) in [0..9] then //for column 1 if a single digit starts the string
begin;
  validinput:=yourinputstring;
end;

if copy(yourinputstring,10,1) in [0..9] then //for column 1 if a the digit string is always 10 characters long
begin;
  validinput:=yourinputstring;
end;

您还可以测试整个字符串是字符还是字符加数字或完全数字:类似于:

function StringIsDigit (const s: AnsiString):Boolean;
var      
I : Integer;
  begin
   Try
      Result := s <>'';
      for I:= 1 to Length(s) do
        begin
          if not (((s[i] >= '0') and (s[i] <= '9'))) then
            begin
              Result := False;
              Exit;
            end;
        end;

    except
    result:=false;
    end;

end;

答案 1 :(得分:0)

好的,我基本上解决了为最后一个部分匹配的字符串和最后编辑的行和列保留缓冲区,所以最后代码看起来像

procedure TMyClass.MyStrGrdSetEditText(Sender: TObject; ACol, 
                                       ARow: Integer; const Value: string);
var
  filter : TPerlRegEx;
  matched : Boolean;
begin
  if DidCellChange(ACol, ARow) then begin // checks if I am editing another cell
    last_partially_matched_string_ := '';
    my_strgrd.Cells[last_edited_cell_column_, last_edited_cell_row] :=
       GetContentsOfCellFromDataStructure(last_edited_cell_column_,
                                          last_edited_cell_row);
  last_edited_cell_column_ := ACol;
  last_edited_cell_row_ := ARow;

  case ACol of
    0: filter := regex_filter_1;
    1: filter := regex_filter_2;
    2: filter := regex_filter_3;
    else Exit;
  end;

  filter.Subject := Value;
  matched := filter.Match;
  if matched and (filter.MatchedLength = Length(Value)) then begin
    last_partially_matched_string_ := Value;
    SetValueOnDataStructure(ARow, ACol, Value);
  end else if filter.PartialMatch and not matched then begin
    last_partially_matched_string_ := Value;
  end else begin
    my_strgrd.Cells[ACol, ARow] := last_partially_matched_string_;
  end;
end;