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。
那么,用户只能输入一个负数,不能编辑掉前面的减号。
我在 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。
那么,用户只能输入一个负数,不能编辑掉前面的减号。