注:为确保示例代码能正常运行,请及时将虚表 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/ 目录下

 注意事项:

禁止调整列宽的方法:

  • 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; 

鼠标拖动改变列宽时,只绘制当前拖动列的内容,以加快绘制速度。

示例一:

  1. import win.ui;
  2. import godking.vlistEx;
  3. /*DSG{{*/
  4. mainForm = win.form(text="vlistEx - table adapter";right=849;bottom=578)
  5. mainForm.add(
  6. 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}
  7. )
  8. /*}}*/
  9. var t = { fields={"序号","姓名","年龄","地址","身份证"} };
  10. for(i=1;100;1){
  11. var tt={};
  12. tt["序号"]="[@rowindex]"; // 行序号标记是不允许编辑修改的
  13. tt["姓名"]=math.random(1000,9999)+"姓名";
  14. tt["年龄"]=math.random(10,99);
  15. tt["地址"]=math.random(1000,9999)+"地址";
  16. tt["身份证"]=math.random(1000,9999)+"身份证";
  17. ..table.push(t,tt);
  18. }
  19. mainForm.vlist.setTable(t,,{80,100,100,100,200},0x2);
  20. mainForm.vlist.checkBox.show = true;
  21. mainForm.vlist.textColor = 0xFF0000;
  22. mainForm.vlist.setHeaderHeight(50);
  23. mainForm.vlist.headerAlign = 1;
  24. mainForm.vlist.lineColorH = 0x008800;
  25. mainForm.vlist.lineColorV = 0xBB9999;
  26. mainForm.vlist.fillParent();
  27. mainForm.vlist.onEditBegin = true;
  28. mainForm.vlist.onEditEnd = function(row/*行*/,col/*列*/,text/*内容*/){
  29. /*单元格编辑完毕,是否允许单元格内容改变。返回false不允许,返回true允许,返回文本则改为新文本*/
  30. /*不定义此事件,则默认允许改变。注意:只有onEditBegin事件返回true,此事件才会触发。*/
  31. // 确保第三列输入数值!
  32. if col==3 {
  33. var r = ..tostring((..tonumber(text)):0);
  34. if r!=text {
  35. ..win.msgbox(text++" 将转为:"++r);
  36. return r;
  37. }
  38. }
  39. return true;
  40. }
  41. mainForm.vlist.onSortColumn = function(col,desc){
  42. /*点击列标题进行排序。col:列号,从1开始。desc:是否倒序。*/
  43. owner.sort( col, desc, 0 /*数据转换:0默认 1时间 2数值 3文本*/ ,false /*使用微软api进行文本排序*/ );
  44. }
  45. mainForm.vlist.onRClick = function(row/*行*/,col/*列*/){
  46. /*鼠标右键点击项目事件*/
  47. ..win.msgbox("您鼠标右键点击了:"++row++"行,"++col++"列");
  48. }
  49. mainForm.show();
  50. win.loopMessage();

示例二

  1. import win.ui;
  2. import godking.vlistEx;
  3. /*DSG{{*/
  4. mainForm = win.form(text="vlistEx - table adapter";right=599;bottom=449)
  5. mainForm.add(
  6. 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}
  7. )
  8. /*}}*/
  9. //添加右键菜单,并且删除行
  10. var listpopmenu = win.ui.popmenu(mainForm);
  11. listpopmenu.add("删除",function(id){
  12. mainForm.listview.delRow(mainForm.listview.getSelected());
  13. });
  14. listpopmenu.add("新增",function(id){
  15. mainForm.listview.addRow("[@rowindex]","1","2","3","等待中"); //使用行索引标识符
  16. });
  17. listpopmenu.add("清空",function(id){
  18. mainForm.listview.clear()
  19. });
  20. mainForm.listview.onRClick = function(row/*行*/,col/*列*/){
  21. /*鼠标右键点击项目事件*/
  22. var x,y = win.getCursorPos();
  23. listpopmenu.popup(x,y,true);//弹出菜单
  24. }
  25. var t = {
  26. {"[@rowindex]","张三",26,"山东","等待中"}//使用行索引标识符
  27. {"[@rowindex]","李四",28,"江苏","等待中"}//使用行索引标识符
  28. {"[@rowindex]","王五",29,"四川","等待中"}//使用行索引标识符
  29. {"[@rowindex]","SSS",10,"四川","等待中"}//使用行索引标识符
  30. {"[@rowindex]","AAA",35,"四川","等待中"}//使用行索引标识符
  31. }
  32. mainForm.listview.setTable(t)
  33. mainForm.listview.setColumns({"序号","文件名称","文件路径","保存路径","当前状态"},,1)
  34. mainForm.show();
  35. win.loopMessage();

示例三:禁止调整列宽

  1. import win.ui;
  2. import godking.vlistEx
  3. /*DSG{{*/
  4. var winform = win.form(text="aardio form";right=759;bottom=469)
  5. winform.add(
  6. button={cls="button";text="全可调整";left=76;top=411;right=206;bottom=456;z=2};
  7. button2={cls="button";text="全不可调整";left=235;top=407;right=365;bottom=452;z=3};
  8. button3={cls="button";text="自定义回调函数";left=550;top=409;right=680;bottom=454;z=4};
  9. button4={cls="button";text="部分(2\4)不可调整";left=385;top=407;right=515;bottom=452;z=5};
  10. custom={cls="vlistEx";text="自定义控件";left=59;top=32;right=699;bottom=395;editable=0;z=1}
  11. )
  12. /*}}*/
  13. winform.custom.setColumns({"111","222","333","444"},{100,50,100,50}/*列宽*/,/*格式*/)
  14. winform.custom.addRow("asfdasf","sadfasdfasdf","sadfasdfasdf","sadfasdfasdf")
  15. winform.custom.addRow("asfdasf","sadfasdfasdf","sadfasdfasdf","sadfasdfasdf")
  16. winform.custom.addRow("asfdasf","sadfasdfasdf","sadfasdfasdf","sadfasdfasdf")
  17. winform.button.oncommand = function(id,event){
  18. winform.custom.onResizeCol = true;
  19. }
  20. winform.button2.oncommand = function(id,event){
  21. winform.custom.onResizeCol = false;
  22. }
  23. winform.button4.oncommand = function(id,event){
  24. winform.custom.onResizeCol = {false,2,4};
  25. }
  26. winform.button3.oncommand = function(id,event){
  27. winform.custom.onResizeCol = function(col){
  28. /*是否允许改变列宽。参数为列号。返回false为不允许,否则为允许。*/
  29. if col = 3{
  30. ..win.msgbox("第3列不可调整")
  31. return false;
  32. }
  33. }
  34. }
  35. winform.custom.onEditBegin = function(row/*行*/,col/*列*/){
  36. /*鼠标双击单元格进行编辑,返回true允许编辑,否则禁止编辑。
  37. 不定义此事件,则默认不允许编辑。此事件会在onDblClick后触发。*/
  38. return true;
  39. }
  40. winform.custom.onEditEnd = function(row/*行*/,col/*列*/,text/*内容*/){
  41. /*单元格编辑完毕,是否允许单元格内容改变。返回false不允许,返回true允许,返回文本则改为新文本*/
  42. /*不定义此事件,则默认允许改变。注意:只有onEditBegin事件返回true,此事件才会触发。*/
  43. var t=tonumber(text)
  44. if t===null {
  45. //win.msgbox("请输入数值");
  46. return "";
  47. }
  48. else return tostring(t);
  49. }
  50. winform.show();
  51. win.loopMessage();

示例四:其他用法

  1. import win.ui;
  2. import godking.vlistEx;
  3. /*DSG{{*/
  4. var winform = win.form(text="aardio form";right=759;bottom=469)
  5. winform.add(
  6. button={cls="button";text="写数据";left=124;top=430;right=267;bottom=468;z=2};
  7. button2={cls="button";text="取数据";left=388;top=428;right=531;bottom=466;z=3};
  8. listview={cls="vlistEx";left=30;top=31;right=718;bottom=428;edge=1;z=1}
  9. )
  10. /*}}*/
  11. var gridTitle = "序号,报价日期,客户名称,部门,联系人,联系电话,地址,业务员,联系电话,电子邮箱,税率(%),总计(元),优惠总计(元),折扣(%),备注,id,状态,行状态"
  12. var gridWidth = {40,80,70,140,60,60,80,80,60,80,80,0,80,80,80,80,0,70,0};
  13. var format = 1;
  14. var t={}
  15. for(i=1;10;1) ..table.push(t,{序号="[@rowindex]",联系人="张三"});
  16. winform.listview.setTable(t,gridTitle/*标题或数组*/,gridWidth/*列宽或数组*/,format/*列格式或数组*/,true/*转为数组*/)
  17. winform.button.oncommand = function(id,event){
  18. for(i=2;#gridWidth){
  19. winform.listview.setCellText(1,i,gridWidth[i]);
  20. }
  21. winform.listview.setRowText(2,gridWidth);
  22. }
  23. winform.button2.oncommand = function(id,event){
  24. import console
  25. console.dump(winform.listview.getText()) //全部
  26. console.dump(winform.listview.getText(2)) //第二行
  27. console.dump(winform.listview.getText(2,3))//第二行第三列
  28. console.dump(winform.listview.getText(,3))//第三列
  29. }
  30. winform.show();
  31. win.loopMessage();

示例五:关于setRowText

数据格式(字典、数组)要与setTable时一致。

  1. winform.button.oncommand = function(id,event){
  2. var c = {"姓名","年龄"}
  3. var t = {
  4. {姓名="aaa",年龄=123}
  5. {姓名="bbb",年龄=456}
  6. }
  7. winform.vlist.setTable(t,c/*标题或数组*/,/*列宽或数组*/,/*列格式或数组*/,/*字典转为数组*/,/*字符串转为Utf8*/)
  8. winform.vlist.setRowText(2,{姓名="ccc",年龄=789}/*行数据表*/)
  9. }
  10. winform.button2.oncommand = function(id,event){
  11. var c = {"姓名","年龄"}
  12. var t = {
  13. {姓名="aaa",年龄=123}
  14. {姓名="bbb",年龄=456}
  15. }
  16. winform.vlist.setTable(t,c/*标题或数组*/,/*列宽或数组*/,/*列格式或数组*/,true/*字典转为数组*/,/*字符串转为Utf8*/)
  17. winform.vlist.setRowText(2,{"ccc",789}/*行数据表*/)
  18. }
  19. winform.button3.oncommand = function(id,event){
  20. var c = {"姓名","年龄"}
  21. var t = {
  22. {"aaa",123}
  23. {"bbb",456}
  24. }
  25. winform.vlist.setTable(t,c/*标题或数组*/,/*列宽或数组*/,/*列格式或数组*/,/*字典转为数组*/,/*字符串转为Utf8*/)
  26. winform.vlist.setRowText(2,{"ccc",789}/*行数据表*/)
  27. }

示例六:改变表头、内容的文本、背景、线条颜色

  1. import win.ui;
  2. import godking.vlistEx;
  3. /*DSG{{*/
  4. mainForm = win.form(text="vlistEx - table adapter";right=849;bottom=578)
  5. mainForm.add(
  6. button={cls="button";text="Button";left=320;top=510;right=490;bottom=570;z=2};
  7. 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}
  8. )
  9. /*}}*/
  10. var t = { fields={"序号","姓名","年龄","地址","身份证"} }
  11. for(i=1;100;1){
  12. var tt={}
  13. tt["序号"]="[@rowindex]" // 行序号标记是不允许编辑修改的
  14. tt["姓名"]=math.random(1000,9999)+"姓名"
  15. tt["年龄"]=math.random(10,99)
  16. tt["地址"]=math.random(1000,9999)+"地址"
  17. tt["身份证"]=math.random(1000,9999)+"身份证"
  18. ..table.push(t,tt)
  19. }
  20. mainForm.vlist.checkBox.show = true;
  21. mainForm.vlist.setHeaderHeight(50);
  22. mainForm.vlist.fillParent(4)
  23. mainForm.vlist.font = ::LOGFONT(name="宋体";point=12;color=0xFF0000 )/*【属性】项目文本字体*/
  24. mainForm.vlist.bkColor = 0xFF9999
  25. mainForm.vlist.lineColorV = 0x00FFFF
  26. mainForm.vlist.lineColorH = 0xFFFF00
  27. mainForm.vlist.headerFont = ::LOGFONT(name="黑体";h=16;color=0x0000FF )/*【属性】表头文本字体*/
  28. mainForm.vlist.headerBkcolor = 0x99FFFF
  29. mainForm.vlist.headerLineColor = 0x559999
  30. mainForm.vlist.onSortColumn = function(col,desc){
  31. /*点击列标题进行排序。col:列号,从1开始。desc:是否倒序。*/
  32. owner.sort( col, desc, 0 /*数据转换:0默认 1时间 2数值 3文本*/ ,false /*使用微软api进行文本排序*/ );
  33. }
  34. mainForm.vlist.setTable(t,/*标题或数组*/,{80,80,100,100,200}/*列宽或数组*/,2,/*字典转为数组*/,/*字符串转为Utf8*/)
  35. mainForm.show();
  36. win.loopMessage();

示例七:自定义数据适配器

  1. import win.ui;
  2. import godking.vlistEx
  3. /*DSG{{*/
  4. var winform = win.form(text="aardio form";right=749;bottom=699)
  5. winform.add(
  6. button={cls="button";text="上一页";left=190;top=620;right=300;bottom=670;z=2};
  7. button2={cls="button";text="下一页";left=400;top=620;right=510;bottom=670;z=3};
  8. vlistEx={cls="vlistEx";text="自定义控件";left=10;top=10;right=750;bottom=610;z=1}
  9. )
  10. /*}}*/
  11. winform.show();
  12. winform.vlistEx.setColumns({"编号","语文","数学"},{250,250,-1}/*列宽*/,/*格式*/)
  13. var page = 1;
  14. var c = winform.vlistEx.setCustomAdapter(21,function(row,col){
  15. if row==21 {
  16. if col == 1 return "平均分:";
  17. if col == 2 return "语文平均分:89";
  18. if col == 3 return "数学平均分:98";
  19. } else {
  20. var currow = (page-1)*20+row;
  21. if col = 1 return "NO.:"++currow;
  22. return ..math.random(30,100); // 读取并返回单元格数据。这里用随机数代替。
  23. }
  24. })
  25. winform.button.oncommand = function(id,event){
  26. if page>1 {
  27. page--;
  28. c.update();
  29. }
  30. }
  31. winform.button2.oncommand = function(id,event){
  32. page++;
  33. c.update();
  34. }
  35. 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、所有内容都会按定义的先后顺序进行绘制,后绘制的内容会遮挡先绘制的内容。

图片和文本混合使用:

  1. mainForm.listview.addImg("pic1","/pic1.png");
  2. mainForm.listview.addImg("pic2","/pic2.png");
  3. var text = `我是文本<img name="pic1",w=30,h=20,scale=true>前面嵌入了一个图片,后面再嵌入一个图片<img name="pic2",w=20,h=10,scale=false>我这里又是一串文本,图片和文本顺序、数量均无要求`
  4. mainForm.listview.setCellText(row,col,text);

例程代码:

  1. import win.ui;
  2. import godking.vlistEx;
  3. /*DSG{{*/
  4. mainForm = win.form(text="vlistEx - table adapter";right=599;bottom=449)
  5. mainForm.add(
  6. 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}
  7. )
  8. /*}}*/
  9. mainForm.listview.addImg("bkpic","E:\图片素材\png\png_花边纸底纹\纸底纹\p4.png",,50,30)
  10. mainForm.listview.addImg("ddd","E:\图片素材\png\png32_常用图标\alert.png",,20,20)
  11. mainForm.listview.addImg("on","C:\Users\Administrator\Desktop\on.png",,50,20)
  12. mainForm.listview.addImg("off","C:\Users\Administrator\Desktop\off.png",,50,20)
  13. mainForm.listview.padding = 0;
  14. mainForm.listview.headerBkcolor = 0xFFEFEF;
  15. var t = {}
  16. for(i=1;100;1){
  17. ..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","等待中"})//使用行索引标识符
  18. }
  19. mainForm.listview.setTable(t)
  20. mainForm.listview.setColumns({"<img name='ddd',w=20,h=20>序号","文件","文件路径","当前状态","备注"},{80,50,200,80,150},1)
  21. mainForm.listview.checkBox.show = true
  22. mainForm.listview.setSortMark("<img name='ddd',w=30,h=30,scale=true>" /*升序符号*/,"▼" /*降序符号*/)
  23. mainForm.show();
  24. mainForm.listview.onClick = function(row/*行*/,col/*列*/){
  25. if col==4{
  26. if mainForm.listview.getCellImg(row,col)=="on"
  27. mainForm.listview.setCellImg(row,col,"off")
  28. else mainForm.listview.setCellImg(row,col,"on")
  29. }
  30. }
  31. win.loopMessage();

 例程效果:

示例九:树形图

1、每个项目使用 "[@treeLevel]" 属性设置其树形的缩进层次,从0开始,0代表根级,子级比父级数值大1。

2、每个项目使用 "[@treeImg]" 属性设置其节点图片。当某项目包含子项目时,也可以使用tree.nodeImg属性进行统一设置这些项目图片。[@treeImg]优先级大于tree.nodeImg

效果:

代码:

  1. import win.ui;
  2. import godking.vlistEx;
  3. /*DSG{{*/
  4. mainForm = win.form(text="vlistEx - table adapter";right=759;bottom=449)
  5. mainForm.add(
  6. 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}
  7. )
  8. /*}}*/
  9. mainForm.listview.setColumns("索引,内容",200/*列宽*/,/*格式*/)
  10. 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}
  11. var t = {}
  12. for(i=1;#tree;1){
  13. ..table.push(t,{"[@rowindex]","单元格内容", "[@treeLevel]"=tree[i] })
  14. }
  15. mainForm.listview.setTable(t);
  16. mainForm.listview.refreshTree();
  17. mainForm.listview.tree.show = true
  18. mainForm.show()
  19. win.loopMessage();

示例十:自定义自绘函数

本虚表库提供三个自绘函数,根据情况选择使用:

  1. drawCellBg = function(row,col,hdc,rc,bkcolor,text){
  2. /*绘制单元格背景,返回ture则忽略原背景,否则继续绘制原背景。注意:该背景包含padding部分,而padding以外的部分会被有效区域背景遮盖*/
  3. __
  4. }
  5. drawCellRect = function(row,col,hdc,rc,bkcolor,text,font,colalign){
  6. /*绘制单元格有效区域(含背景和内容)。返回ture则忽略原背景和内容,所以此时drawCellRectBg()函数会无效*/
  7. __
  8. }
  9. drawCellRectBg = function(row,col,hMemDc,rc,bkcolor,text){
  10. /*绘制单元格有效区域背景(不含内容),返回ture则忽略原有效区域背景,否则继续绘制有效区域原背景*/
  11. /*如果定义的drawCellRect()函数返回true,则本函数无效。*/
  12. __
  13. }

效果:

 代码:

  1. import win.ui;
  2. import godking.vlistEx;
  3. /*DSG{{*/
  4. mainForm = win.form(text="vlistEx - table adapter";right=849;bottom=578)
  5. mainForm.add(
  6. 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}
  7. )
  8. /*}}*/
  9. var t = { fields={"序号","进度"} };
  10. for(i=1;100;1){
  11. var tt={};
  12. tt["序号"]="[@rowindex]"; // 行序号标记是不允许编辑修改的
  13. tt["进度"]=math.random(0,100);
  14. ..table.push(t,tt);
  15. }
  16. mainForm.vlist.setTable(t,,{80,100,100,100,200},1);
  17. mainForm.vlist.onSortColumn = function(col,desc){
  18. /*点击列标题进行排序。col:列号,从1开始。desc:是否倒序。*/
  19. owner.sort( col, desc, 0 /*数据转换:0默认 1时间 2数值 3文本*/ ,false /*使用微软api进行文本排序*/ );
  20. }
  21. mainForm.vlist.onDrawCellRectBg = function(row,col,hdc,rc,bkcolor,text){
  22. /*绘制单元格有效区域背景(不含内容),返回ture则忽略原有效区域背景,否则继续绘制有效区域原背景*/
  23. /*如果定义的drawCellRect()函数返回true,则本函数无效。*/
  24. if col==2 {
  25. gdi.fillRect(hdc,bkcolor,rc)
  26. rc.right=rc.left+math.round(rc.width()*tonumber(text)/100,2)
  27. gdi.fillRect(hdc,0xFF00FF,rc)
  28. return true;
  29. }
  30. }
  31. mainForm.show();
  32. win.loopMessage();
  1. import win.ui;
  2. import godking.vlistEx;
  3. /*DSG{{*/
  4. mainForm = win.form(text="vlistEx - table adapter";right=849;bottom=578)
  5. mainForm.add(
  6. 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}
  7. )
  8. /*}}*/
  9. var t = { fields={"序号","进度"} };
  10. for(i=1;100;1){
  11. var tt={};
  12. tt["序号"]="[@rowindex]"; // 行序号标记是不允许编辑修改的
  13. tt["进度"]=math.random(0,100);
  14. ..table.push(t,tt);
  15. }
  16. mainForm.vlist.setTable(t,,{80,100,100,100,200},1);
  17. mainForm.vlist.onSortColumn = function(col,desc){
  18. /*点击列标题进行排序。col:列号,从1开始。desc:是否倒序。*/
  19. owner.sort( col, desc, 0 /*数据转换:0默认 1时间 2数值 3文本*/ ,false /*使用微软api进行文本排序*/ );
  20. }
  21. mainForm.vlist.onDrawCellRect = function(row,col,hdc,rc,bkcolor,text,font,colalign){
  22. /*绘制单元格有效区域(含背景和内容)。返回ture则忽略原背景和内容,所以此时drawCellRectBg()函数会无效*/
  23. if col==2 {
  24. gdi.fillRect(hdc,0xEEBBFF,rc)
  25. var rc1=table.clone(rc)
  26. rc1.right=rc1.left+math.round(rc1.width()*tonumber(text)/100,2)
  27. gdi.fillRect(hdc,0xFF00FF,rc1)
  28. gdi.drawText(hdc,font,text++"%",rc,colalign|4/*_DT_VCENTER*/|0x20/*_DT_SINGLELINE*/)
  29. return true;
  30. }
  31. }
  32. mainForm.show();
  33. win.loopMessage();
  1. import win.ui;
  2. import godking.vlistEx;
  3. /*DSG{{*/
  4. mainForm = win.form(text="vlistEx - table adapter";right=849;bottom=578)
  5. mainForm.add(
  6. 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}
  7. )
  8. /*}}*/
  9. var t = { fields={"序号","进度"} };
  10. for(i=1;100;1){
  11. var tt={};
  12. tt["序号"]="[@rowindex]"; // 行序号标记是不允许编辑修改的
  13. tt["进度"]=math.random(0,100);
  14. ..table.push(t,tt);
  15. }
  16. mainForm.vlist.setTable(t,,{80,100,100,100,200},1);
  17. mainForm.vlist.onSortColumn = function(col,desc){
  18. /*点击列标题进行排序。col:列号,从1开始。desc:是否倒序。*/
  19. owner.sort( col, desc, 0 /*数据转换:0默认 1时间 2数值 3文本*/ ,false /*使用微软api进行文本排序*/ );
  20. }
  21. mainForm.vlist.onDrawCellRect = function(row,col,hdc,rc,bkcolor,text,font,colalign){
  22. /*绘制单元格有效区域(含背景和内容)。返回ture则忽略原背景和内容,所以此时drawCellRectBg()函数会无效*/
  23. if col==2 {
  24. gdi.fillRect(hdc,0xEECCFF,rc);
  25. var w = math.round(rc.width()*tonumber(text)/100);
  26. for(i=0;w-1;5){
  27. var left = rc.left+i;
  28. var right = rc.left+i+4;
  29. if right>left+w right=left+w;
  30. var rect = ::RECT(left,rc.top,right,rc.bottom);
  31. gdi.fillRect(hdc,0x55cc55,rect);
  32. }
  33. var f = ..table.clone(font)
  34. f.color=0xFFFFFF
  35. var rc1=table.clone(rc)
  36. rc1.offset(-1,-1)
  37. gdi.drawText(hdc,f,text++"%",rc1,colalign|4/*_DT_VCENTER*/|0x20/*_DT_SINGLELINE*/)
  38. rc1.offset(2,2)
  39. gdi.drawText(hdc,f,text++"%",rc1,colalign|4/*_DT_VCENTER*/|0x20/*_DT_SINGLELINE*/)
  40. rc1.offset(-2,0)
  41. gdi.drawText(hdc,f,text++"%",rc1,colalign|4/*_DT_VCENTER*/|0x20/*_DT_SINGLELINE*/)
  42. rc1.offset(2,-2)
  43. gdi.drawText(hdc,f,text++"%",rc1,colalign|4/*_DT_VCENTER*/|0x20/*_DT_SINGLELINE*/)
  44. font.color = 0x0000FF
  45. gdi.drawText(hdc,font,text++"%",rc,colalign|4/*_DT_VCENTER*/|0x20/*_DT_SINGLELINE*/)
  46. return true;
  47. }
  48. }
  49. mainForm.show();
  50. win.loopMessage();