Murphy的记事本

若教眼底无别离,不信人间有白头
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

TcxTreeList输入检查应用心得一例

Posted on 2009-01-09 14:14  Murphy(土豆)  阅读(1183)  评论(0编辑  收藏  举报

使用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;