obsidian-notes/代码/编辑框数据有效性判断.md
CSSC-WORK\murmur 3e6078442b init version
2024-04-15 11:19:57 +08:00

2.8 KiB
Raw Permalink Blame History

title updated created tags
编辑框数据有效性判断 2022-03-14 07:46:12Z 2022-01-17 02:27:09Z
数据筛选

数据有效性判断可分为两个部分,一是对单次输入的数字判断,滤除无效字符,二是输入完毕后对整个数据进行判断,如区间检查等

过滤单个字符

在输入时限制无效字符输入

winform.plus.editBox.wndproc = function(hwnd,message,wParam,lParam){
	if(message == 0x102/*_WM_CHAR*/){//对输入字符进行约束不能识别非eng输入法状态下的输入
			if(wParam >= '0'# and wParam <= '9'#){
    			return ; 
    		}
    		destr = wParam
    		select(wParam) {
    		    case '-'# {
    		        if(min > 0){
    		        	return 1; 
    		        }
    		        if(tmp2){
    		           key.press(0x8/*_VK_BACK*/)
    		        }
    		    	if(string.indexOf(ctrl.text,'-')){
    		    		ctrl.text = string.trimleft(ctrl.text,"-")
    		    		ctrl.setsel(tmp-1)
    		    		return 1; 
    		    	}
    		    	else {
    		    		ctrl.text = string.concat("-",ctrl.text)
    		    		ctrl.setsel(tmp+1)
    		    		return 1; 
    		    	}
    		    	
    			}
    			case 'e'#, 'E'# {
    		    	if(!string.indexOf(ctrl.text,'E') and !string.indexOf(ctrl.text,'e')){
    		    		return; 
    		    	}
    			}
    			case '.'# {
    		    	if(!string.indexOf(ctrl.text,'.')){
    		    		return ; 
    		    	}
    			}
    			case 'g'#, 'G'# {
    			    if(tmp2){
    		           key.press(0x8/*_VK_BACK*/)
    		        }
    		        if(ctrl.text != ""){
    		    		ctrl.text = tonumber(ctrl.text) * 1e3
    		    		ctrl.setsel(-1)
    		    	}
    		    	return 1; 
    			}
    			case 'm'#, 'M'# {
    			    if(tmp2){
    		           key.press(0x8/*_VK_BACK*/)
    		        }
    		        if(ctrl.text != ""){
    		    		ctrl.text = tonumber(ctrl.text) * 1e0
    		    		ctrl.setsel(-1)
    		    	}
    		    	return 1; 
    			}
    			case 'k'#, 'K'# {
    			    if(tmp2){
    		           key.press(0x8/*_VK_BACK*/)
    		        }
    		        if(ctrl.text != ""){
    		    		ctrl.text = tonumber(ctrl.text) / 1e3
    		    		ctrl.setsel(-1)
    		    	}
    		    	return 1; 
    			}
    			case 0x11/*_VK_CTRL*/{
    				if(!tmp2){
						var str = string.slice(ctrl.text,tmp,tmp2); 
						if(#tonumber(str) == #str){
							//左侧数字+1
						}
					}
    			}
    		}
			return 1; //其余字符全部屏蔽
		}

检查单次数据

在编辑框更新后判断上限有效性

case 0x300/*_EN_CHANGE*/ {
			if(tonumber(owner.text) >= 1e3){//判断新数据范围
				owner.text = lstValue//无效时恢复最后一次有效数据
				owner.setsel(tmp)//恢复光标位置
			}
			lstValue = owner.text//更新最后一次有效数据
}

在失去焦点后评断下限有效性

#数据筛选