LiFan
2025-04-24 9b3b2eb20b09e13da837a28f16e552ba70a090c4
jrj/project/business/BasicCode/QuickCode.cpp
@@ -1,676 +1,665 @@
use"lang.vl"
use "win.vl"
use "dev:vm[xml.vm]"
use "treeview.vm"
use "dev:vm[xaserverarg.vm]"
use "dev:vm[xaserver.vm]"
use "dev:vm[xdwgrid.vm]"
use "dev:vm[xutil.vm]"
use "file.vl"
use "list.vl"
unit vbusiness.vpage
[
   QuickCode is extend list;
   about QuickCode
   [
      field:
      method:
      [
         xdwgrid__   dw_list;
         string m_config;
         string m_agent;
         string m_id;
         string m_dbmap;
         string m_name;
         string strconfig;
         msxml::IXMLDOMDocument m_configDoc;
         int alert(string str)
#include <wobject/xstring.hpp>
#include <xcontrol/xtreeview.hpp>
#include <xcontrol/xdwgrid.hpp>
#include <wobject/xdouble.hpp>
#include <xcontrol/xlayersheet.hpp>
#include <wobject/xpage.hpp>
#include "vbusiness/vframe/listwin.vframe.vbusiness.hpp"
#include "viewobject/view.base.hpp"
using xml = KXMLDOMDocument;
class __declspec(dllexport) QuickCode : public xframe
{
public:
   xdwgrid   dw_list;
   xstring m_config;
   xstring m_agent;
   xstring m_id;
   xstring m_dbmap;
   xstring m_name;
   xstring strconfig;
   KXMLDOMDocument m_configDoc;
   xnode   m_agentNode;
public:
   QuickCode(void* implPtr, HWND hWnd) :xframe(implPtr, hWnd) {}
public:
   static QuickCode* CreateInstance(void* implPtr, void* hWnd)
   {
      QuickCode* pWin = new QuickCode(implPtr, (HWND)hWnd);
      return pWin;
   }
   int SetAgent()
   {
      xstring xfNodeAgentArea = L"agentarea";
      xnode anode = GetAgentNode(xfNodeAgentArea);
      if (m_agentNode)
      {
         SetAgentNode(anode, m_agentNode);
      }
      else
      {
         KXMLDOMElement xframeElement = GetElement();
         //alert(m_configDoc.xml());
         KXMLDOMElement agent = m_configDoc.selectSingleNode(L"Config/" + xfNodeAgentArea + L"[1]/*");
         if (agent)
         {
            //win__::MessageBox(this.GetHWND(),str,"提示:",0);
            TApp::alert(this,str);
            xstring s = agent.xml();
            m_agentNode = SetAgentNode(anode, s);
         }
      }
      return 1;
   }
   int OnCmdDispatch(xstring comdid)
   {
      HCURSOR hCursor = xutil::SetCursorWait();
      if (comdid == L"save") {
         //type
         xaserverarg args;
         args.AddArg(L"id", m_id);
         args.AddArg(L"name", m_name);
         xml y;
         //TDataSet::exec(m_config,L"savetype",args,y);
         //url::post(L"QuickCode/pref/quickcode_type.save",args.GetString(),y);
         //save
         xml x;
         xaserverarg arg;
         dw_list.AcceptText();
         dw_list.DwUpdateAllToEx(x);
         KXMLDOMElement e = x.documentElement();
         e.setAttribute(L"id", m_id);
         //arg.AddArg(L"id",m_id);
         arg.AddArg(L"content", e.xml());
         arg.AddArg(L"dbmap", m_dbmap);
         //trace(L"-->",m_id);
         //trace(L"-->",m_dbmap);
         //trace(e.xml());
         /*if(TDataSet::exec(m_config,L"save",arg,x)!=1)
         {
            trace(L"error:"+x.xml());
            alert(L"保存出错!");
            return 0;
         }*/
         //trace(m_dbmap);
         trace(x.xml());
         if (xurl::get(L"QuickCode/pref/quickcode.save", arg.GetString(), x) != 1)
         {
            xstring error = x.text();
            trace(error);
         }
         trace(x.xml());
         if (x.selectSingleNode(L"error"))
         {
            alert(L"保存出错2!");
            return 0;
         }
         int SetAgent()
         {
            string xfNodeAgentArea  = "agentarea";
            xnode__ anode = new xnode__;
            anode.setNativePointer(GetAgentNode(xfNodeAgentArea));
            string magent = m_agent;
            if (magent == ""){
               xml__ x = new xml__;
               x.setNativePointer(xml__::CreateInstance());
               TFile::get(m_config, x);
               var agent = x.GetXmlDoc().selectSingleNode("config/agentarea/*[1]");
               if(agent){
                  magent = agent.xml;
                  trace(magent);
                  m_agent = magent;//agent.xml;
                  SetAgentNodeContent (anode,magent);
               }
            }
            else
               SetAgentNodeContent (anode,m_agent);
            return 1;
         dw_list.ResetUpdateStatus();
         alert(L"保存成功!");
      }
      else if (comdid == L"add") {
         dw_list.InsertRow(0);
         int rows = dw_list.GetRowCount();
         dw_list.SetRow(rows);
         dw_list.SetItemString(rows, L"ToCurrencyCode", L"RMB");
         dw_list.SetItemDisplayString(rows, L"ToCurrencyCode", L"人民币");
      }
      else if (comdid == L"insert") {
         int row = dw_list.GetRow();
         if (row<1 || row>dw_list.GetRowCount()) return 0;
         dw_list.InsertRow(row);
         dw_list.SetItemString(row, L"ToCurrencyCode", L"RMB");
         dw_list.SetItemDisplayString(row, L"ToCurrencyCode", L"人民币");
      }
      else if (comdid == L"delet") {
         /*int rows = dw_list.GetRowCount();
         int row2 = dw_list.GetPrevSelectRow(rows);
         while(row2 > 0){
            dw_list.DeleteRow(row2);
            row2 = dw_list.GetPrevSelectRow(row2 - 1);
         }
         int OnCmdDispatch(string comdid)
         dw_list.SelectRow(0, false);*/
         int row2 = dw_list.GetRow();
         if (row2<1 || row2>dw_list.GetRowCount()) return 0;
         dw_list.DeleteRow(row2);
      }
      else if (comdid == L"import") {
         if (m_id == L"FND_ExchangeRate")
         {
            int ll_delq = MessageBox(GetHWND(), L"确定要从老系统导入汇率数据吗?", L"提示", 1);
            if (ll_delq != 1)
               return 0;
            xml xi;
            int hCursor = xutil__::SetCursorWait();
            if(comdid == "save"){
               //type
               xaserverarg__ args=new xaserverarg__;
               args.setNativePointer(args.CreateInstance());
               args.AddArg("id",m_id);
               args.AddArg("name", m_name);
               xml__ y=new xml__;
               y.setNativePointer(xml__::CreateInstance());
               //TDataSet::exec(m_config,"savetype",args,y);
               //url::post("QuickCode/pref/quickcode_type.save",args.GetString(),y);
               //save
               xml__ x=new xml__;
               x.setNativePointer(xml__::CreateInstance());
               xaserverarg__ arg=new xaserverarg__;
               arg.setNativePointer(arg.CreateInstance());
               dw_list.AcceptText();
               dw_list.DwUpdateAllToEx(x.GetXmlDoc());
               msxml::IXMLDOMElement e= x.GetXmlDoc().documentElement;
               e.SetAttribute("id", m_id);
               //arg.AddArg("id",m_id);
               arg.AddArg("content",e.xml);
               arg.AddArg("dbmap", m_dbmap);
               //trace("-->",m_id);
               //trace("-->",m_dbmap);
               //trace(e.xml);
               /*if(TDataSet::exec(m_config,"save",arg,x)!=1)
               {
                  trace("error:"+x.GetXml());
                  alert("保存出错!");
                  return 0;
               }*/
               //trace(m_dbmap);
               trace(x.GetXml());
               if (url::get("QuickCode/pref/quickcode.save",arg.GetString(),x) != 1)
               {
                  string error = x.GetXmlDoc().text;
                  trace(error);
               }
               trace(x.GetXml());
               if(x.GetXmlDoc().selectSingleNode("error"))
               {
                  alert("保存出错2!");
                  return 0;
               }
               dw_list.ResetUpdateStatus();
               alert("保存成功!");
            }
            else if(comdid=="add"){
               dw_list.InsertRow(0);
               int rows = dw_list.GetRowCount();
               dw_list.SetRow(rows);
               dw_list.SetItemString(rows,"ToCurrencyCode","RMB");
               dw_list.SetItemDisplayString(rows,"ToCurrencyCode","人民币");
            }
            else if(comdid=="insert"){
               int row = dw_list.GetRow();
               if(row<1 || row>dw_list.GetRowCount()) return 0;
               dw_list.InsertRow(row);
               dw_list.SetItemString(row,"ToCurrencyCode","RMB");
               dw_list.SetItemDisplayString(row,"ToCurrencyCode","人民币");
            }
            else if(comdid == "delet"){
               /*int rows = dw_list.GetRowCount();
               int row2 = dw_list.GetPrevSelectRow(rows);
               while(row2 > 0){
                  dw_list.DeleteRow(row2);
                  row2 = dw_list.GetPrevSelectRow(row2 - 1);
               }
               dw_list.SelectRow(0, false);*/
               int row2 = dw_list.GetRow();
               if(row2<1 || row2>dw_list.GetRowCount()) return 0;
               dw_list.DeleteRow(row2);
            }
            else if(comdid == "import"){
               if(m_id=="FND_ExchangeRate")
               {
                  int ll_delq = win__::MessageBox(this.GetHWND(), "确定要从老系统导入汇率数据吗?","提示",1);
                  if (ll_delq != 1)
                     return 0;
                  xml__ xi=new xml__;
                  xi.setNativePointer(xml__::CreateInstance());
                  xaserverarg__ argi=new xaserverarg__;
                  argi.setNativePointer(argi.CreateInstance());
                  if (url::get("QuickCode/ExchangeRate/import",argi.GetString(),xi) != 1)
                  {
                     trace(xi.GetXmlDoc().text);
                     return -1;
                  }
                  alert("导入成功!");
                  dw_list.Redraw();
               }
            }
            xutil__::RestoreCursor(hCursor);
            return 0;
         }
         int OnXCommand(ref TXCommandEvent evt,int p)
         {
            return OnCmdDispatch(""+evt.pStrID);
         }
         int OnSetFocus(ref TNotifyEvent evt,int p){
            SetAgent();
            return 1;
         }
         int OnClicked(ref TNotifyEvent evt,int p)
         {
            ref DWNMHDR  hdr = evt.pnmh;
            int row = hdr.row;
            int col=hdr.col + 1;
            string colname=dw_list.GetColumnName(col);
            trace(colname);
            xaserverarg__ arg = new xaserverarg__;
            arg.setNativePointer(arg.CreateInstance());
            string comdid;
            if(colname=="CategoryID")
            {
               openUrl("产品资料.vface/xpage/product/category/dialog", arg);
               comdid = arg.GetArgString("comdid");
               if(comdid=="ok")
               {
                  string CategoryID = arg.GetArgString("CategoryID");
                  string CName = arg.GetArgString("CName");
                  dw_list.SetItemDisplayString(row,colname,CName);
                  dw_list.SetItemString(row,colname,CategoryID);
                  dw_list.Redraw();
               }
            }
            else if(colname=="MkOrgId")
            {
               openUrl("组织架构.vface/xpage/HrOrg/Chart", arg);
               comdid = arg.GetArgString("comdid");
               if(comdid=="xmOk")
               {
                  string OrgName = arg.GetArgString("OrgName");
                  string OrgId = arg.GetArgString("OrgId");
                  dw_list.SetItemDisplayString(row,colname,OrgName);
                  dw_list.SetItemString(row,colname,OrgId);
                  dw_list.Redraw();
               }
            }
            else if(colname=="Cid")
            {
               openUrl("组织架构.vface/xpage/hremployee/select", arg);
               comdid = arg.GetArgString("comdid");
               if(comdid=="xmOk")
               {
                  string sPersonID = arg.GetArgString("sPersonID");
               trace(sPersonID);
                  string sPersonName = arg.GetArgString("sPersonName");
                  dw_list.SetItemDisplayString(row,colname,sPersonName);
                  dw_list.SetItemString(row,colname,sPersonID);
                  dw_list.Redraw();
               }
            }
            return 1;
         }
         int OnDoubleClicked(ref TNotifyEvent evt,int p)
         {
            ref DWNMHDR  hdr = evt.pnmh;
            int row = hdr.row;
            if(row<1 || row > dw_list.GetRowCount() ) return 0;
            xaserverarg argi;
            
            xaserverarg__ arg = new xaserverarg__;
            arg.setNativePointer(arg.CreateInstance());
            //string str = hdr.data;
            string colname=hdr.colname;
            string str = dw_list.GetItemString(row, colname);
            arg.AddArg("value",str);
            openUrl("/sale/view/view.dlg/xpage/memo/edit", arg);
            string comdid = arg.GetArgString("comdid");
            if(comdid=="xmOK")
            if (xurl::get(L"QuickCode/ExchangeRate/import", argi.GetString(), xi) != 1)
            {
               string value = arg.GetArgString("value");
               dw_list.SetItemString(row,colname,value);
               dw_list.Redraw();
            }
            return 1;
         }
         int ItemOutput()
         {
            string d = xaserver__::GetCurrentDate();
            d = d.left(10) +"";
            dw_list.SaveAs(d);
            return 1;
         }
         int OnSelectAllRow()
         {
            int rows =  this.dw_list.GetRowCount();
            if(rows < 1) return -1;
             this.dw_list.SelectRow(1, rows, true);
             this.dw_list.Redraw();
            return 1;
         }
         int OnRowCopy()
         {
            int rows = this.dw_list.GetRowCount();
            if(rows < 1) return -1;
            int cols = this.dw_list.GetColumnCount();
            string str = "";
            int row = this.dw_list.GetNextSelectRow(1);
            int i;
            while(row > 0)
            {
               string tmp1 = "";
               for(i=1; i<cols; i++)
               {
                  int w = this.dw_list.GetColumnWidth(i);
                  if(w < 5) continue;
                  string tmp;
                  if(this.dw_list.GetItemDisplayString(row, i + 1))
                     tmp = this.dw_list.GetItemDisplayString(row, i + 1);
                  else
                     tmp = this.dw_list.GetItemString(row, i + 1);
                  tmp1 += tmp + "\t";
               }
               str += tmp1 + "\r\n";
               row = this.dw_list.GetNextSelectRow(row + 1);
               trace(xi.text());
               return -1;
            }
            this.dw_list.SetDataToClip(str);
            return 1;
         }
         int OnColCopy(string col)
         {
            int rows = this.dw_list.GetRowCount();
            if(rows < 1) return -1;
            string str = "";
            int row = this.dw_list.GetNextSelectRow(1);
            while(row > 0)
            {
               string tmp;
               if(this.dw_list.GetItemDisplayString(row, col))
                  tmp = this.dw_list.GetItemDisplayString(row,col);
               else
                  tmp = this.dw_list.GetItemString(row, col);
               str += tmp + "\r\n";
               row = this.dw_list.GetNextSelectRow(row + 1);
            }
            this.dw_list.SetDataToClip(str);
            return 1;
         }
         int OnRClick(ref TNotifyEvent evt,int p)
         {
            ref DWNMHDR  hdr = evt.pnmh;
            int row = hdr.row;
            int m = win__::CreatePopupMenu();
            int MF_STRING = 0x00000000;
            int MF_DISABLED  = 0x00000002;
            int TPM_RIGHTBUTTON = 0x0002;
            int TPM_RETURNCMD = 0x0100;
            int MF_CHECKED = 0x8;
            int MF_SEPARATOR = 0x0800;
            win__::AppendMenu(m,MF_STRING, 1, "复制行");
            win__::AppendMenu(m,MF_STRING, 101, "复制列");
            win__::AppendMenu(m,MF_SEPARATOR, -1, "");
            win__::AppendMenu(m,MF_STRING, 2, "ȫѡ");
            win__::AppendMenu(m,MF_SEPARATOR, -1, "");
            win__::AppendMenu(m,MF_STRING, 4, "导出到Excel");
            win__::AppendMenu(m,MF_SEPARATOR, -1, "");
            win__::AppendMenu(m,MF_STRING, 6, "显示列设置");
            xrect xr;
            xpoint pt;
            win__::GetCursorPos(pt);
            int ret=win__::TrackPopupMenu(m, TPM_RIGHTBUTTON | TPM_RETURNCMD, pt.x, pt.y, 0, this.GetHWND(), xr);
            //trace(ret);
            int hCursor = xutil__::SetCursorWait();
            if(ret == 1) {OnRowCopy();}
            else if(ret == 101) {
               string colname=hdr.colname;
               if(colname != "")
                  OnColCopy(colname);
            }
            else if(ret == 2) {OnSelectAllRow();}
            else if(ret == 4) {ItemOutput();}
            else if(ret == 6) {}
            xutil__::RestoreCursor(hCursor);
            return 1;
         }
         int OnAttachEvent()
         {
            //获取焦点事件,用于重置工具条
            AttachEvent("WM_SETFOCUS",OnSetFocus);
            //绑定工具条点击事件
            AttachEvent("WM_XCOMMAND",OnXCommand);
            AttachEvent("dw_list","DWV_DOUBLECLICKED",OnDoubleClicked);//行双击
            AttachEvent("dw_list","DWV_ITEMBEINGEDIT",OnClicked);
            AttachEvent("dw_list","DWV_RCLICKED",OnRClick);//鼠标右键
         }
         int OnRetrieve()
         {
            xml__ x=new xml__;
            x.setNativePointer(xml__::CreateInstance());
            xaserverarg__ arg=new xaserverarg__;
            arg.setNativePointer(arg.CreateInstance());
         trace("asdasd");
            if(m_id.find("__",0)  >0)
            {
               m_id = m_id.mid(0, m_id.find("__",0));
               arg.AddArg("id",m_id);
               //trace(m_id);
               /*if (TDataSet::exec(m_config, "query_remark", arg.GetString(),x) != 1)
               {
                  trace(x.GetXmlDoc().text);
                  return -1;
               }*/
               if (url::get("QuickCode/entity/list_remark",arg.GetString(),x) != 1)
               {
                  trace(x.GetXmlDoc().text);
                  return -1;
               }
            }
            else
            {            trace("asdasd");
               arg.AddArg("id",m_id);
               arg.AddArg("querytxt","");
               /*if (TDataSet::exec(m_config, "query", arg.GetString(),x) != 1)
               {
                  trace(x.GetXmlDoc().text);
                  return -1;
               }*/
               if (url::get("QuickCode/entity/list",arg.GetString(),x) != 1)
               {
                  trace(x.GetXmlDoc().text);
                  return -1;
               }
            }
            dw_list.Retrieve(x);
            alert(L"导入成功!");
            dw_list.Redraw();
            return 1;
         }
         string jxParam(string p, string n)
         {
            if(p != "")
            {
               p +="&";
               int i = 1;
               while (p.find("=",0)>0)
               {
                  string name = p.mid(0, p.find("=",0));
                  string value = p.mid(p.find("=",0) + 1, p.find("&",0) - p.find("=",0) - 1);
                  if(name==n) return ""+value;
                  i += 1;
                  p = p.mid(p.find("&",0) + 1, p.length());
               }
            }
            return "";
         }
         int getURLParam()
         {
            if(GetParam())
            {
               xpage__ xp=new xpage__;
               xp.setNativePointer(this.GetXPage());
               string aurl = xp.GetWkUrl();
               xaserverarg__ arg;
               if(aurl && aurl.find("native=true",0)>0)
               {
                  int p = this.GetParam();
                  arg = new xaserverarg__;
                  arg.setNativePointer(p);
               }
               else
               {
                  arg = GetParam();
               }
               string config = arg.GetArgString("config");
               xml__ x = new xml__;
               x.setNativePointer(xml__::CreateInstance());
               if(config == "")
               {
                  string configXml = arg.GetArgString("configxml");
                  x.LoadXml(configXml);
               }
               else
               {
                  getUrl(config, "", x);
               }
               m_configDoc = x.GetXmlDoc();
            }
            return 1;
         }
         int loaded()
         {
            getURLParam();
            msxml::IXMLDOMDocument    ee=m_configDoc;
            string id=m_id;
            var n = ee.selectSingleNode("//list/dwview[@type='dwgrid'][@id='"+id+"']");
            string vface = m_configDoc.selectSingleNode("//vface[1]").text;
            string dwname = "";//e.selectsingleNode("@name").text;
            string tpl = "";//e.selectsingleNode("@url").text;
            string dbmap = "";
            if(n)
            {
               msxml::IXMLDOMElement e = n;
               //trace(e.xml);
               if(e.selectSingleNode("@name")) dwname = e.selectSingleNode("@name").text;
               if(e.selectSingleNode("@url")) tpl = e.selectSingleNode("@url").text;
               if(e.selectSingleNode("@dbmap")) dbmap = e.selectSingleNode("@dbmap").text;
               //trace(vface +"/"+ tpl);
               //trace(selectmode);
            }
      }
      xutil::RestoreCursor(hCursor);
      return 0;
   }
   int OnXCommand(TEvent* evt, LPARAM param)
   {
      return OnCmdDispatch(evt->xcommand.pStrID);
   }
   int OnSetFocus(TEvent* evt, LPARAM p) {
      SetAgent();
      return 1;
   }
   int OnClicked(TEvent* evt, LPARAM p)
   {
      DWNMHDR& hdr = *(DWNMHDR*)evt->notify.pnmh;
      int row = hdr.row;
      int col = hdr.col + 1;
      xstring colname = dw_list.GetColumnName(col);
      trace(colname);
      xaserverarg arg;
      xstring comdid;
      if (colname == L"CategoryID")
      {
         openUrl(L"产品资料.vface/xpage/product/category/dialog", arg);
         comdid = arg.GetArgString(L"comdid");
         if (comdid == L"ok")
         {
            xstring CategoryID = arg.GetArgString(L"CategoryID");
            xstring CName = arg.GetArgString(L"CName");
            dw_list.SetItemDisplayString(row, colname.c_str(), CName);
            dw_list.SetItemString(row, colname.c_str(), CategoryID);
            dw_list.Redraw();
         }
      }
      else if (colname == L"MkOrgId")
      {
         openUrl(L"组织架构.vface/xpage/HrOrg/Chart", arg);
         comdid = arg.GetArgString(L"comdid");
         if (comdid == L"xmOk")
         {
            xstring OrgName = arg.GetArgString(L"OrgName");
            xstring OrgId = arg.GetArgString(L"OrgId");
            dw_list.SetItemDisplayString(row, colname.c_str(), OrgName);
            dw_list.SetItemString(row, colname.c_str(), OrgId);
            dw_list.Redraw();
         }
      }
      else if (colname == L"Cid")
      {
         openUrl(L"组织架构.vface/xpage/hremployee/select", arg);
         comdid = arg.GetArgString(L"comdid");
         if (comdid == L"xmOk")
         {
            xstring sPersonID = arg.GetArgString(L"sPersonID");
            trace(sPersonID);
            xstring sPersonName = arg.GetArgString(L"sPersonName");
            dw_list.SetItemDisplayString(row, colname.c_str(), sPersonName);
            dw_list.SetItemString(row, colname.c_str(), sPersonID);
            dw_list.Redraw();
         }
      }
      return 1;
   }
   int OnDoubleClicked(TEvent* evt, LPARAM p)
   {
      DWNMHDR& hdr = *(DWNMHDR*)evt->notify.pnmh;
      int row = hdr.row;
      if (row<1 || row > dw_list.GetRowCount()) return 0;
      xaserverarg arg;
      //xstring str = hdr.data;
      xstring colname = hdr.colname;
      xstring str = dw_list.GetItemString(row, colname.c_str());
      arg.AddArg(L"value", str);
      openUrl(L"/sale/view/view.dlg/xpage/memo/edit", arg);
      xstring comdid = arg.GetArgString(L"comdid");
      if (comdid == L"xmOK")
      {
         xstring value = arg.GetArgString(L"value");
         dw_list.SetItemString(row, colname.c_str(), value);
         dw_list.Redraw();
      }
      return 1;
   }
   int ItemOutput()
   {
      xstring d = publiccode::GetCurrentDate();
      d = d.left(10) + L"";
      dw_list.SaveAs(d);
      return 1;
   }
   int OnSelectAllRow()
   {
      int rows = dw_list.GetRowCount();
      if (rows < 1) return -1;
      dw_list.SelectRow(1, rows, true);
      dw_list.Redraw();
      return 1;
   }
   int OnRowCopy()
   {
      int rows = dw_list.GetRowCount();
      if (rows < 1) return -1;
      int cols = dw_list.GetColumnCount();
      xstring str = L"";
      int row = dw_list.GetNextSelectRow(1);
      int i;
      while (row > 0)
      {
         xstring tmp1 = L"";
         for (i = 1; i < cols; i++)
         {
            int w = dw_list.GetColumnWidth(i);
            if (w < 5) continue;
            xstring tmp;
            if (dw_list.GetItemDisplayString(row, i + 1))
               tmp = dw_list.GetItemDisplayString(row, i + 1);
            else
            {
               var m = ee.selectSingleNode("//list");
               msxml::IXMLDOMElement e1 = m;
               //trace(e.xml);
               if(e1.selectSingleNode("@name")) dwname = e1.selectSingleNode("@name").text;
               if(e1.selectSingleNode("@url")) tpl = e1.selectSingleNode("@url").text;
               if(e1.selectSingleNode("@dbmap")) dbmap = e1.selectSingleNode("@dbmap").text;
            }
            m_dbmap = dbmap;
            dw_list = new xdwgrid__;
            dw_list.setNativePointer(GetControl(dwname));
            dw_list.openUrl(vface +"/"+ tpl);
            //dw_list.SetSelectionMode(4);
               tmp = dw_list.GetItemString(row, i + 1);
            tmp1 += tmp + L"\t";
         }
         int Onital()
         {
            //地区
            xml__ x1=new xml__;
            x1.setNativePointer(xml__::CreateInstance());
            xaserverarg__ arg1=new xaserverarg__;
            arg1.setNativePointer(arg1.CreateInstance());
            arg1.AddArg("id","地区");
            if (url::get("/sale/data/QuickCode/entity/list",arg1.GetString(),x1) != 1)
            {
               trace(x1.GetXmlDoc().text);
               return -1;
            }
         str += tmp1 + L"\r\n";
         row = dw_list.GetNextSelectRow(row + 1);
      }
      dw_list.SetDataToClip(str);
      return 1;
   }
   int OnColCopy(xstring col)
   {
      int rows = dw_list.GetRowCount();
      if (rows < 1) return -1;
      xstring str = L"";
      int row = dw_list.GetNextSelectRow(1);
      while (row > 0)
      {
         xstring tmp;
         if (dw_list.GetItemDisplayString(row, col.c_str()))
            tmp = dw_list.GetItemDisplayString(row, col.c_str());
         else
            tmp = dw_list.GetItemString(row, col.c_str());
         str += tmp + L"\r\n";
         row = dw_list.GetNextSelectRow(row + 1);
      }
      dw_list.SetDataToClip(str);
            var list = x1.GetXmlDoc().selectNodes("root/item");
            int i;
            int s = list.length;
            if(s>0)
            {
               string str = "<cellprop celltype='' cellformatex='' cellformat='' cellprotectex='' cellprotect='保护' cellvisibleex='' cellvisible='' cellvalid='' cellinitial=''><edit edittype='ddlb' ddlbxml='&lt;data>";
               for(i=0;i<s;i++)
               {
                  msxml::IXMLDOMElement xitem = list.item(i);
                  string id="";
                  if(xitem.selectSingleNode("Code"))
                     id = xitem.selectSingleNode("Code").text;
                  string name ="";
                  if(xitem.selectSingleNode("Meaning"))
                     name = xitem.selectSingleNode("Meaning").text;
                  string tmp = "&lt;row>&lt;显示列>"+name+"&lt;/显示列>&lt;数据列>"+id+"&lt;/数据列>&lt;/row>";
                  str += tmp;
               }
               str += "&lt;/data>'/></cellprop>";
      return 1;
   }
   int OnRClick(TEvent* evt, LPARAM p)
   {
      DWNMHDR& hdr = *(DWNMHDR*)evt->notify.pnmh;
      int row = hdr.row;
      HMENU m = CreatePopupMenu();
      int MF_STRING = 0x00000000;
      int MF_DISABLED = 0x00000002;
      int TPM_RIGHTBUTTON = 0x0002;
      int TPM_RETURNCMD = 0x0100;
      int MF_CHECKED = 0x8;
      int MF_SEPARATOR = 0x0800;
      AppendMenu(m, MF_STRING, 1, L"复制行");
      AppendMenu(m, MF_STRING, 101, L"复制列");
      AppendMenu(m, MF_SEPARATOR, -1, L"");
      AppendMenu(m, MF_STRING, 2, L"ȫѡ");
      AppendMenu(m, MF_SEPARATOR, -1, L"");
      AppendMenu(m, MF_STRING, 4, L"导出到Excel");
      AppendMenu(m, MF_SEPARATOR, -1, L"");
      AppendMenu(m, MF_STRING, 6, L"显示列设置");
      RECT xr;
      xpoint pt;
      GetCursorPos(pt);
      int ret = TrackPopupMenu(m, TPM_RIGHTBUTTON | TPM_RETURNCMD, pt.x, pt.y, 0, GetHWND(), &xr);
               dw_list.SetColumnProps("AreaCode",str);
            }
            //币别
            xml__ x2=new xml__;
            x2.setNativePointer(xml__::CreateInstance());
            xaserverarg__ arg2=new xaserverarg__;
            arg2.setNativePointer(arg2.CreateInstance());
            arg2.AddArg("id","FND_Currency");
            if (url::get("/sale/data/QuickCode/entity/list",arg2.GetString(),x2) != 1)
            {
               trace(x2.GetXmlDoc().text);
               return -1;
            }
      //trace(ret);
      HCURSOR hCursor = xutil::SetCursorWait();
      if (ret == 1) { OnRowCopy(); }
      else if (ret == 101) {
         xstring colname = hdr.colname;
         if (colname != L"")
            OnColCopy(colname);
      }
      else if (ret == 2) { OnSelectAllRow(); }
      else if (ret == 4) { ItemOutput(); }
      else if (ret == 6) {}
      xutil::RestoreCursor(hCursor);
            var list1 = x2.GetXmlDoc().selectNodes("root/item");
            int j;
            int s1 = list1.length;
            if(s1>0)
            {
               string str1 = "<cellprop celltype='' cellformatex='' cellformat='' cellprotectex='' cellprotect='保护' cellvisibleex='' cellvisible='' cellvalid='' cellinitial=''><edit edittype='ddlb' ddlbxml='&lt;data>";
               for(j=0;j<s1;j++)
               {
                  msxml::IXMLDOMElement xitem1 = list1.item(j);
                  string id1="";
                  if(xitem1.selectSingleNode("Code"))
                     id1 = xitem1.selectSingleNode("Code").text;
                  string name1 ="";
                  if(xitem1.selectSingleNode("Name"))
                     name1 = xitem1.selectSingleNode("Name").text;
                  string tmp1 = "&lt;row>&lt;显示列>"+name1+"&lt;/显示列>&lt;数据列>"+id1+"&lt;/数据列>&lt;/row>";
                  str1 += tmp1;
               }
               str1 += "&lt;/data>'/></cellprop>";
      return 1;
   }
   int OnAttachEvent()
   {
      //获取焦点事件,用于重置工具条
      AttachEvent(L"WM_SETFOCUS", (FEvent)&QuickCode::OnSetFocus);
      //绑定工具条点击事件
      AttachEvent(L"WM_XCOMMAND", (FEvent)&QuickCode::OnXCommand);
      AttachEvent(L"dw_list", L"DWV_DOUBLECLICKED", (FEvent)&QuickCode::OnDoubleClicked);//行双击
      AttachEvent(L"dw_list", L"DWV_ITEMBEINGEDIT", (FEvent)&QuickCode::OnClicked);
      AttachEvent(L"dw_list", L"DWV_RCLICKED", (FEvent)&QuickCode::OnRClick);//鼠标右键
      return 1;
   }
   int OnRetrieve()
   {
      xml x;
      xaserverarg arg;
               dw_list.SetColumnProps("FromCurrencyCode",str1);
            }
            //国家
            xml__ x3=new xml__;
            x3.setNativePointer(xml__::CreateInstance());
            xaserverarg__ arg3=new xaserverarg__;
            arg3.setNativePointer(arg3.CreateInstance());
            arg3.AddArg("id","FND_Country");
            if (url::get("/sale/data/QuickCode/entity/list",arg3.GetString(),x3) != 1)
            {
               trace(x3.GetXmlDoc().text);
               return -1;
            }
      trace(L"asdasd");
            var list2 = x3.GetXmlDoc().selectNodes("root/item");
            int k;
            int s2 = list2.length;
            if(s2>0)
            {
               string str2 = "<cellprop celltype='' cellformatex='' cellformat='' cellprotectex='' cellprotect='保护' cellvisibleex='' cellvisible='' cellvalid='' cellinitial=''><edit edittype='ddlb' ddlbxml='&lt;data>";
               for(k=0;k<s2;k++)
               {
                  msxml::IXMLDOMElement xitem2 = list2.item(k);
                  string id2="";
                  if(xitem2.selectSingleNode("Code"))
                     id2 = xitem2.selectSingleNode("Code").text;
                  string name2 ="";
                  if(xitem2.selectSingleNode("Name"))
                     name2 = xitem2.selectSingleNode("Name").text;
                  string tmp2 = "&lt;row>&lt;显示列>"+name2+"&lt;/显示列>&lt;数据列>"+id2+"&lt;/数据列>&lt;/row>";
                  str2 += tmp2;
               }
               str2 += "&lt;/data>'/></cellprop>";
               dw_list.SetColumnProps("MkCountryId",str2);
            }
         dw_list.SetReadOnlyColumn("ToCurrencyCode");
         }
         int onload()
      if (m_id.find(L"", 0) > 0)
      {
         m_id = m_id.mid(0, m_id.find(L"", 0));
         arg.AddArg(L"id", m_id);
         //trace(m_id);
         /*if (TDataSet::exec(m_config, L"query_remark", arg.GetString(),x) != 1)
         {
            m_config = "QuickCode.config";
            m_agent = "";
            //dw_list = new xdwgrid__;
            //dw_list.setNativePointer(GetControl("dw_list"));
            //dw_list.SetSelectionMode(4);
            //dw_list.AllowSort(false);
            if(this.GetParam())
            {
               xaserverarg__ arg = this.GetParam();
               string id = arg.GetArgString("id");
               if(id == "") return 0;
               m_id = id;
               loaded();
               /*string tpl = arg.GetArgString("tpl");
               if(tpl == "" && (m_id.find("__",0) >0))
                  tpl = "QuickCode.tpl/QuickCode_Remark";
               else if(tpl == "" )
                  tpl = "QuickCode.tpl/QuickCode";
               dw_list.SetDataObject(GetServerUrl(),"dev:sheet["+tpl+"]");
               string dbmap = arg.GetArgString("dbmap");
               if(dbmap == ""  && (m_id.find("__",0)  >0) )
                  dbmap = "QuickCode_Remark.dbmap";
               else if(dbmap == "")
                  dbmap ="QuickCode.dbmap";
               m_dbmap = dbmap;
               string name = arg.GetArgString("name");
               if(name == "")
                  name = id;
               m_name = name;
               string title = arg.GetArgString("title");
               if(title != "")
                  win__::SetWindowText(this.GetHWND(),title);*/
               /*
               param p = this.GetParam();
               string pa = ""+p;
               //string pa = "id=HrOrgType&title=客户类型";
               string id = jxParam(pa,"id");
               if(id == "") return 0;
               m_id = id;
               string tpl = jxParam(pa,"tpl");
               if(tpl == "" && (m_id.find("__",0) >0))
                  tpl = "QuickCode.tpl/QuickCode_Remark";
               else if(tpl == "" )
                  tpl = "QuickCode.tpl/QuickCode";
               dw_list.SetDataObject(GetServerUrl(),"dev:sheet["+tpl+"]");
               string dbmap = jxParam(pa,"dbmap");
               if(dbmap == ""  && (m_id.find("__",0)  >0) )
                  dbmap = "QuickCode_Remark.dbmap";
               else if(dbmap == "")
                  dbmap ="QuickCode.dbmap";
               m_dbmap = dbmap;
               //trace(m_dbmap);
               string name = jxParam(pa,"name");
               if(name == "")
                  name = id;
               m_name = name;
               string title = jxParam(pa,"title");
               if(title != "")
                  win__::SetWindowText(this.GetHWND(),title);*/
               OnRetrieve();
            }
            OnAttachEvent();
            SetAgent();
            Onital();
            return 1;
            trace(x.text());
            return -1;
         }*/
         if (xurl::get(L"QuickCode/entity/list_remark", arg.GetString(), x) != 1)
         {
            trace(x.text());
            return -1;
         }
      ]
   ]
]
      }
      else
      {
         trace(L"asdasd");
         arg.AddArg(L"id", m_id);
         arg.AddArg(L"querytxt", L"");
         /*if (TDataSet::exec(m_config, L"query", arg.GetString(),x) != 1)
         {
            trace(x.text());
            return -1;
         }*/
         if (xurl::get(L"QuickCode/entity/list", arg.GetString(), x) != 1)
         {
            trace(x.text());
            return -1;
         }
      }
      dw_list.Retrieve(x);
      dw_list.Redraw();
      return 1;
   }
   xstring jxParam(xstring p, xstring n)
   {
      if (p != L"")
      {
         p += L"&";
         int i = 1;
         while (p.find(L"=", 0) > 0)
         {
            xstring name = p.mid(0, p.find(L"=", 0));
            xstring value = p.mid(p.find(L"=", 0) + 1, p.find(L"&", 0) - p.find(L"=", 0) - 1);
            if (name == n) return L"" + value;
            i += 1;
            p = p.mid(p.find(L"&", 0) + 1, p.length());
         }
      }
      return L"";
   }
   int getURLParam()
   {
      if (GetWinParam())
      {
         xpage xp = GetXPage();
         xstring aurl = xp.GetWkUrl();
         xaserverarg arg = GetArg();
         xstring config = arg.GetArgString(L"config");
         xml x;
         if (config == L"")
         {
            xstring configXml = arg.GetArgString(L"configxml");
            x.loadXML(configXml);
         }
         else
         {
            getUrl(config, L"", x);
         }
         m_configDoc = x;
      }
      return 1;
   }
   int loaded()
   {
      getURLParam();
      KXMLDOMDocument    ee = m_configDoc;
      xstring id = m_id;
      auto n = ee.selectSingleNode(L"//list/dwview[@type='dwgrid'][@id='" + id + L"']");
      xstring vface = m_configDoc.selectSingleNode(L"//vface[1]").text();
      xstring dwname = L"";//e.selectsingleNode(L"@name").text();
      xstring tpl = L"";//e.selectsingleNode(L"@url").text();
      xstring dbmap = L"";
      if (n)
      {
         KXMLDOMElement e = n;
         //trace(e.xml());
         if (e.selectSingleNode(L"@name")) dwname = e.selectSingleNode(L"@name").text();
         if (e.selectSingleNode(L"@url")) tpl = e.selectSingleNode(L"@url").text();
         if (e.selectSingleNode(L"@dbmap")) dbmap = e.selectSingleNode(L"@dbmap").text();
         //trace(vface +L"/"+ tpl);
         //trace(selectmode);
      }
      else
      {
         auto m = ee.selectSingleNode(L"//list");
         KXMLDOMElement e1 = m;
         //trace(e.xml());
         if (e1.selectSingleNode(L"@name")) dwname = e1.selectSingleNode(L"@name").text();
         if (e1.selectSingleNode(L"@url")) tpl = e1.selectSingleNode(L"@url").text();
         if (e1.selectSingleNode(L"@dbmap")) dbmap = e1.selectSingleNode(L"@dbmap").text();
      }
      m_dbmap = dbmap;
      dw_list = GetControl(dwname);
      dw_list.openUrl(vface + L"/" + tpl);
      //dw_list.SetSelectionMode(4);
      return 1;
   }
   int Onital()
   {
      //地区
      xml x1;
      xaserverarg arg1;
      arg1.AddArg(L"id", L"地区");
      if (xurl::get(L"/sale/data/QuickCode/entity/list", arg1.GetString(), x1) != 1)
      {
         trace(x1.text());
         return -1;
      }
      auto list = x1.selectNodes(L"root/item");
      int i;
      int s = list.length();
      if (s > 0)
      {
         xstring str = L"<cellprop celltype='' cellformatex='' cellformat='' cellprotectex='' cellprotect='保护' cellvisibleex='' cellvisible='' cellvalid='' cellinitial=''><edit edittype='ddlb' ddlbxml='&lt;data>";
         for (i = 0; i < s; i++)
         {
            KXMLDOMElement xitem = list.item(i);
            xstring id = L"";
            if (xitem.selectSingleNode(L"Code"))
               id = xitem.selectSingleNode(L"Code").text();
            xstring name = L"";
            if (xitem.selectSingleNode(L"Meaning"))
               name = xitem.selectSingleNode(L"Meaning").text();
            xstring tmp = L"&lt;row>&lt;显示列>" + name + L"&lt;/显示列>&lt;数据列>" + id + L"&lt;/数据列>&lt;/row>";
            str += tmp;
         }
         str += L"&lt;/data>'/></cellprop>";
         dw_list.SetColumnProps(L"AreaCode", str);
      }
      //币别
      xml x2;
      xaserverarg arg2;
      arg2.AddArg(L"id", L"FND_Currency");
      if (xurl::get(L"/sale/data/QuickCode/entity/list", arg2.GetString(), x2) != 1)
      {
         trace(x2.text());
         return -1;
      }
      auto list1 = x2.selectNodes(L"root/item");
      int j;
      int s1 = list1.length();
      if (s1 > 0)
      {
         xstring str1 = L"<cellprop celltype='' cellformatex='' cellformat='' cellprotectex='' cellprotect='保护' cellvisibleex='' cellvisible='' cellvalid='' cellinitial=''><edit edittype='ddlb' ddlbxml='&lt;data>";
         for (j = 0; j < s1; j++)
         {
            KXMLDOMElement xitem1 = list1.item(j);
            xstring id1 = L"";
            if (xitem1.selectSingleNode(L"Code"))
               id1 = xitem1.selectSingleNode(L"Code").text();
            xstring name1 = L"";
            if (xitem1.selectSingleNode(L"Name"))
               name1 = xitem1.selectSingleNode(L"Name").text();
            xstring tmp1 = L"&lt;row>&lt;显示列>" + name1 + L"&lt;/显示列>&lt;数据列>" + id1 + L"&lt;/数据列>&lt;/row>";
            str1 += tmp1;
         }
         str1 += L"&lt;/data>'/></cellprop>";
         dw_list.SetColumnProps(L"FromCurrencyCode", str1);
      }
      //国家
      xml x3;
      xaserverarg arg3;
      arg3.AddArg(L"id", L"FND_Country");
      if (xurl::get(L"/sale/data/QuickCode/entity/list", arg3.GetString(), x3) != 1)
      {
         trace(x3.text());
         return -1;
      }
      auto list2 = x3.selectNodes(L"root/item");
      int k;
      int s2 = list2.length();
      if (s2 > 0)
      {
         xstring str2 = L"<cellprop celltype='' cellformatex='' cellformat='' cellprotectex='' cellprotect='保护' cellvisibleex='' cellvisible='' cellvalid='' cellinitial=''><edit edittype='ddlb' ddlbxml='&lt;data>";
         for (k = 0; k < s2; k++)
         {
            KXMLDOMElement xitem2 = list2.item(k);
            xstring id2 = L"";
            if (xitem2.selectSingleNode(L"Code"))
               id2 = xitem2.selectSingleNode(L"Code").text();
            xstring name2 = L"";
            if (xitem2.selectSingleNode(L"Name"))
               name2 = xitem2.selectSingleNode(L"Name").text();
            xstring tmp2 = L"&lt;row>&lt;显示列>" + name2 + L"&lt;/显示列>&lt;数据列>" + id2 + L"&lt;/数据列>&lt;/row>";
            str2 += tmp2;
         }
         str2 += L"&lt;/data>'/></cellprop>";
         dw_list.SetColumnProps(L"MkCountryId", str2);
      }
      dw_list.SetReadOnlyColumn(L"ToCurrencyCode");
   }
   int onload()
   {
      SetArg();
      m_config = L"QuickCode.config";
      m_agent = L"";
      //dw_list = new xdwgrid;
      //dw_list.setNativePointer(GetControl(L"dw_list"));
      //dw_list.SetSelectionMode(4);
      //dw_list.AllowSort(false);
      if (GetWinParam())
      {
         xaserverarg arg = GetArg();
         xstring id = arg.GetArgString(L"id");
         if (id == L"") return 0;
         m_id = id;
         loaded();
         /*xstring tpl = arg.GetArgString(L"tpl");
         if(tpl == L"" && (m_id.find(L"",0) >0))
            tpl = L"QuickCode.tpl/QuickCode_Remark";
         else if(tpl == L"" )
            tpl = L"QuickCode.tpl/QuickCode";
         dw_list.SetDataObject(GetServerUrl(),L"dev:sheet["+tpl+L"]");
         xstring dbmap = arg.GetArgString(L"dbmap");
         if(dbmap == L""  && (m_id.find(L"",0)  >0) )
            dbmap = L"QuickCode_Remark.dbmap";
         else if(dbmap == L"")
            dbmap =L"QuickCode.dbmap";
         m_dbmap = dbmap;
         xstring name = arg.GetArgString(L"name");
         if(name == L"")
            name = id;
         m_name = name;
         xstring title = arg.GetArgString(L"title");
         if(title != L"")
            win::SetWindowText(GetHWND(),title);*/
            /*
            param p = GetParam();
            xstring pa = L""+p;
            //xstring pa = L"id=HrOrgType&title=客户类型";
            xstring id = jxParam(pa,L"id");
            if(id == L"") return 0;
            m_id = id;
            xstring tpl = jxParam(pa,L"tpl");
            if(tpl == L"" && (m_id.find(L"",0) >0))
               tpl = L"QuickCode.tpl/QuickCode_Remark";
            else if(tpl == L"" )
               tpl = L"QuickCode.tpl/QuickCode";
            dw_list.SetDataObject(GetServerUrl(),L"dev:sheet["+tpl+L"]");
            xstring dbmap = jxParam(pa,L"dbmap");
            if(dbmap == L""  && (m_id.find(L"",0)  >0) )
               dbmap = L"QuickCode_Remark.dbmap";
            else if(dbmap == L"")
               dbmap =L"QuickCode.dbmap";
            m_dbmap = dbmap;
            //trace(m_dbmap);
            xstring name = jxParam(pa,L"name");
            if(name == L"")
               name = id;
            m_name = name;
            xstring title = jxParam(pa,L"title");
            if(title != L"")
               win::SetWindowText(GetHWND(),title);*/
         OnRetrieve();
      }
      OnAttachEvent();
      SetAgent();
      Onital();
      return 1;
   }
};