使用TcxTreeList进行列表显示,并需要对某个单元格进行输入操作时,只需要指定该栏目的Properties属性为对应输入控件即可,而对应的输入检查,可由TcxTreeList的OnEdited和OnEditing完成。
一般的检查方法如下:
procedure TForm.TestLstEdited(Sender: TObject; AColumn: TcxTreeListColumn);
var
AValue: Integer;
begin
AValue := -1;
try
AValue := AColumn.Values[TestLst.FocusedNode.Index];
except
raise;
end;
if AValue < 0 then
begin
ShowMessage('输入数值不能小于零!');
AColumn.Values[TestLst.FocusedNode.Index] := 0;
end;
end;
而当TcxTreeList显示树型列表并存在多个子节点后,却发现上述代码有问题,仔细一跟踪,原来TestLst.FocusedNode.Index值是按节点层次结构顺序赋值的。
修改后的代码如下:
procedure TForm.TestLstEdited(Sender: TObject;
AColumn: TcxTreeListColumn);
var
AValue, AIndex: Integer;
begin
AValue := -1;
with TestLst.FocusedNode do
if Assigned(Parent) then
AIndex := Parent + Index
else
AIndex := Index;
try
AValue := AColumn.Values[AIndex];
except
raise;
end;
if AValue < 0 then
begin
ShowMessage('输入数值不能小于零!');
AColumn.Values[AIndex] := 0;
end;
end;
后续,对于每一个栏目中具体指定的输入控件,在Properties中都有提供OnValidate事件,事实上,把每一个栏目的具体判断代码和整个TreeList代码分开处理是应该也是非常有必要的,特别是在处理非常复杂的逻辑的时候。
在实际使用OnValidate事件时,发现如果直接使用该回调事件中的变参Error,弹出来的是异常对话框,并不是想直接体现给用户注意的内容,所以采用置Error为Flase并手动在该事件中弹出提示框的方法,但是却发现该方法会导致事件重复触发,直接的表现就是错误提示框弹出多次,在仔细的查看了该控件的源代码之后,发现主要是弹出对话框时,触发了TcxCustomEdit.FocusChanged事件,焦点改变时,导致了二次检查。
解决的代码如下:
//申明一个继承类:
TValidateEdit = class(TcxCustomEdit);
procedure TForm.TestColumnPropertiesValidate(Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean);
begin
TValidateEdit(Sender).DisableValidate; //该方法申明在TcxCustomEdit的保护域,所以通过该方法访问;
try
DisplayValue := StrToIntDef(DisplayValue, -1);
Error := (DisplayValue < 0);
if Error then
begin
Common.ShowMsg('输入数值不能小于零!');
Error := False;
DisplayValue := 1;
end;
finally
end;
TValidateEdit(Sender).EnableValidate;
end;