客户流程系统设计

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

要实现以下功能:

//流程管理

//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

登录后方可回帖

登 录
信息栏
本站永久域名:HtmLayout.Cn
纯私人站,当笔记本用的,学到哪写到哪,目前正在学aardio+halcon机器视觉.
本 站 主 站:Stm32cube中文网
Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
aardio在线手册Aardio在线手册
Htmlayout皮肤Htmlayout皮肤引擎介绍
黑猫Aar教程网:简码编程
C大Aardio论坛:Aar爱好者论坛
AARDIO语言QQ群:70517368
赞助商:才仁机械
下载站:非凡软件站
Loading...