| 1.这个工具条其实就是freeformBar，和上例中的“查询区”属于同一个范畴; 2.按钮都是freeform中的按钮，触发的也全部是freeform的事件，通过即时更改 TableLayout 的 “Visible” 属性实现freeform的重新展现; 3.本例将查询条件存入本地Cache了，请输入查询条件按“确认”按钮后，关闭浏览器，再进入，观察查询条件; 4.真实的查询请参考演示页 "30.FreeformBar".

1.采用了上一个demo页中的Treelist，但是没有采用其内定的FreeformBar，而是在OpenFreeformBar( )函数中指向另一个：

    function OnReady(id)
    {
     AF.func("Build", "treelist/t20.xml");
     AF.func("Load", 'treelistdata/data.txt');
     AF.func("OpenFreeformBar","treelist/query2.xml");  //立即开启FreeformBar, 使用query2.xml作为Freeform
    }

2.上面的XML中引用的 query2.xml 是一个标准的freeform(自由表头)，它包含了多个TableLayout. query2.xml是用表单设计器设计出来的，请详见"自由表头"部分的demo页“16.Freeform设计器”;
3.js源码分析如下:

    //Supcan事件
    function OnEvent(id, Event, p1, p2, p3, p4)
    {
     if(Event=="ButtonClicked") {
      if(p1 == "btn3") {  //打印预览按钮
       AF.func("PrintPreview", "");
       return;
      }

      if(p1 == "close1" || p1=="close2") {
       //关闭：调用freeform的扩展函数SetObjectProp( )，让用于条件输入的TableLayout隐藏
       AF.func("tBar.SetObjectProp", "layout1,layout2,mirror \r\n visible \r\n 0");
       return;
      }
      if(p1=="ok1" || p1=="ok2") {
       //确认：调用freeform的扩展函数Export( )，取得查询条件的XML串
       var xml = AF.func("tBar.Export", "includeHide=false;includeEmpty=false");
       //查询条件保存到本地Cache
       AF.func("SaveCache", "top" + p1 + "\r\n" + xml + "\r\n Persist=File");
       //如果需要json格式： 执行全局函数 toJSON
       AF.func("MessageBoxFloat", AF.func("toJSON", xml + "\r\n recordset"));
       return;
      }

      //打开不同的条件查询框：让部分TableLayout隐藏、另一部分显示
      if(p1 == "btn1") {
       AF.func("tBar.SetObjectProp", "layout2 \r\n visible \r\n 0");
       AF.func("tBar.SetObjectProp", "mirror, layout1 \r\n visible \r\n 1");
       //从本地Cache读取初始值
       var cache = AF.func("ReadCache", "topok1");
       if(cache != "") AF.func("tBar.Load", cache + "\r\n useLast=true");  //useLast=true表示部分替换(初始日期部分)
      }
      else if(p1 == "btn2") {
       AF.func("tBar.SetObjectProp", "layout1 \r\n visible \r\n 0");
       AF.func("tBar.SetObjectProp", "mirror, layout2 \r\n visible \r\n 1");
       //从本地Cache读取初始值
       var cache = AF.func("ReadCache", "topok2");
       if(cache != "") AF.func("tBar.Load", cache + "\r\n useLast=true");  //useLast=true表示部分替换(初始货重部分)
      }
     }
    }