注:为确保示例代码能正常运行,请及时将虚表 godking.vlistEx 升级到最新版本。
虚表图片专题文章:https://blog.csdn.net/sdlgq/article/details/129944516
虚表完整例程下载:https://wwow.lanzoum.com/i074b0tvsknc
关于虚表
1、虚表是一个特殊的listview,一些特性可以通用。
2、虚表对大数据比较适合,几百万条数据毫无压力。
3、数据量大的情况下(过几十万数据):虚表占用内存非常少,加载速度也非常快。listview 占内存非常多,加载速度非常慢。
4、数据在内存中处理速度是很快的,我们看到的慢,一般是加载到组件中并显示出来这段时间太长。
虚表库增强版
下载地址 光庆·程序·在线 → aardio资源下载 → vlistEx.rar
解压到:/lib/godking/ 目录下
注意事项:
- 不要直接使用操作 listview 内容的函数,如 setItem()、addItem()、 delItem()等。
- 可使用经过重新封装的函数:setTable()、setICellText() 设置表格或单元格内容。
- 可使用:insertRow()、addRow()、delRow() 添加或删除行数据。
- 标题栏文本、宽度、格式等可以修改,但列数中途不要修改。
禁止调整列宽的方法:
- onResizeCol = true; //所有列,都允许调整列宽。
- onResizeCol = false; //所有列,都禁止调整列宽。
- onResizeCol = {true,1,2,3}; //第一个成员为true,表示表中的列允许调整列宽。其他列禁止调整。
- onResizeCol = {false,1,2,3}; //第一个成员为false,表示表中的列禁止调整列宽。其他列允许调整。
- onResizeCol = function(col) {
if ( col = 1 ) return false; // 返回false为禁止调整列宽。
}
因为listview鼠标拖动调整列宽时,如果列数较多,会导致拖动时很卡,所以做了个特殊处理:
onlyRedrawCurColOnResizeCol = true;
鼠标拖动改变列宽时,只绘制当前拖动列的内容,以加快绘制速度。
示例一:
import win.ui;
import godking.vlistEx;
/*DSG{{*/
mainForm = win.form(text="vlistEx - table adapter";right=849;bottom=578)
mainForm.add(
vlist={cls="vlistEx";left=10;top=10;right=840;bottom=570;db=1;dl=1;dr=1;dt=1;edge=1;transparent=1;z=1}
)
/*}}*/
var t = { fields={"序号","姓名","年龄","地址","身份证"} };
for(i=1;100;1){
var tt={};
tt["序号"]="[@rowindex]"; // 行序号标记是不允许编辑修改的
tt["姓名"]=math.random(1000,9999)+"姓名";
tt["年龄"]=math.random(10,99);
tt["地址"]=math.random(1000,9999)+"地址";
tt["身份证"]=math.random(1000,9999)+"身份证";
..table.push(t,tt);
}
mainForm.vlist.setTable(t,,{80,100,100,100,200},0x2);
mainForm.vlist.checkBox.show = true;
mainForm.vlist.textColor = 0xFF0000;
mainForm.vlist.setHeaderHeight(50);
mainForm.vlist.headerAlign = 1;
mainForm.vlist.lineColorH = 0x008800;
mainForm.vlist.lineColorV = 0xBB9999;
mainForm.vlist.fillParent();
mainForm.vlist.onEditBegin = true;
mainForm.vlist.onEditEnd = function(row/*行*/,col/*列*/,text/*内容*/){
/*单元格编辑完毕,是否允许单元格内容改变。返回false不允许,返回true允许,返回文本则改为新文本*/
/*不定义此事件,则默认允许改变。注意:只有onEditBegin事件返回true,此事件才会触发。*/
// 确保第三列输入数值!
if col==3 {
var r = ..tostring((..tonumber(text)):0);
if r!=text {
..win.msgbox(text++" 将转为:"++r);
return r;
}
}
return true;
}
mainForm.vlist.onSortColumn = function(col,desc){
/*点击列标题进行排序。col:列号,从1开始。desc:是否倒序。*/
owner.sort( col, desc, 0 /*数据转换:0默认 1时间 2数值 3文本*/ ,false /*使用微软api进行文本排序*/ );
}
mainForm.vlist.onRClick = function(row/*行*/,col/*列*/){
/*鼠标右键点击项目事件*/
..win.msgbox("您鼠标右键点击了:"++row++"行,"++col++"列");
}
mainForm.show();
win.loopMessage();
示例二
import win.ui;
import godking.vlistEx;
/*DSG{{*/
mainForm = win.form(text="vlistEx - table adapter";right=599;bottom=449)
mainForm.add(
listview={cls="vlistEx";left=11;top=20;right=590;bottom=430;acceptfiles=1;aw=1;db=1;dl=1;dr=1;dt=1;edge=1;hscroll=1;vscroll=1;z=1}
)
/*}}*/
//添加右键菜单,并且删除行
var listpopmenu = win.ui.popmenu(mainForm);
listpopmenu.add("删除",function(id){
mainForm.listview.delRow(mainForm.listview.getSelected());
});
listpopmenu.add("新增",function(id){
mainForm.listview.addRow("[@rowindex]","1","2","3","等待中"); //使用行索引标识符
});
listpopmenu.add("清空",function(id){
mainForm.listview.clear()
});
mainForm.listview.onRClick = function(row/*行*/,col/*列*/){
/*鼠标右键点击项目事件*/
var x,y = win.getCursorPos();
listpopmenu.popup(x,y,true);//弹出菜单
}
var t = {
{"[@rowindex]","张三",26,"山东","等待中"}//使用行索引标识符
{"[@rowindex]","李四",28,"江苏","等待中"}//使用行索引标识符
{"[@rowindex]","王五",29,"四川","等待中"}//使用行索引标识符
{"[@rowindex]","SSS",10,"四川","等待中"}//使用行索引标识符
{"[@rowindex]","AAA",35,"四川","等待中"}//使用行索引标识符
}
mainForm.listview.setTable(t)
mainForm.listview.setColumns({"序号","文件名称","文件路径","保存路径","当前状态"},,1)
mainForm.show();
win.loopMessage();
示例三:禁止调整列宽
import win.ui;
import godking.vlistEx
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
button={cls="button";text="全可调整";left=76;top=411;right=206;bottom=456;z=2};
button2={cls="button";text="全不可调整";left=235;top=407;right=365;bottom=452;z=3};
button3={cls="button";text="自定义回调函数";left=550;top=409;right=680;bottom=454;z=4};
button4={cls="button";text="部分(2\4)不可调整";left=385;top=407;right=515;bottom=452;z=5};
custom={cls="vlistEx";text="自定义控件";left=59;top=32;right=699;bottom=395;editable=0;z=1}
)
/*}}*/
winform.custom.setColumns({"111","222","333","444"},{100,50,100,50}/*列宽*/,/*格式*/)
winform.custom.addRow("asfdasf","sadfasdfasdf","sadfasdfasdf","sadfasdfasdf")
winform.custom.addRow("asfdasf","sadfasdfasdf","sadfasdfasdf","sadfasdfasdf")
winform.custom.addRow("asfdasf","sadfasdfasdf","sadfasdfasdf","sadfasdfasdf")
winform.button.oncommand = function(id,event){
winform.custom.onResizeCol = true;
}
winform.button2.oncommand = function(id,event){
winform.custom.onResizeCol = false;
}
winform.button4.oncommand = function(id,event){
winform.custom.onResizeCol = {false,2,4};
}
winform.button3.oncommand = function(id,event){
winform.custom.onResizeCol = function(col){
/*是否允许改变列宽。参数为列号。返回false为不允许,否则为允许。*/
if col = 3{
..win.msgbox("第3列不可调整")
return false;
}
}
}
winform.custom.onEditBegin = function(row/*行*/,col/*列*/){
/*鼠标双击单元格进行编辑,返回true允许编辑,否则禁止编辑。
不定义此事件,则默认不允许编辑。此事件会在onDblClick后触发。*/
return true;
}
winform.custom.onEditEnd = function(row/*行*/,col/*列*/,text/*内容*/){
/*单元格编辑完毕,是否允许单元格内容改变。返回false不允许,返回true允许,返回文本则改为新文本*/
/*不定义此事件,则默认允许改变。注意:只有onEditBegin事件返回true,此事件才会触发。*/
var t=tonumber(text)
if t===null {
//win.msgbox("请输入数值");
return "";
}
else return tostring(t);
}
winform.show();
win.loopMessage();
示例四:其他用法
import win.ui;
import godking.vlistEx;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
button={cls="button";text="写数据";left=124;top=430;right=267;bottom=468;z=2};
button2={cls="button";text="取数据";left=388;top=428;right=531;bottom=466;z=3};
listview={cls="vlistEx";left=30;top=31;right=718;bottom=428;edge=1;z=1}
)
/*}}*/
var gridTitle = "序号,报价日期,客户名称,部门,联系人,联系电话,地址,业务员,联系电话,电子邮箱,税率(%),总计(元),优惠总计(元),折扣(%),备注,id,状态,行状态"
var gridWidth = {40,80,70,140,60,60,80,80,60,80,80,0,80,80,80,80,0,70,0};
var format = 1;
var t={}
for(i=1;10;1) ..table.push(t,{序号="[@rowindex]",联系人="张三"});
winform.listview.setTable(t,gridTitle/*标题或数组*/,gridWidth/*列宽或数组*/,format/*列格式或数组*/,true/*转为数组*/)
winform.button.oncommand = function(id,event){
for(i=2;#gridWidth){
winform.listview.setCellText(1,i,gridWidth[i]);
}
winform.listview.setRowText(2,gridWidth);
}
winform.button2.oncommand = function(id,event){
import console
console.dump(winform.listview.getText()) //全部
console.dump(winform.listview.getText(2)) //第二行
console.dump(winform.listview.getText(2,3))//第二行第三列
console.dump(winform.listview.getText(,3))//第三列
}
winform.show();
win.loopMessage();
示例五:关于setRowText
数据格式(字典、数组)要与setTable时一致。
winform.button.oncommand = function(id,event){
var c = {"姓名","年龄"}
var t = {
{姓名="aaa",年龄=123}
{姓名="bbb",年龄=456}
}
winform.vlist.setTable(t,c/*标题或数组*/,/*列宽或数组*/,/*列格式或数组*/,/*字典转为数组*/,/*字符串转为Utf8*/)
winform.vlist.setRowText(2,{姓名="ccc",年龄=789}/*行数据表*/)
}
winform.button2.oncommand = function(id,event){
var c = {"姓名","年龄"}
var t = {
{姓名="aaa",年龄=123}
{姓名="bbb",年龄=456}
}
winform.vlist.setTable(t,c/*标题或数组*/,/*列宽或数组*/,/*列格式或数组*/,true/*字典转为数组*/,/*字符串转为Utf8*/)
winform.vlist.setRowText(2,{"ccc",789}/*行数据表*/)
}
winform.button3.oncommand = function(id,event){
var c = {"姓名","年龄"}
var t = {
{"aaa",123}
{"bbb",456}
}
winform.vlist.setTable(t,c/*标题或数组*/,/*列宽或数组*/,/*列格式或数组*/,/*字典转为数组*/,/*字符串转为Utf8*/)
winform.vlist.setRowText(2,{"ccc",789}/*行数据表*/)
}
示例六:改变表头、内容的文本、背景、线条颜色
import win.ui;
import godking.vlistEx;
/*DSG{{*/
mainForm = win.form(text="vlistEx - table adapter";right=849;bottom=578)
mainForm.add(
button={cls="button";text="Button";left=320;top=510;right=490;bottom=570;z=2};
vlist={cls="vlistEx";left=10;top=10;right=840;bottom=500;db=1;dl=1;dr=1;dt=1;edge=1;transparent=1;z=1}
)
/*}}*/
var t = { fields={"序号","姓名","年龄","地址","身份证"} }
for(i=1;100;1){
var tt={}
tt["序号"]="[@rowindex]" // 行序号标记是不允许编辑修改的
tt["姓名"]=math.random(1000,9999)+"姓名"
tt["年龄"]=math.random(10,99)
tt["地址"]=math.random(1000,9999)+"地址"
tt["身份证"]=math.random(1000,9999)+"身份证"
..table.push(t,tt)
}
mainForm.vlist.checkBox.show = true;
mainForm.vlist.setHeaderHeight(50);
mainForm.vlist.fillParent(4)
mainForm.vlist.font = ::LOGFONT(name="宋体";point=12;color=0xFF0000 )/*【属性】项目文本字体*/
mainForm.vlist.bkColor = 0xFF9999
mainForm.vlist.lineColorV = 0x00FFFF
mainForm.vlist.lineColorH = 0xFFFF00
mainForm.vlist.headerFont = ::LOGFONT(name="黑体";h=16;color=0x0000FF )/*【属性】表头文本字体*/
mainForm.vlist.headerBkcolor = 0x99FFFF
mainForm.vlist.headerLineColor = 0x559999
mainForm.vlist.onSortColumn = function(col,desc){
/*点击列标题进行排序。col:列号,从1开始。desc:是否倒序。*/
owner.sort( col, desc, 0 /*数据转换:0默认 1时间 2数值 3文本*/ ,false /*使用微软api进行文本排序*/ );
}
mainForm.vlist.setTable(t,/*标题或数组*/,{80,80,100,100,200}/*列宽或数组*/,2,/*字典转为数组*/,/*字符串转为Utf8*/)
mainForm.show();
win.loopMessage();
示例七:自定义数据适配器
import win.ui;
import godking.vlistEx
/*DSG{{*/
var winform = win.form(text="aardio form";right=749;bottom=699)
winform.add(
button={cls="button";text="上一页";left=190;top=620;right=300;bottom=670;z=2};
button2={cls="button";text="下一页";left=400;top=620;right=510;bottom=670;z=3};
vlistEx={cls="vlistEx";text="自定义控件";left=10;top=10;right=750;bottom=610;z=1}
)
/*}}*/
winform.show();
winform.vlistEx.setColumns({"编号","语文","数学"},{250,250,-1}/*列宽*/,/*格式*/)
var page = 1;
var c = winform.vlistEx.setCustomAdapter(21,function(row,col){
if row==21 {
if col == 1 return "平均分:";
if col == 2 return "语文平均分:89";
if col == 3 return "数学平均分:98";
} else {
var currow = (page-1)*20+row;
if col = 1 return "NO.:"++currow;
return ..math.random(30,100); // 读取并返回单元格数据。这里用随机数代替。
}
})
winform.button.oncommand = function(id,event){
if page>1 {
page--;
c.update();
}
}
winform.button2.oncommand = function(id,event){
page++;
c.update();
}
win.loopMessage();
示例八:嵌入图片
定义图片的格式:
<img name="picname">
嵌入图片标识,分为两部分:
1、以 "<img name=" 开头
2、以 ">" 结尾
3、中间为图片参数。
==========================================
【图片参数】:
1、图片、文本,横向混合排版,按左右顺序排列绘制:
1)必填项:name、w、h;
2)可选项:y、scale、offsetx、offsety;
3)如果省略 y 则垂直居中。
abc<img name="pic1",w=30,h=20,scale=true>def
abc<img name="pic1",y=0;w=30,h=20,scale=true>def
2、图片填满单元格,不影响其他图文横向排版:
1)必填项:name、full=true;
2)可选项:scale、offsetx、offsety;
abc<img name="pic1",full=true,scale=true>def
3、图片定点绘制,不影响其他图文横向排版:
1)必填项:name、x、w、h;
2)x不为null,则视为定点绘制。与y无关。
3)可选项:y、scale、offsetx、offsety;
4)如果省略 y 则视为 0。
abc<img name="pic1",x=0,y=0,w=30,h=20,scale=true>def
==========================================
【name】:
1、图片名称
2、使用 addImg(name,data) 添加
【x、y】 :
1、图片距离单元格有效区域(不包含padding)左边、顶边的像素值。
2、值>-1 且 值<1 时,按单元格宽高比例计算。
3、比例不包含1,如果要实现比例1,可使用接近1的小数,如:0.99999
4、值≥0 时,为距离左边或顶边的值。
5、值<0 时,为距离右边或底边的值。
6、输入的x、y值不合法时,自动转为0。
7、若设置了 x ,则视为定点绘图。
8、已自动进行dpi处理。
【full=true】:
1、图片填满单元格。
2、不参与其他文本、图片的混合排版。
3、无需设置 x、y、w、h,会自动根据单元格范围进行计算设置。
4、可设置是否按比例缩放(缩放居中)。
5、必须=true,如果=false则没有意义。
【scale】:
1、是否在规定的xywh或full范围内,按比例缩放到合适大小绘制。
【w、h】:
1、图片的宽度、高度像素值
2、值>-1 且 值<1 时,按单元格宽高比例计算。
3、比例不包含1,如果要实现比例1,可使用接近1的小数,如:0.99999
4、值<0 时,图片会发生镜像旋转,其左边或顶边可能受影响。
5、w、h 若有一个为0,则不显示该图片。
6、已自动进行dpi处理。
【offsetx、offsety】
1、图片从应该绘制的位置,强行向右、向下偏移一定的距离;
2、所有图片(含定点、填满)都可设置该值,并进行偏移。
3、偏移超出单元格有效区域的部分,不可视。
4、可以为负值;默认值为 0。
5、偏移值不计入横向排版,不影响其他元素位置及整体宽度计算。
==========================================
【注意】
1、文本、图片、定点图片、填满图片,都可以同时放到一个单元格中,但定点图片、填满图片不参与横向排版计算。
2、所有内容都会按定义的先后顺序进行绘制,后绘制的内容会遮挡先绘制的内容。
图片和文本混合使用:
mainForm.listview.addImg("pic1","/pic1.png");
mainForm.listview.addImg("pic2","/pic2.png");
var text = `我是文本<img name="pic1",w=30,h=20,scale=true>前面嵌入了一个图片,后面再嵌入一个图片<img name="pic2",w=20,h=10,scale=false>我这里又是一串文本,图片和文本顺序、数量均无要求`
mainForm.listview.setCellText(row,col,text);
例程代码:
import win.ui;
import godking.vlistEx;
/*DSG{{*/
mainForm = win.form(text="vlistEx - table adapter";right=599;bottom=449)
mainForm.add(
listview={cls="vlistEx";left=11;top=20;right=590;bottom=430;acceptfiles=1;aw=1;border=1;db=1;dl=1;dr=1;dt=1;hscroll=1;vscroll=1;z=1}
)
/*}}*/
mainForm.listview.addImg("bkpic","E:\图片素材\png\png_花边纸底纹\纸底纹\p4.png",,50,30)
mainForm.listview.addImg("ddd","E:\图片素材\png\png32_常用图标\alert.png",,20,20)
mainForm.listview.addImg("on","C:\Users\Administrator\Desktop\on.png",,50,20)
mainForm.listview.addImg("off","C:\Users\Administrator\Desktop\off.png",,50,20)
mainForm.listview.padding = 0;
mainForm.listview.headerBkcolor = 0xFFEFEF;
var t = {}
for(i=1;100;1){
..table.push(t,{"<img name='ddd',w=20,h=20>索引","[@rowindex]","<img name='bkpic',full=true>有背景图片<img name='ddd',w=20,h=20>还有图片","<img name='on',w=50,h=20,scale=1>","asfdjasdaslf","等待中"})//使用行索引标识符
}
mainForm.listview.setTable(t)
mainForm.listview.setColumns({"<img name='ddd',w=20,h=20>序号","文件","文件路径","当前状态","备注"},{80,50,200,80,150},1)
mainForm.listview.checkBox.show = true
mainForm.listview.setSortMark("<img name='ddd',w=30,h=30,scale=true>" /*升序符号*/,"▼" /*降序符号*/)
mainForm.show();
mainForm.listview.onClick = function(row/*行*/,col/*列*/){
if col==4{
if mainForm.listview.getCellImg(row,col)=="on"
mainForm.listview.setCellImg(row,col,"off")
else mainForm.listview.setCellImg(row,col,"on")
}
}
win.loopMessage();
例程效果:
示例九:树形图
1、每个项目使用 "[@treeLevel]" 属性设置其树形的缩进层次,从0开始,0代表根级,子级比父级数值大1。
2、每个项目使用 "[@treeImg]" 属性设置其节点图片。当某项目包含子项目时,也可以使用tree.nodeImg属性进行统一设置这些项目图片。[@treeImg]优先级大于tree.nodeImg。
效果:
代码:
import win.ui;
import godking.vlistEx;
/*DSG{{*/
mainForm = win.form(text="vlistEx - table adapter";right=759;bottom=449)
mainForm.add(
listview={cls="vlistEx";left=10;top=10;right=749;bottom=440;acceptfiles=1;aw=1;db=1;dl=1;dr=1;dt=1;hscroll=1;vscroll=1;z=1}
)
/*}}*/
mainForm.listview.setColumns("索引,内容",200/*列宽*/,/*格式*/)
var tree = {0,1,2,3,3,3,3,2,3,3,1,1,2,3,0,1,2,2,1,1,2,2,3,3,0,1,2,3,3,3,1}
var t = {}
for(i=1;#tree;1){
..table.push(t,{"[@rowindex]","单元格内容", "[@treeLevel]"=tree[i] })
}
mainForm.listview.setTable(t);
mainForm.listview.refreshTree();
mainForm.listview.tree.show = true
mainForm.show()
win.loopMessage();
示例十:自定义自绘函数
本虚表库提供三个自绘函数,根据情况选择使用:
drawCellBg = function(row,col,hdc,rc,bkcolor,text){
/*绘制单元格背景,返回ture则忽略原背景,否则继续绘制原背景。注意:该背景包含padding部分,而padding以外的部分会被有效区域背景遮盖*/
__
}
drawCellRect = function(row,col,hdc,rc,bkcolor,text,font,colalign){
/*绘制单元格有效区域(含背景和内容)。返回ture则忽略原背景和内容,所以此时drawCellRectBg()函数会无效*/
__
}
drawCellRectBg = function(row,col,hMemDc,rc,bkcolor,text){
/*绘制单元格有效区域背景(不含内容),返回ture则忽略原有效区域背景,否则继续绘制有效区域原背景*/
/*如果定义的drawCellRect()函数返回true,则本函数无效。*/
__
}
效果:
代码:
import win.ui;
import godking.vlistEx;
/*DSG{{*/
mainForm = win.form(text="vlistEx - table adapter";right=849;bottom=578)
mainForm.add(
vlist={cls="vlistEx";left=10;top=10;right=840;bottom=570;db=1;dl=1;dr=1;dt=1;edge=1;transparent=1;z=1}
)
/*}}*/
var t = { fields={"序号","进度"} };
for(i=1;100;1){
var tt={};
tt["序号"]="[@rowindex]"; // 行序号标记是不允许编辑修改的
tt["进度"]=math.random(0,100);
..table.push(t,tt);
}
mainForm.vlist.setTable(t,,{80,100,100,100,200},1);
mainForm.vlist.onSortColumn = function(col,desc){
/*点击列标题进行排序。col:列号,从1开始。desc:是否倒序。*/
owner.sort( col, desc, 0 /*数据转换:0默认 1时间 2数值 3文本*/ ,false /*使用微软api进行文本排序*/ );
}
mainForm.vlist.onDrawCellRectBg = function(row,col,hdc,rc,bkcolor,text){
/*绘制单元格有效区域背景(不含内容),返回ture则忽略原有效区域背景,否则继续绘制有效区域原背景*/
/*如果定义的drawCellRect()函数返回true,则本函数无效。*/
if col==2 {
gdi.fillRect(hdc,bkcolor,rc)
rc.right=rc.left+math.round(rc.width()*tonumber(text)/100,2)
gdi.fillRect(hdc,0xFF00FF,rc)
return true;
}
}
mainForm.show();
win.loopMessage();
import win.ui;
import godking.vlistEx;
/*DSG{{*/
mainForm = win.form(text="vlistEx - table adapter";right=849;bottom=578)
mainForm.add(
vlist={cls="vlistEx";left=10;top=10;right=840;bottom=570;db=1;dl=1;dr=1;dt=1;edge=1;transparent=1;z=1}
)
/*}}*/
var t = { fields={"序号","进度"} };
for(i=1;100;1){
var tt={};
tt["序号"]="[@rowindex]"; // 行序号标记是不允许编辑修改的
tt["进度"]=math.random(0,100);
..table.push(t,tt);
}
mainForm.vlist.setTable(t,,{80,100,100,100,200},1);
mainForm.vlist.onSortColumn = function(col,desc){
/*点击列标题进行排序。col:列号,从1开始。desc:是否倒序。*/
owner.sort( col, desc, 0 /*数据转换:0默认 1时间 2数值 3文本*/ ,false /*使用微软api进行文本排序*/ );
}
mainForm.vlist.onDrawCellRect = function(row,col,hdc,rc,bkcolor,text,font,colalign){
/*绘制单元格有效区域(含背景和内容)。返回ture则忽略原背景和内容,所以此时drawCellRectBg()函数会无效*/
if col==2 {
gdi.fillRect(hdc,0xEEBBFF,rc)
var rc1=table.clone(rc)
rc1.right=rc1.left+math.round(rc1.width()*tonumber(text)/100,2)
gdi.fillRect(hdc,0xFF00FF,rc1)
gdi.drawText(hdc,font,text++"%",rc,colalign|4/*_DT_VCENTER*/|0x20/*_DT_SINGLELINE*/)
return true;
}
}
mainForm.show();
win.loopMessage();
import win.ui;
import godking.vlistEx;
/*DSG{{*/
mainForm = win.form(text="vlistEx - table adapter";right=849;bottom=578)
mainForm.add(
vlist={cls="vlistEx";left=10;top=10;right=840;bottom=570;db=1;dl=1;dr=1;dt=1;edge=1;transparent=1;z=1}
)
/*}}*/
var t = { fields={"序号","进度"} };
for(i=1;100;1){
var tt={};
tt["序号"]="[@rowindex]"; // 行序号标记是不允许编辑修改的
tt["进度"]=math.random(0,100);
..table.push(t,tt);
}
mainForm.vlist.setTable(t,,{80,100,100,100,200},1);
mainForm.vlist.onSortColumn = function(col,desc){
/*点击列标题进行排序。col:列号,从1开始。desc:是否倒序。*/
owner.sort( col, desc, 0 /*数据转换:0默认 1时间 2数值 3文本*/ ,false /*使用微软api进行文本排序*/ );
}
mainForm.vlist.onDrawCellRect = function(row,col,hdc,rc,bkcolor,text,font,colalign){
/*绘制单元格有效区域(含背景和内容)。返回ture则忽略原背景和内容,所以此时drawCellRectBg()函数会无效*/
if col==2 {
gdi.fillRect(hdc,0xEECCFF,rc);
var w = math.round(rc.width()*tonumber(text)/100);
for(i=0;w-1;5){
var left = rc.left+i;
var right = rc.left+i+4;
if right>left+w right=left+w;
var rect = ::RECT(left,rc.top,right,rc.bottom);
gdi.fillRect(hdc,0x55cc55,rect);
}
var f = ..table.clone(font)
f.color=0xFFFFFF
var rc1=table.clone(rc)
rc1.offset(-1,-1)
gdi.drawText(hdc,f,text++"%",rc1,colalign|4/*_DT_VCENTER*/|0x20/*_DT_SINGLELINE*/)
rc1.offset(2,2)
gdi.drawText(hdc,f,text++"%",rc1,colalign|4/*_DT_VCENTER*/|0x20/*_DT_SINGLELINE*/)
rc1.offset(-2,0)
gdi.drawText(hdc,f,text++"%",rc1,colalign|4/*_DT_VCENTER*/|0x20/*_DT_SINGLELINE*/)
rc1.offset(2,-2)
gdi.drawText(hdc,f,text++"%",rc1,colalign|4/*_DT_VCENTER*/|0x20/*_DT_SINGLELINE*/)
font.color = 0x0000FF
gdi.drawText(hdc,font,text++"%",rc,colalign|4/*_DT_VCENTER*/|0x20/*_DT_SINGLELINE*/)
return true;
}
}
mainForm.show();
win.loopMessage();