搜索
查看: 1103|回复: 0

使用问题?[扩展库] [搬高手代码] 可编辑 隔行变色 排序 listview小库;

[复制链接]

3

主题

6

帖子

47

积分

新手入门

Rank: 1

积分
47
发表于 2018-6-16 23:12:00 | 显示全部楼层 |阅读模式
[扩展库] [搬高手代码] 可编辑 隔行变色 排序 listview小库
这个库用起来非常省心。
库文件是这样的
  1. //lvGrid 可编辑列表视图
  2. /***********************************************************************
  3.         改色的 是 lujjjh  的代码 论坛帖子 http://www.aau.cn/thread-7601-1-1.html
  4.         原地编辑 是 adsadss 的代码 论坛帖子 http://www.aau.cn/thread-5446-1-1.html
  5.         排序的 是 游戏 的代码 论坛帖子 http://www.aau.cn/thread-4725-1-1.html
  6.         lvGrid.ctrl( listview ); //开启改色编辑, listview 必须有 fullRow=1 属性
  7.         listview.preventEtidCol(1,3); //阻止指定例编辑, 示例 阻止第1与第3列编辑
  8.         listview.nthChild(隔的行数, 隔行色值, 其它行色值); //隔行变色, 第一第二参数要设置, 第三是可选
  9.         listview.setSort("1:num", "2:str"); //设置排序; 列号:类型
  10.         listview.setItemColor(行号, 色值); //设置行的文字颜色
  11.         listview.setItemColorBk(行号, 色值); //设置行的背景颜色

  12. 20130427 / PHPtit / http://hi.baidu.com/phptits
  13. ***********************************************************************/
  14. import win;
  15. import util;
  16. import win.imageList;
  17. namespace lvGrid;
  18. ctrl = (function () {
  19.     var NMLVCUSTOMDRAW = class {
  20.         struct nmcd = {
  21.             struct hdr = ..win.ui.NMHDR();
  22.             INT dwDrawStage;
  23.             pointer hdc;
  24.             struct rc = ::RECT();
  25.             int dwItemSpec;
  26.             INT uItemState;
  27.             int lItemlParam;
  28.         };
  29.         INT clrText;
  30.         INT clrTextBk;
  31.         INT font;
  32.         int iSubItem;
  33.         INT dwItemType;
  34.         INT clrFace;
  35.         int iIconEffect;
  36.         int iIconPhase;
  37.         int iPartId;
  38.         int iStateId;
  39.         struct rcText = ::RECT();
  40.         INT uAlign;
  41.     }
  42.         var LVITEM = class { /* 项 */
  43.                 INT                mask;
  44.                 int                iItem;
  45.                 int                iSubItem;
  46.                 INT                state;
  47.                 INT                stateMask;
  48.                 string        text;
  49.                 int                cchTextMax;
  50.                 int                iImage;
  51.                 int                lParam;
  52.                 int                iIndent;
  53.                 int                iGroupId;
  54.                 INT                cColumns;
  55.                 struct        puColumns = ::POINT();
  56.         }
  57.        
  58.         var LVCOLUMN = class { /* 列 */
  59.                 INT                mask;
  60.                 int                fmt;
  61.                 int                cx;
  62.                 string        text;
  63.                 int                cchTextMax;
  64.                 int                iSubItem;
  65.                 int                iImage;
  66.                 int                iOrder;
  67.         }
  68.        
  69.     return function (listview) {
  70.             listview.preventetidcols = {};
  71.             listview.nthchilds = {};
  72.             listview.setsorttab = {};
  73.         listview._colors1 = ..table.array(listview.count, 0);
  74.         listview._colors2 = ..table.array(listview.count, 0);
  75.                 // 初始化 imagelist
  76.                 var iml = ..win.imageList(16, 15);
  77.                 iml.add('GIF\56\57a \0\15\0\x80\0\0\x80\x80\x80\xff\0\xff\33\xf9\4\0\0\0\0\0\44\0\0\0\0 \0\15\0\0\2\31\x8c\x8f\xa9\xcb\xed\15\xa3\x9c\xb4N\xf0\x80\xde\56k\xbfA\\\xd7\x84 \x97Y\xea\xca\xb6\xee\11\xc7F\1\0;', 0xff00ff);
  78.                 // 取得 header
  79.                 var hc = ::SendMessage(listview.hwnd, 0x101F/*_LVM_GETHEADER*/);
  80.                 // 绑定 imageList
  81.                 ::SendMessage(hc, 0x1200 + 8/*_HDM_SETIMAGELIST*/, ..topointer(0), iml.handle);
  82.                 listview.lastSortInd = 1
  83.                 var compareStr = function(lParam1, lParam2, SortType){
  84.                         return ..string.cmp(listview.cache[lParam1] , listview.cache[lParam2]); //字母排序
  85.                 }
  86.                 var compareStrDesc = function(lParam1, lParam2, SortType){
  87.                         return ..string.cmp(listview.cache[lParam2] , listview.cache[lParam1]); //字母排序
  88.                 }
  89.                 cmpStr = ..raw.tostdcall( compareStr,"int(int lParam1, int lParam2, int SortType)");
  90.                 cmpStrDesc = ..raw.tostdcall( compareStrDesc,"int(int lParam1, int lParam2, int SortType)");
  91.                 var compareNum = function(lParam1, lParam2, SortType){//正序
  92.                         return listview.cache[lParam1] - listview.cache[lParam2]; //数字排序
  93.                 }
  94.                 var compareNumDesc = function(lParam1, lParam2, SortType){//反序
  95.                         return listview.cache[lParam2] - listview.cache[lParam1]; //数字排序
  96.                 }
  97.                 cmpNum = ..raw.tostdcall( compareNum,"int(int lParam1, int lParam2, int SortType)");
  98.                 cmpNumDesc = ..raw.tostdcall( compareNumDesc,"int(int lParam1, int lParam2, int SortType)");
  99.                
  100.         listview._prenotify = function (id,code,ptr) {
  101.                 select(code) {
  102.                         case 0xFFFFFFF4/*_NM_CUSTOMDRAW*/ {
  103.                         var nmlvcd = NMLVCUSTOMDRAW();
  104.                         ..raw.convert(ptr, nmlvcd);
  105.                         select (nmlvcd.nmcd.dwDrawStage) {
  106.                             case 0x1/*_CDDS_PREPAINT*/ {
  107.                                 return 0x20/*_CDRF_NOTIFYITEMDRAW*/
  108.                             }   
  109.                             case 0x10001/*_CDDS_ITEMPREPAINT*/ {
  110.                                 ..raw.mixin(ptr, nmlvcd, { clrText = owner._colors1[nmlvcd.nmcd.dwItemSpec +1 ] });
  111.                                 ..raw.mixin(ptr, nmlvcd, { clrTextBk = owner._colors2[nmlvcd.nmcd.dwItemSpec +1 ] });
  112.                                 return 0/*_CDRF_DODEFAULT*/;
  113.                             }
  114.                         }
  115.                         }
  116.                         case 0xFFFFFF94/*_LVN_COLUMNCLICK*/ {
  117.                                 var nmlvw = ..win.ui.ctrl.listview.NMLISTVIEW();
  118.                                 ..raw.convert(ptr, nmlvw);
  119.                                         var ind = nmlvw.iSubItem + 1;
  120.                                         if( owner.setsorttab[ind] )
  121.                                                 owner.sort(ind, owner.setsorttab[ind]);

  122.                             }
  123.                         case 0xFFFFFFFE/*_NM_CLICK*/ {
  124.                                 var notifyMessage = owner.getNotifyMessage(code,ptr);
  125.                                 for(k,v in owner.preventetidcols)
  126.                                         if( notifyMessage.iSubItem == v) return ;
  127.                                 if( ! notifyMessage.iItem && notifyMessage.iSubItem ) return ;
  128.                                 var edit = owner.editlable
  129.                                 if( ! edit ){
  130.                                     owner.addCtrl(
  131.                                         editlable = {
  132.                                             cls="edit";font = LOGFONT( h = 11 );left = 0;top = 0;border=1;
  133.                                             right = 50;bottom = 50;autoResize = false ;hide = 1;
  134.                                             wndproc = function( hwnd, message, wParam, lParam ){
  135.                                                     var update;
  136.                                                 if( ( message = 0x8/*_WM_KILLFOCUS*/)  || message == 0x101/*_WM_KEYUP*/ && wParam == 0xD/*_VK_RETURN*/  ) {
  137.                                                     update = true;
  138.                                                 }
  139.                                                 elseif(message == 0x201/*_WM_LBUTTONDOWN*/ || message == 0x202/*_WM_LBUTTONUP*/ ){
  140.                                                         var x,y = ..win.getMessagePos(lParam)
  141.                                                         var rc = edit.clientRect;  
  142.                                                         if( ! ::PtInRect(rc,x,y) ){
  143.                                                                 update = true;
  144.                                                                 edit.capture = false;
  145.                                                         }
  146.                                                         else{
  147.                                                                 edit.capture = true;
  148.                                                         }
  149.                                                 }
  150.                                                
  151.                                                 if( update ){
  152.                                                     owner.parent.setItemText( owner.text, owner.listViewNotifyMessage.iItem
  153.                                                         , owner.listViewNotifyMessage.iSubItem );
  154.                                                     owner.show(false);
  155.                                                 }
  156.                                             }  
  157.                                         }
  158.                                     )  
  159.                                     edit = owner.editlable;
  160.                                 }
  161.                                 edit.listViewNotifyMessage = notifyMessage;
  162.                                 edit.text = owner.getItemText(notifyMessage.iItem,notifyMessage.iSubItem);
  163.                                 var rc = owner.getItemRect( notifyMessage.iItem,notifyMessage.iSubItem,,2/*_LVIR_LABEL*/ );
  164.                                 edit.setRect(rc);
  165.                                 edit.show();
  166.                                 edit.setFocus(0, -1); //例行
  167.                                 edit.capture = true;
  168.                         }
  169.                 }
  170.         }
  171.         listview.preventEtidCol = function(...){ //阻止编辑例..让某例不能编辑
  172.                 owner.preventetidcols = {...};
  173.         }
  174.         
  175.         listview.nthChild = function(...){ //隔行变色
  176.                 owner.nthchilds = {...};
  177.         }
  178.         
  179.         listview.setItemColor = function (item, col) {
  180.             owner._colors1[item] = col;
  181.         }
  182.         listview.setItemColorBk = function (item, col) {
  183.             owner._colors2[item] = col;
  184.         }
  185.         listview.addItem = ..util.connect(listview, listview.addItem,
  186.             function (text, ind, ...) {
  187.                 if (ind)
  188.                     ..table.insert(owner._colors1, 0, ind);
  189.                 else
  190.                     ..table.push(owner._colors1, 0);
  191.                
  192.                 if( #owner.nthchilds > 1 ){
  193.                         var index = owner.count+1;
  194.                         if( index % owner.nthchilds[1] == 0)
  195.                                 owner._colors2[index] = owner.nthchilds[2];
  196.                         else
  197.                                 owner._colors2[index] = owner.nthchilds[3];
  198.                 }
  199.             }
  200.         );
  201.         
  202.         listview.delItem = ..util.connect(listview, listview.delItem,
  203.             function (item) {
  204.                 ..table.remove(owner._colors1, item);
  205.             }
  206.         );
  207.         
  208.         
  209.             getColumnCount = function(){
  210.                         // 取得 header
  211.                         var hc = ::SendMessage(listview.hwnd, 0x101F/*_LVM_GETHEADER*/);
  212.                         return ::SendMessage(hc, 0x1200);
  213.                 }
  214.                 // 获取列图片
  215.                 getColImage = function (nCol) {
  216.                     var col = LVCOLUMN();
  217.                     col.mask = 0x1/*_LVCF_FMT*/ | 0x10/*_LVCF_IMAGE*/;
  218.                     col = rget(2, ::SendMessageByStruct(listview.hwnd, 0x1019/*_LVM_GETCOLUMN*/, nCol - 1, col));
  219.                     if (col.fmt & 0x800/*_LVCFMT_IMAGE*/){
  220.                         return col.iImage;
  221.                     }
  222.                     else{
  223.                         return -1;
  224.                 }
  225.                 }
  226.                
  227.                 // 设置列图片
  228.                 setColImage = function (nCol, iImage = -1) {
  229.                     var col = LVCOLUMN();
  230.                     col.mask = 0x1/*_LVCF_FMT*/;
  231.                     if (iImage == -1) {
  232.                         col.fmt = 0x0/*_LVCFMT_LEFT*/;
  233.                     }
  234.                     else {
  235.                         col.mask |= 0x10/*_LVCF_IMAGE*/;
  236.                         col.fmt = 0x800/*_LVCFMT_IMAGE*/ | 0x1000/*_LVCFMT_BITMAP_ON_RIGHT*/;
  237.                         col.iImage = iImage;
  238.                     }
  239.                     ::SendMessageByStruct(listview.hwnd, 0x101A/*_LVM_SETCOLUMN*/, nCol - 1, col);
  240.                 }
  241.                
  242.                 //设置排序
  243.                 listview.setSort = function(...){
  244.                         for(k,v in {...}){
  245.                                 var val = ..string.split( v, ":");
  246.                                 owner.setsorttab[tonumber(val[1])] = val[2];
  247.                         }
  248.                 }
  249.                
  250.                
  251.                 // 排序函数
  252.                 listview.sort = function (ind,dataType) {
  253.                     var image = getColImage(ind);
  254.                     // 已按照升序排序,则按照降序排序;其余情况按照升序排序
  255.                     var desc = image == 0;
  256.                    
  257.                     listview.cache = {};
  258.                     var item = LVITEM();
  259.                     item.mask = 0x4/*_LVIF_PARAM*/;
  260.                     for (i = 1; listview.count) {
  261.                             item.iItem = i - 1;
  262.                             item.lParam = ..table.push(listview.cache, listview.getItemText(i, ind));
  263.                             ::SendMessageByStruct(listview.hwnd, 0x1006/*_LVM_SETITEM*/, 0, item);
  264.                     }
  265.                    
  266.                     if(dataType == "num"){
  267.                             if(desc){
  268.                                     ::SendMessage(listview.hwnd, 0x1030/*_LVM_SORTITEMS*/, , cmpNumDesc)
  269.                             }
  270.                             else {
  271.                                     ::SendMessage(listview.hwnd, 0x1030/*_LVM_SORTITEMS*/, , cmpNum)
  272.                             }
  273.                     }
  274.                     elseif(dataType == "str"){
  275.                             if(desc){
  276.                                     ::SendMessage(listview.hwnd, 0x1030/*_LVM_SORTITEMS*/, , cmpStrDesc)
  277.                             }
  278.                             else {
  279.                                     ::SendMessage(listview.hwnd, 0x1030/*_LVM_SORTITEMS*/, , cmpStr)
  280.                             }
  281.                     }
  282.                        
  283.                         //        更新列图标
  284.                     setColImage(ind, desc ? 1 : 0);
  285.                     if(ind!=listview.lastSortInd){
  286.                             setColImage(listview.lastSortInd, -1);
  287.                     }
  288.                     listview.lastSortInd = ind;
  289.                     ..collectgarbage("collect");
  290.             }
  291.     }
  292. })();

  293. /**intellisense(lvGrid)
  294. ctrl(__/*listview*/) = 使列表视图可编辑
  295. ctrl() = !listview.
  296. end intellisense**/
复制代码


我添加到工程里面用户库里面,我的界面如果只有一个listview的话 一切都正常
可是如果有两个listview 都需要用到这个功能 ,代码如下
  1. import win.ui;
  2. import gdip.fontAwesome;
  3. import lvGrid;
  4. /*DSG{{*/
  5. var winform = win.form(text="aardio form";right=479;bottom=219;parent=...)
  6. winform.add(
  7. button={cls="button";text='\uF055';left=439;top=4;right=469;bottom=34;dl=1;dt=1;font=LOGFONT(name='FontAwesome';h=-20);z=3};
  8. button2={cls="button";text='\uF056';left=439;top=36;right=469;bottom=66;dl=1;dt=1;font=LOGFONT(name='FontAwesome';h=-20);z=4};
  9. button3={cls="button";text='\uF057';left=440;top=68;right=470;bottom=98;dl=1;dt=1;font=LOGFONT(name='FontAwesome';h=-20);z=5};
  10. button4={cls="button";text='\uF055';left=439;top=111;right=469;bottom=141;dl=1;dt=1;font=LOGFONT(name='FontAwesome';h=-20);z=6};
  11. button5={cls="button";text='\uF056';left=439;top=142;right=469;bottom=172;dl=1;dt=1;font=LOGFONT(name='FontAwesome';h=-20);z=7};
  12. button6={cls="button";text='\uF057';left=440;top=173;right=470;bottom=203;dl=1;dt=1;font=LOGFONT(name='FontAwesome';h=-20);z=8};
  13. listview={cls="listview";left=10;top=5;right=434;bottom=103;dl=1;dt=1;edge=1;fullRow=1;gridLines=1;hscroll=1;vscroll=1;z=1};
  14. listview2={cls="listview";left=9;top=113;right=432;bottom=201;dl=1;dt=1;edge=1;gridLines=1;hscroll=1;vscroll=1;z=2}
  15. )
  16. /*}}*/

  17. lvGrid.ctrl(winform.listview);

  18. winform.listview.preventEtidCol(1);
  19. winform.listview.setSort("1:num");
  20. winform.listview.nthChild(2, 0xffff00, 0xccffff);
  21. winform.listview.insertColumn("ID不可编辑",100,0x0/*_LVCFMT_LEFT*/);
  22. winform.listview.insertColumn("车型",100,0x0/*_LVCFMT_LEFT*/);
  23. winform.listview.insertColumn("购入价值",60,0x0/*_LVCFMT_LEFT*/);
  24. winform.listview.insertColumn("购入时间",100,0x0/*_LVCFMT_LEFT*/);
  25. winform.listview.insertColumn("现价值(万元)",100,0x0/*_LVCFMT_LEFT*/);


  26. lvGrid.ctrl(winform.listview2);
  27. winform.listview2.setSort("1:num");
  28. winform.listview2.nthChild(2, 0xffff00, 0xccffff);
  29. winform.listview2.insertColumn("房产所在地",200,0x0/*_LVCFMT_LEFT*/);
  30. winform.listview2.insertColumn("面积(平米)",100,0x0/*_LVCFMT_LEFT*/);
  31. winform.listview2.insertColumn("现价值(万元)",100,0x0/*_LVCFMT_LEFT*/);



  32. winform.button.oncommand = function(id,event){
  33.         var index = tostring(winform.listview.count+1);
  34.         winform.listview.addItem({index;"点我编辑"+index;"点我编辑"+index;"点我编辑"+index;"点我编辑"+index});
  35.        
  36. }

  37. winform.button2.oncommand = function(id,event){
  38.         winform.listview.delItem(winform.listview.selIndex)
  39. }

  40. winform.button4.oncommand = function(id,event){
  41.         var index = tostring(winform.listview2.count+1);
  42.         winform.listview2.addItem({index;"点我编辑"+index;"点我编辑"+index;"点我编辑"+index;"点我编辑"+index});

  43. }

  44. winform.button5.oncommand = function(id,event){
  45.         winform.listview2.delItem(winform.listview.selIndex)
  46. }

  47. winform.enableDpiScaling();
  48. winform.show();

  49. win.loopMessage();
  50. return winform;
复制代码



刚开始看着也好 ,可是点一下第一个的 的id排序 ,排序按钮会到第二个里面,而却弹出错误

有人知道这是怎么回事吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-12-17 18:47 , Processed in 0.062500 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表