客户流程系统设计

By admin at 2018-02-07 • 0人收藏 • 1896人看过

要实现以下功能:

//流程管理

//1.可添加 / 可删除 / 可编辑 / 可排序

//2.设置子程序 / 调用子程序

//3.可设置每条程序的开关 / 子程序的开关

//4.可暂停 / 继续 / 设置中断点 

//5.可反向执行 / 可设置反向执行点(?)


8 个回复 | 最后更新于 2019-05-18
2018-02-07   #1

//想法

//记录程序用table表, 子程序就可以用table表嵌套实现

//状态切换可以用select()case选择,或者用枚举函数类似echaCtrl()

//反向执行考虑用_get和_set来实现,或者用闭包函数


2018-02-08   #2

流程设置界面功能1:

blob.png


2018-02-08   #3

设置窗口1:运动控制

blob.png

设置窗口2:辅助控制

blob.png

设置窗口3:子程序

blob.png

设置窗口4:流程控制

blob.png

上述窗口,左侧一般使用tabs来实现.

但是子程序这个必须使用listbox,因为这个是用户自己添加的,不知道有多少条

右侧可以使用custom控件实现.(图文并茂最好)

2018-02-08   #4
//字符串重构为table
var tabstr = '{["速度"]=1000;["模式"]="相对运动";["距离"]=2380;["是否等待"]="否";}'
var tab = eval(tabstr);
console.dump(tab)
console.log(tab["模式"])


2018-02-08   #5
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;

blob.png

2018-02-08   #6
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;


2018-02-27   #7

listview中滚动条显示到指定项:

例如: 查找列表中是否有相同的内容项, 有的话, 就高亮显示这行,滚动条滚动到此处!

    for(i=1;winform.子流程列表.count;1){
        if(winform.子流程列表.getItemText(i,1) == str){
                //设置选中
            winform.子流程列表.selIndex = i;
            //设置焦点
            winform.子流程列表.setFocus()
            //滚动到保证显示指定项
            winform.子流程列表.ensureVisible();
            break ;
        }
    }


2019-05-18   #8

image.png

登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...