uniGUI试用笔记(十四)TUniTreeView的CheckBox

TUniTreeView目前版本没有封装CheckBox功能,所以需要手工处理,幸好0.99版提供部分代码了,修改过程如下:

1、uniGUIAbstractClasses.pas单元中修改基类TUniTreeNode,增加Checked属性,代码如下:

TUniTreeNode  = class(TPersistent)
  private
    FChecked: Boolean;
    ...
  public
    property Checked : Boolean read FChecked write FChecked;
  end;

2、uniGUISource\uniTreeView.pas单元中修改TUniTreeView类,增加对CheckBox的支持属性,代码如下:

TUniTreeView  = class(TUniControl, IUniTreeView)
  private
    FUseCheckBox : Boolean;
  ...
  published
    property UseCheckBox : Boolean read FUseCheckBox write FUseCheckBox ;
end;

3、uniGUISource\uniTreeView.pas单元中修改TWebTreeNode类,对其JS代码生成部分加入对CheckBox的支持,代码如下:

function TWebTreeNode.ToJSON(AExpanded: Boolean = False): string;
var
  ImgURL : string;
  I : Integer;
begin
  ImgURL:=GetImageUrl(FImageIndex);
  Result:=‘{id:"‘+IntToStr(FID)+‘"‘+
          IfThen(Text<>‘‘, ‘, text:‘+ StrToJS(Text))+
          //如果TreeView支持则显示CheckBox,缺省False====================
          IfThen(FParentTree.UseCheckBox, ‘, checked: ‘+ IfThen(Checked, ‘true‘, ‘false‘))+
          //=================================================
          ImgURL+
          IfThen(FExpanded or AExpanded, ‘,expanded:true‘)+
          IfThen(ChildNodes.Count=0, ‘ ,leaf:true‘)+
          IfThen(not FEnabled, ‘ ,disabled:true‘);
  ...
end;

4、uniGUISource\uniTreeView.pas单元中修改TUniTreeView类的WebCreate方法,对其JS代码生成部分加入对CheckBox的处理,代码如下:

procedure TUniTreeView.WebCreate;
begin
  ...
  //加入对CheckBox的处理代码
  JSCode(
    ‘changeChecked:function(node, checked){‘ +
      //如果节点是一个数组,如node.childNodes,则循环对每一个子节点递归处理
      ‘if(Ext.isArray(node)){‘+
      ‘  for(var i=node.length-1;i>=0;i--) ‘+
      ‘  this.changeChecked(node[i], checked); }‘+
    ‘else{‘+
       //判断checked属性是否存在,如果存在则改变
      ‘if(node.data.checked!=null) ‘+
      ‘{node.set("checked",checked);}‘+
      //如果该节点是一个父节点,则递归调用处理下级节点
      ‘if(node.childNodes.length>0)‘+
        ‘{this.changeChecked(node.childNodes, checked);}‘+
      ‘}‘ + //for else
    ‘}‘); //for function
end;

5、在TuniTreeView的ClientEvents属性中,设置ExtEvents中的checkchange事件,其代码如下:

function checkchange(node, checked, eOpts)
{
  if (node.childNodes.length > 0)
    this.changeChecked(node.childNodes, checked);
}

这样一来,基本达到效果要求,也存在以下问题需要进一步解决:

1、界面上发生变动了,但是Node的Checked属性没有变化,也没有触发相关事件;

2、第5步应该在控件的类中解决,但是没有找到解决办法,目前暂时写在窗体控件属性中。

时间: 2024-10-12 07:30:52

uniGUI试用笔记(十四)TUniTreeView的CheckBox的相关文章

uniGUI试用笔记(四)

uniGUI下有专用的登录窗体类:TUniLoginForm,该类属于AppForm,构建代码为: function frmWebLogin: TfrmWebLogin; begin Result := TfrmWebLogin(dmWebMain.GetFormInstance(TfrmWebLogin)); end; 系统中如果存在登录窗体,则首先显示该窗体,当登录窗体返回不同ModuleResult值时,代表不同含义: ModalResult := mrOk; //表示登录成功,显示主窗体

swift 笔记 (十四) —— 构造过程

构造过程 为了生成类.结构体.枚举等的实例,而做的准备过程,叫做构造过程. 为了这个过程,我们通常会定义一个方法来完成,这个方法叫做构造器.当然它的逆过程,叫做析构器,用于在实例被释放前做一些清理工作以及一此自定义化的处理. 为存储型属性设置初始值 类和结构体在生成实例那一刻,必须为所有的属性赋以特定的初始值. 要么在定义存储型属性的时候直接给个初始值,否则就必须在构造器里面指定一个初始值. 上面说的这两种情况,都不会触发存储型属性的监听者行为(property observer). struc

Swift学习笔记十四:构造(Initialization)

类和结构体在实例创建时,必须为所有存储型属性设置合适的初始值.存储型属性的值不能处于一个未知的状态. 你可以在构造器中为存储型属性赋初值,也可以在定义属性时为其设置默认值.以下章节将详细介绍这两种方法. 注意: 当你为存储型属性设置默认值或者在构造器中为其赋值时,它们的值是被直接设置的,不会触发任何属性观测器(property observers). 一.基本语法 class Human{ var name :String init(){ name = "human" } init(n

laravel3学习笔记(十四)

原作者博客:ieqi.net ==================================================================================================== 运行时配置 在 Laravel3 中很多地方我们都可以看到“约定大于配置”的影子,我本人也很喜欢这种工程哲学尤其是在框架领域,当然这并不能代替所有的配置.我们知道 Laravel3 中,主要配置都写在 application/config 文件夹下,在应用逻辑中,往往

Oracle基础笔记十四

第十四章 高级子查询 1.子查询 子查询 (内查询) 在主查询执行之前执行 主查询(外查询)使用子查询的结果 SELECT select_list FROM table WHERE expr operator (SELECT select_list FROM  table); 问题:查询工资大于149号员工工资的员工的信息 SELECT last_name FROM   employees WHERE  salary > (SELECT salary FROM   employees WHERE

uniGUI试用笔记(十)

今天用LoadRunner对uniGUI的Standalone模式的程序进行了一次压力测试,程序采用三层模式,将应用服务器与Web服务器分离,由于条件限制,数据库.应用服务和Web服务都部署在同一条云服务器上,客户端使用IE浏览器,如下图: , 云服务器配置:CPU 4核 内存8G 硬盘500G 带宽10Mbps 客户端为笔记本电脑,i7 8核,内存16G,硬盘1T,客户端带宽20Mbps 先用LoadRunner纪录一组操作,包括操作员登录.打开结算单列表,大约900条纪录分页显示,点击第一条

uniGUI试用笔记(十五)通过URL控制参数

通过URL代入参数,在代码中读取,如: http://localhost:8501/?ServerPort=212&&ServerIP=192.168.31.12 在代码中可以通过: FServerIP := UniApplication.Parameters.Values['ServerIP']; FServerPort := UniApplication.Parameters.Values['ServerPort']; 呵呵,很简单哈

uniGUI试用笔记(十一)

最近研究了一下UniGUI的TuniDBGrid,记录一下免得忘记了. TuniDBGrid的重要属性包括: 1.列—TUniDBGridColumns和TUniDBGridColumn 每个列对象(TUniDBGridColumn)的重要属性包括: CheckBoxField : TUniCheckBoxField 列作为CheckBox操作的相关属性 属性 类型 说明 AutoPost Boolean 当用户点选CheckBox后,改变前端显示并根据该属性决定: True—立即自动提交到数据

《Inside C#》笔记(十四) 反射

通过反射可以在运行时动态地获取一个应用的元数据. 一 反射相关的类和方法 与反射相关的类处在System.Reflection命名空间下,包括Assembly.Module.MethodInfo.FieldInfo.PropertyInfo.EventInfo. a)Type类 System.Type类是反射机制的核心.Type类本身是一个抽象类,代表CTS通用类型系统中的某个类型. 对于已经实例化的对象,可以使用<对象名称>.GetType()来取得Type类.另外也可以使用静态方法Type