CXGrid 中只允许负数

Allow only Negative number in CXGrid

我在 Delphi 2006 年与 devexpress 一起工作。

我有一个 cxGrid。我想限制输入负数列的值,

我的问题是如何在将“-”添加到单元格时测试它的位置

是一些简单的方法让 cxgrid 的单元格中只允许负数。

提前致谢

做你想做的最简单的方法是在网格单元格中使用 MaskEdit,但正如你在评论中所说你不希望使用它,我已经移动了如何做到这一点到这个答案的结尾。

您和您完全在自己的代码中控制用户对单元格文本的编辑,我将向您展示如何做到这一点。

默认情况下,如果您在整数字段的 cxGrid 列中键入字母键,您会听到哔声。发生这种情况的原因是键导致链接到单元格的整数字段 TField.IsValidChar(InputChar: Char) 变为 return False

如果您想自己处理 "wrong" 键,而不使用 MaskEdit,您可以在 EditKeyPressed 事件中完成。下面的代码表明,您可以自己执行用户可以在该字段中输入的内容,而不必像您在下面的评论中引用的那样模拟 editing-key 按下。请仔细注意代码中的注释。

procedure TForm1.cxGrid1DBTableView1EditKeyPress(Sender:
    TcxCustomGridTableView; AItem: TcxCustomGridTableItem; AEdit:
    TcxCustomEdit; var Key: Char);
var
  AField : TField;
  strValue : String;
  V : Variant;
  i,
  InsertPoint,
  EC : Integer;

  function CharIsOK(Ch : Char) : Boolean;
  begin
    Result := CharInSet(Ch, ['0', '1', '2', '3', '4', '5', '6',
                        '7', '8', '9', '-', '+']);
    // Or Result := Ch in ['0', ... for Delphi prior to D2009
  end;

begin
  if AItem = cxGrid1DBTableView1Value then begin
    //  The following manually cleans up input into a TIntegerField column
    // whose Properties is set to TextEdit

    // First, pick up the text in the inplace editor
    V := AEdit.EditingValue;
    if not VarIsNull(V) then
      strValue := AEdit.EditingValue
    else
      strValue := '';

    if strValue <> '' then begin
      //  Next, check that the Key is a valid one for an Integer field.
      if CharIsOk(Key) then begin
      //  The fact that the Key is a valid character for an Integer field
      //  does not in itself guarantee that the entire editing string, including the Key
      //  which is about to be added to in, is a valid string representation of an integer,
      //  e.g. it might be '--', '+1-5', etc
      //  So, we add the Key to the existing editing string and see if it converts to an integer
      //  Of course, there is the wrinkle that the caret may not be at the end of the editing text
      //  so we need to find out where the caret is.  First we need 
      //  to check that AEdit is a TcxtextEdit so that we can access
      // its SelStart property
        Assert(AEdit is TcxTextEdit);
        InsertPoint := TcxTextEdit(AEdit).SelStart;
        Insert(Key, strValue, InsertPoint + 1);
        Val(strValue, i, EC);
        //  if EC is non-zero, the conversion failed, so we suppress the Key
        if EC <> 0 then
          Key := Chr(0);
       end
       else
         //  the Key might be a backspace, so permit that
         if Ord(Key) <> VK_Back then
           Key := Chr(0);
    end
  end;
end;

当然,如果你真的想实现你在你的标题中所说的,即只允许负数,你可以对这段代码做一些微不足道的修改,要求编辑文本以减号开头(如果编辑文本不为空,则编辑文本+Key转换为整数)。

顺便说一句,这段代码当然回答了您的查询 "how can I get the string value in onpresskey ?"。

要在 cxGrid 单元格中使用 MaskEdit,select Object 检查器中的 cxGrid 列,然后

  • 转到 OI 中的属性条目

  • Select 从 drop-down 列表编辑蒙版

  • 设置负数的编辑掩码。如果您需要帮助,请参阅联机帮助:基本上,您输入一个减号,然后输入一个数字 9。

那么,用户只能输入一个负数,不能编辑掉前面的减号。