aardio自定义控件一例

By admin at 2019-10-07 • 2人收藏 • 4759人看过

感谢 indertust 提供的示例代码

自定义控件可以方便的把一系列的功能封装到一个控件, 这样使用的时候就不需要繁杂的复制黏贴修改了,更方便管理。

例如下面是把采集到的模拟数据显示在界面上, 通道有8个,如果按照常规写法需要拖动很多个控件来实现,封装为一个控件之后只需要业务逻辑即可。

image.png

自定义的 analogchannelex.aardio 控件库代码如下;

image.png

//analogchannelex 模拟通道
import win.ui;
import win.ui.ctrl.static;
import win.ui.ctrl.combobox;
import win.ui.ctrl.edit;
import win.ui.ctrl.metaProperty;
//上面导入所有要用到的库
namespace win.ui.ctrl{
	//自定义控件
    analogchannelex = class{
        ctor(parent,tParam){
            //添加界面样式
            this = ..win.form(text="";right=733;bottom=33;border="none";exmode="none";mode="child";parent=parent;bgcolor=null;max=false;tParam=tParam)
            this.add(
				comboboxCell={cls="combobox";left=71;top=7;right=204;bottom=27;edge=1;items={};mode="dropdown";z=1};
				comboboxSignalHi={cls="combobox";left=293;top=7;right=347;bottom=27;edge=1;items={};mode="dropdown";z=6};
				comboboxSignalLo={cls="combobox";left=227;top=7;right=281;bottom=27;edge=1;items={};mode="dropdown";z=2};
				editRandomHi={cls="edit";text="60";left=585;top=7;right=643;bottom=27;edge=1;z=8};
				editRandomLo={cls="edit";text="40";left=519;top=7;right=577;bottom=27;edge=1;z=7};
				editRangeHi={cls="edit";text="100";left=440;top=7;right=498;bottom=27;edge=1;z=5};
				editRangeLo={cls="edit";text="0";left=373;top=7;right=431;bottom=27;edge=1;z=4};
				editValue={cls="edit";text="0";left=664;top=7;right=722;bottom=27;edge=1;z=9};
				staticId={cls="static";left=14;top=7;right=53;bottom=27;bgcolor=8388608;center=1;z=3}
            );
            //这句必须放最前面,以保证自定义控件在下面可以被修改
            ..table.mixin(this@,_metaProperty)
            
            import gdi;
			import win.ui.tooltip; 
			//添加提示信息
            var tooltipCtrl = win.ui.tooltip(this);
            tooltipCtrl.addTool(this.comboboxCell,"变量",0x10/*_TTF_SUBCLASS*/ )
            tooltipCtrl.addTool(this.comboboxSignalHi,"最大信号",0x10/*_TTF_SUBCLASS*/ )
            tooltipCtrl.addTool(this.comboboxSignalLo,"最小信号",0x10/*_TTF_SUBCLASS*/ )
            tooltipCtrl.addTool(this.editRandomHi,"波动高点",0x10/*_TTF_SUBCLASS*/ )
            tooltipCtrl.addTool(this.editRandomLo,"波动低点",0x10/*_TTF_SUBCLASS*/ )
            tooltipCtrl.addTool(this.editRangeHi,"量程高点",0x10/*_TTF_SUBCLASS*/ )
            tooltipCtrl.addTool(this.editRangeLo,"量程低点",0x10/*_TTF_SUBCLASS*/ )
            tooltipCtrl.addTool(this.staticId,"通道 ID",0x10/*_TTF_SUBCLASS*/ )

			//从自定义的控件属性框里传递参数到属性
            this.staticId.text = tParam.text
            this.staticId.bgcolor = gdi.RGB(212,208,200)
            this.bgcolor = gdi.RGB(212,208,200)
            //填充默认值
            this.comboboxSignalHi.add('5')
            this.comboboxSignalHi.add('20')
            this.comboboxSignalLo.add('1')
            this.comboboxSignalLo.add('4')

            if(tParam.signalRange){
                this.signalRange = tParam.signalRange
            }else{
                this.signalRange = {1;5}
            }
            
            if(tParam.range){
                this.range = tParam.range
            }else{
                this.range = {0.01;99.9}
            }
            
            if(tParam.simulationRange){
                this.simulationRange = tParam.simulationRange
            }else{
                this.simulationRange = {40;60}
            }
 
            if(tParam.cells){
            	for(i=1;#(tParam.cells);1){
            		this.comboboxCell.add(tParam.cells[i])
            	}
            }
 			
        };
    }
    
    namespace analogchannelex{
        _metaProperty = ..win.ui.ctrl.metaProperty(

            range = {
                 _get = function(){
                    var lo = tonumber(owner.editRangeLo.text);
                    var hi = tonumber(owner.editRangeHi.text)
                    return {lo; hi};
                }
                
                 _set = function(v){
                    owner.editRangeLo.text = tostring(v[1])
                    owner.editRangeHi.text = tostring(v[2])
                }
            };
            
            signalRange = {
                 _get = function(){
                    var lo = tonumber(owner.comboboxSignalLo.text);
                    var hi = tonumber(owner.comboboxSignalHi.text)
                    return {lo; hi};
                }
                
                 _set = function(v){
                    owner.comboboxSignalLo.text = tostring(v[1])
                    owner.comboboxSignalHi.text = tostring(v[2])
                }
            };
            
            simulationRange = {
                 _get = function(){
                    var lo = tonumber(owner.editRandomLo.text);
                    var hi = tonumber(owner.editRandomHi.text)
                    return {lo; hi};
                }
                
                 _set = function(v){
                    owner.editRandomLo.text = tostring(v[1])
                    owner.editRandomHi.text = tostring(v[2])
                }
            };

        )
    }
}

使用的时候只需要拖拽出custom控件出来, 然后修改类属性为analogchannelex即可

image.png

其他属性修改参考库内定义.

使用示例代码如下 winform.aardio

import console; 
console.open()
//定义控制台的行和列数 颜色
execute("mode con cols=160 lines=500")
execute("color 0A")

var oh = console.getOutPutHandle()
var ih = console.getInputHandle()
console.modifyMode(ih,0,0x40)

p = function(...){
	console.print(time(), ...)	
}

d = console.dump
dj = console.dumpJson
vd = console.varDump

import win.ui;
import win.ui.ctrl.analogchannelex;
/*DSG{{*/
var winform = win.form(text="自定义控件测试";right=760;bottom=514)
winform.add(
ac1={cls="analogchannelex";text="1";left=30;top=34;right=733;bottom=67;bgcolor=32768;z=1};
ac2={cls="analogchannelex";text="2";left=30;top=81;right=733;bottom=114;bgcolor=32768;z=2};
ac3={cls="analogchannelex";text="3";left=30;top=129;right=733;bottom=162;bgcolor=32768;z=3};
ac4={cls="analogchannelex";text="4";left=30;top=176;right=733;bottom=209;bgcolor=32768;z=4};
ac5={cls="analogchannelex";text="5";left=30;top=224;right=733;bottom=257;bgcolor=32768;z=5};
ac6={cls="analogchannelex";text="6";left=30;top=271;right=733;bottom=304;bgcolor=32768;z=6};
ac7={cls="analogchannelex";text="7";left=30;top=319;right=733;bottom=352;bgcolor=32768;z=7};
ac8={cls="analogchannelex";text="8";left=30;top=366;right=733;bottom=399;bgcolor=32768;z=8};
button={cls="button";text="Dump 所有通道";left=50;top=424;right=166;bottom=457;z=9};
buttonDumpChannel1={cls="button";text="Dump 第一通道";left=334;top=465;right=453;bottom=498;z=10};
buttonDumpChannel2={cls="button";text="Dump 第二通道";left=195;top=467;right=314;bottom=500;z=13};
buttonTestChannel1={cls="button";text="测试第一通道";left=334;top=423;right=453;bottom=456;z=12};
buttonTestChannel2={cls="button";text="测试第二通道";left=195;top=423;right=314;bottom=456;z=11}
)
/*}}*/

dumpInfo = function(){
	for(name,ctrl in winform.eachControl("analogchannelex") ){
		p(name, ..table.tostring(ctrl.signalRange), ..table.tostring(ctrl.range), ..table.tostring(ctrl.simulationRange))
	}	
}

winform.button.oncommand = function(id,event){
	dumpInfo()
}

winform.buttonDumpChannel1.oncommand = function(id,event){
    var ctrl = winform.ac1
	p(..table.tostring(ctrl.signalRange), ..table.tostring(ctrl.range), ..table.tostring(ctrl.simulationRange))
}

winform.buttonTestChannel2.oncommand = function(id,event){
	var ctrl = winform.ac2
	
	p('ctrl.signalRange', ctrl.signalRange)
	d(ctrl.signalRange)
	
	ctrl.signalRange = {math.random(1, 100);math.random(1, 100)}
	ctrl.range = {math.random(1, 100);math.random(1, 100)}
	ctrl.simulationRange = {math.random(1, 100);math.random(1, 100)}
	
	p('ctrl.signalRange', ctrl.signalRange)
	d(ctrl.signalRange)
	//d(ctrl)
}

winform.buttonTestChannel1.oncommand = function(id,event){
	var ctrl = winform.ac1
	p('ctrl.signalRange', ctrl.signalRange)
	d(ctrl.signalRange)
	ctrl.signalRange = {math.random(1, 100);math.random(1, 100)}
	ctrl.range = {math.random(1, 100);math.random(1, 100)}
	ctrl.simulationRange = {math.random(1, 100);math.random(1, 100)}
	ctrl.comboboxCell.text = string.random(10)
	p('ctrl.signalRange', ctrl.signalRange)
	d(ctrl.signalRange)
	//d(ctrl)
	ctrl.comboboxSignalHi.text = math.random(100, 200)
}

winform.buttonDumpChannel2.oncommand = function(id,event){
    var ctrl = winform.ac2
	p(..table.tostring(ctrl.signalRange), ..table.tostring(ctrl.range), ..table.tostring(ctrl.simulationRange))
}


winform.show();
win.loopMessage();
return winform;

注意:

自定义的控件名 必须全部小写字母 

完整示例工程代码下载:

链接:https://pan.baidu.com/s/1uDWeR-WHUhTQBiue1_-S4g 

提取码:7iam 

复制这段内容后打开百度网盘手机App,操作更方便哦


5 个回复 | 最后更新于 2023-05-30
2020-03-17   #1

你的aadio 编辑器背景颜色是黑色的么?

2020-03-17   #2

回复#1 @nuck :

aardio的工具里有这个深色主题切换

image.png

2020-03-19   #3

回复#2 @admin :

厉害 已经变成黑色了

2023-05-30   #4

我记得自定义控件名现在取消全部小写的限制了


2023-05-30   #5

好像没有限制,我大小写组合没问题的

登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



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

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

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...