虚表图片专题文章: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();
数据格式(字典、数组)要与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();