客户流程系统设计
By
admin
at 2018-02-07 • 0人收藏 • 1976人看过
要实现以下功能:
//流程管理
//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来实现,或者用闭包函数