以下是我例程中代码,在ohgoods(这是一个oclpshandle,也可以是一个expressionhandle),在column中增加三个列 ALLXJ,ALLSL,XJ,并且设置其ocl表达式(略)
field1, field2, field3, field4: PropertyDescriptor; vsl, vallsl, vallxj,vprice: double;begin //结帐处理
field1 := ((ohgoods as ITypedList).GetItemProperties(nil)['ALLXJ']);
//这里得到一个PropertyDescriptor属性描述 field2 := ((ohgoods as ITypedList).GetItemProperties(nil)['ALLSL']); field3 := ((ohgoods as ITypedList).GetItemProperties(nil)['XJ']); disp(field1.Name); element := ohgoods.Element; list1 := element.GetAsCollection(); for i := 0 to list1.Count - 1 do begin vallsl := double(field1.Getvalue(ilist(ohgoods)[i])); vallxj :=double( field2.Getvalue(ilist(ohgoods)[i]));
//这里根据属性描述在列表中取出当前行(第I行)对应的值 if vallsl<>0 then begin vprice:=vallxj/vallsl; end; vsl :=double( field3.Getvalue(ilist(ohgoods)[i]));
end;
调试心得:
1.expressionhandle(olcpshandle)的OCL COLUMNS及其ocl表达式要事先设定好,也就是要在create()事件执行完成以前要形成,不能在上述代码中加入,否则会出错.当然我们可在create事件中动态加入
2.对于ocl column最好使用oclpshandle,因为expressionhandle(3以下的版本),当我们的ocl column的ocl表达式改变时,它的内容并不动态更新(据说是bug),而oclpshandle在执行exceute事件时一定会更新
3.关于大小写,ocl column的name属性区分大小写,这也是调试中验证了的
|