客户流程系统设计
By
admin
at 2018-02-07 • 0人收藏 • 1923人看过
要实现以下功能:
//流程管理
//1.可添加 / 可删除 / 可编辑 / 可排序
//2.设置子程序 / 调用子程序
//3.可设置每条程序的开关 / 子程序的开关
//4.可暂停 / 继续 / 设置中断点
//5.可反向执行 / 可设置反向执行点(?)
8 个回复 | 最后更新于 2019-05-18
import win.ui; /*DSG{{*/ var winform = win.form(text="aardio form";right=983;bottom=560;parent=...) winform.add( 流程编辑框={cls="listview";left=0;top=0;right=984;bottom=394;ah=1;aw=1;edge=1;font=LOGFONT(h=-16);fullRow=1;gridLines=1;msel=false;vscroll=1;z=1} ) /*}}*/ import win.imageList; var imagelist = win.imageList(1,30); winform.流程编辑框.setImageList( imagelist,1/*_LVSIL_SMALL*/ ); winform.流程编辑框.wndproc = function(hwnd,message,wParam,lParam){ //禁止改变列头宽度 if( message == 0x004e/*_WM_NOTIFY*/ ){ var hdr = ::NMHDR() raw.convert(topointer(lParam),hdr); if(hdr.code == 0xFFFFFEBA/*HDN_ENDTRACKW*/ || hdr.code == 0xFFFFFECE/*HDN_ENDTRACKA*/ ){ return true; } } } //自适应列宽度 winform.流程编辑框.adjust = function(cx,cy){ winform.流程编辑框.fillParent(/*列序号*/); } winform.流程编辑框.insertColumn("",30,,0x2/*_LVCFMT_CENTER*/) winform.流程编辑框.insertColumn("中断点设置",80,,0x2/*_LVCFMT_CENTER*/) winform.流程编辑框.insertColumn("备注",300,,0x0/*_LVCFMT_LEFT*/) winform.流程编辑框.insertColumn("功能",100,,0x0/*_LVCFMT_LEFT*/) winform.流程编辑框.insertColumn("参数",300,,0x0/*_LVCFMT_LEFT*/) winform.流程编辑框.setExtended(0x4/*_LVS_EX_CHECKBOXES*/); winform.流程编辑框.addItem( { text={"";"☐";"X轴前进到对准位置";"直线运动";'{["速度"]=1000;["模式"]="相对运动";["距离"]="2380";["是否等待"]="否";}'} } ) winform.流程编辑框.addItem( { text={"";"■";"Z轴缓慢前进";"直线运动";'{["速度"]=300;["模式"]="连续运动";["是否等待"]="是";}'} } ) winform.流程编辑框.addItem( { text={"";"☐";"连续读传感器值直到大于0.8";"调用子程序";'{["调用子程序"]="连续读传感器";["是否等待"]="是";}'} } ) winform.流程编辑框.addItem( { text={"";"☐";"对准操作";"调用子程序";'{["调用子程序"]="回字形对准算法";["是否等待"]="是";}'} } ) winform.enableDpiScaling(); winform.show(); win.loopMessage(); return winform;
import win.ui; /*DSG{{*/ var winform = win.form(text="aardio form";right=983;bottom=518;border="dialog frame";parent=...) winform.add( 流程编辑框={cls="listview";left=0;top=0;right=984;bottom=461;ah=1;aw=1;dl=1;dr=1;edge=1;font=LOGFONT(name='FontAwesome';h=-16);fullRow=1;gridLines=1;msel=false;vscroll=1;z=1} ) /*}}*/ import win.fontAwesome; import gdip; import mouse; var mouseLeftdown,mouseDragmove,bx,by;//鼠标左键按下,鼠标拖拽移动 var plusAkeydownPosX,plusAkeydownPosY;//拖动时候鼠标在plus上面的位置 var preItem,newItem;//存储拖拽的序号 import win.ui.menu; import win.imageList; var imagelist = win.imageList(5,34); winform.流程编辑框.setImageList( imagelist,1/*_LVSIL_SMALL*/ ); winform.流程编辑框.wndproc = function(hwnd,message,wParam,lParam){ select( message ) { case 0x201/*_WM_LBUTTONDOWN*/ { mouseLeftdown = true; //记录下此时的xy plusAkeydownPosX,plusAkeydownPosY = mouse.getPos(); } case 0x202/*_WM_LBUTTONUP*/ { //console.log("左键松开了") mouseLeftdown = false; if(mouseDragmove){ mouseDragmove = false; winform.流程编辑框.plusA.hide = true; if(newItem != preItem){ var tabtext = {}; for(i=1;winform.流程编辑框.columnCount;1){ table.push(tabtext,winform.流程编辑框.getItemText(preItem,i)); } //注意这里!!! //会导致一个问题: //向上拖动后,会在选中行上部添加 //向下拖动后,会在选中后下部添加 //其实仔细想想这样也符合常理....于是不改了... winform.流程编辑框.delItem(preItem); winform.流程编辑框.addItem(tabtext,newItem); } } } case 0x200/*_WM_MOUSEMOVE*/{ //console.log("鼠标移动111111") if(mouseDragmove){ var x,y = mouse.getPos(); var fx,fy = win.toClient(winform.流程编辑框.hwnd,x,y) newItem = winform.流程编辑框.hitTest(); winform.流程编辑框.selIndex = newItem; winform.流程编辑框.plusA.setPos(fx-bx,fy-by); winform.流程编辑框.plusA.redraw(); } } //禁止改变列头宽度 case 0x004e/*_WM_NOTIFY*/{ var hdr = ::NMHDR() raw.convert(topointer(lParam),hdr); if(hdr.code == 0xFFFFFEBA/*HDN_ENDTRACKW*/ || hdr.code == 0xFFFFFECE/*HDN_ENDTRACKA*/ ){ return true; } } } } //自适应列宽度 winform.流程编辑框.adjust = function(cx,cy){ winform.流程编辑框.fillParent(5/*列序号*/); } winform.流程编辑框.insertColumn("",30,,0x2/*_LVCFMT_CENTER*/) winform.流程编辑框.insertColumn("中断",80,,0x2/*_LVCFMT_CENTER*/) winform.流程编辑框.insertColumn("备注",300,,0x0/*_LVCFMT_LEFT*/) winform.流程编辑框.insertColumn("功能",100,,0x0/*_LVCFMT_LEFT*/) winform.流程编辑框.insertColumn("参数",300,,0x0/*_LVCFMT_LEFT*/) winform.流程编辑框.insertColumn("",30,,0x2/*_LVCFMT_CENTER*/) winform.流程编辑框.addItem( { text={'\uF00c';'\uF1db';"X轴前进到对准位置";"直线运动";'{["速度"]=1000;["模式"]="相对运动";["距离"]="2380";["是否等待"]="否";}';'\uF01a'} } ) winform.流程编辑框.addItem( { text={'\uF00d';'\uF05e';"Z轴缓慢前进";"直线运动";'{["速度"]=300;["模式"]="连续运动";["是否等待"]="是";}';'\uF01a'} } ) winform.流程编辑框.addItem( { text={'\uF00c';'\uF1db';"连续读传感器值直到大于0.8";"调用子程序";'{["调用子程序"]="连续读传感器";["是否等待"]="是";}';'\uF01a'} } ) winform.流程编辑框.addItem( { text={'\uF00c';'\uF1db';"对准操作";"调用子程序";'{["调用子程序"]="回字形对准算法";["是否等待"]="是";}';'\uF01a'} } ) winform.流程编辑框.onnotify = function(id,code,ptr){ if( code == 0xFFFFFF9B/*_LVN_ITEMCHANGED*/ ){ /** var nmListView = winform.流程编辑框.getNotifyMessage(code,ptr); if( !nmListView ) return; if( nmListView.uNewState & 0xF000/*_LVIS_STATEIMAGEMASK*/){ var selIndex = nmListView.iItem; if( winform.流程编辑框.getChecked( selIndex ) ) winform.msgbox("选中:" + selIndex); else { winform.msgbox("取消选中:" + selIndex); } } **/ } elseif( code = 0xFFFFFFFB/*_NM_RCLICK*/ ){ var x,y = win.getMessagePos(); var nmListView = winform.流程编辑框.getNotifyMessage(code,ptr); //创建弹出菜单 var popmenu = win.ui.popmenu(winform); popmenu.add('删除',function(id){ //如果鼠标不在任何一行,那么返回的是iItem = 0 winform.流程编辑框.delItem( nmListView.iItem ) } ) popmenu.add('添加',function(id){ winform.流程编辑框.addItem(,nmListView.iItem); } ) popmenu.popup(x,y,true); popmenu.close(); } elseif( code = 0xFFFFFFFE/*_NM_CLICK*/ ){ var x,y = win.getMessagePos(); var nmListView = winform.流程编辑框.getNotifyMessage(code,ptr); if(nmListView.iSubItem == 2/* 中断列 */){ if(winform.流程编辑框.getItemText(nmListView.iItem,nmListView.iSubItem) == '\uF1db'){ winform.流程编辑框.setItemText('\uF05e',nmListView.iItem,nmListView.iSubItem); }else { winform.流程编辑框.setItemText('\uF1db',nmListView.iItem,nmListView.iSubItem); } }elseif(nmListView.iSubItem == 1/* 启/停 列 */){ if(winform.流程编辑框.getItemText(nmListView.iItem,nmListView.iSubItem) == '\uF00c'){ winform.流程编辑框.setItemText('\uF00d',nmListView.iItem,nmListView.iSubItem); }else { winform.流程编辑框.setItemText('\uF00c',nmListView.iItem,nmListView.iSubItem); } } mouseLeftdown = false; } elseif( code = 0xFFFFFFFD/*_NM_DBLCLK*/ ){ var x,y = win.getMessagePos(); var nmListView = winform.流程编辑框.getNotifyMessage(code,ptr); if(nmListView.iSubItem == 1/* 中断列 */){/* 不处理 */} elseif(nmListView.iSubItem == 2/* 中断列 */){/* 不处理 */} else { winform.msgbox(nmListView.iItem); } } elseif(code = 0xFFFFFF93/*_LVN_BEGINDRAG*/){ if(mouseLeftdown){ winform.流程编辑框.setFocus() var item = winform.流程编辑框.hitTest(plusAkeydownPosX,plusAkeydownPosY,true); if(item){ preItem = item; var rc = winform.流程编辑框.getItemRect(item); var picture = com.picture.snapClient(winform.流程编辑框.hwnd,rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top); winform.流程编辑框.addCtrl( plusA ={ cls="plus";left=0;top=0;right=50;bottom=50;autoResize=false ;bgcolor=12639424;hide=1;edge=1; clip=1;z=10; } ) winform.流程编辑框.plusA.setRect(rc); var bmp = gdip.bitmap(picture); winform.流程编辑框.plusA.setBackground(bmp); winform.流程编辑框.plusA.show(); mouseDragmove = true; bx,by = win.toClient(winform.流程编辑框.plusA.hwnd,plusAkeydownPosX,plusAkeydownPosY); } } } } winform.enableDpiScaling(); winform.show(); win.loopMessage(); return winform;
登录后方可回帖
//想法
//记录程序用table表, 子程序就可以用table表嵌套实现
//状态切换可以用select()case选择,或者用枚举函数类似echaCtrl()
//反向执行考虑用_get和_set来实现,或者用闭包函数