搜索
查看: 8209|回复: 27

通信录

[复制链接]

12

主题

77

帖子

483

积分

二级会员

Rank: 3Rank: 3

积分
483
发表于 2013-1-15 02:20:36 | 显示全部楼层 |阅读模式
首先感谢rimren ,本程序是在你的《[数据库] SqlLite+listview综合应用》(简称"库")下修改而成的。你让我对内存数据库入了门。原贴请见。"库"文中每次改动都要刷新,记录数少时倒没什么,当记录数近千时就难忍受了。我的改动是让数据库和listview同步改动。从而避免了刷新。这样当记录数上万时,新增、删除、修改和查询都可瞬间完成。同时加了个模糊查询,为了使程序看起来启动更快,我把winform.show()移到了前面。一个问题是双击修改时不能自动选中,还请各位老师指点。另外生成.exe文件后加壳,文件只有655KB.天啊,一个数据库程序只这么大,且还是绿色的,敢问那种程序能做到?
  1. import win.ui;
  2. import sqlite;
  3. import win.ui.statusbar;
  4. /*DSG{{*/
  5. var winform = ..win.form( text="通信录";bgcolor=15780518;bottom=543;parent=...;right=488 )
  6. winform.add(
  7. button2={ dr=1;bottom=67;right=479;left=409;dt=1;top=43;z=9;text="帮助";cls="button" };
  8. listview={ dr=1;dl=1;bgcolor=16777215;right=487;left=2;dt=1;db=1;fullRow=1;bottom=520;top=72;msel=false;z=1;gridLines=1;edge=1;cls="listview" };
  9. static={ dl=1;bottom=31;color=0;text="单位名称";left=9;dt=1;top=14;font=LOGFONT( h=-14 );z=5;right=68;transparent=1;cls="static" };
  10. ed_name={ dr=1;dl=1;tabstop=1;bottom=35;right=325;left=75;dt=1;top=11;z=3;edge=1;cls="edit" };
  11. static4={ dl=1;bottom=64;color=0;text="电话号码";left=9;dt=1;top=48;font=LOGFONT( h=-14 );z=6;right=68;transparent=1;cls="static" };
  12. ed_tel={ dr=1;dl=1;z=4;bottom=68;right=325;left=75;dt=1;top=44;tabstop=1;edge=1;cls="edit" };
  13. button={ dr=1;bottom=35;right=479;left=409;dt=1;top=11;z=8;text="模糊查询";cls="button" };
  14. btn_adddb={ dr=1;bottom=35;text="添加";left=330;dt=1;top=11;tabstop=1;right=400;z=7;cls="button" };
  15. groupbox={ dr=1;dl=1;bottom=70;right=487;left=2;dt=1;top=-4;z=10;edge=1;cls="groupbox" };
  16. btnDelete={ dr=1;bottom=67;right=400;left=330;dt=1;top=43;z=2;text="删除";cls="button" }
  17. )
  18. /*}}*/

  19. winform.show()
  20. //设置TAB顺序便于键盘录入。
  21. win.ui.statusbar( winform ).addItem("总数:", 150/*宽度*/)
  22. winform.ed_name.wndproc = function(hwnd,message,wparam,lparam){
  23.         if(message == 0x101/*_WM_KEYUP*/ && wparam == 0xD/*_VK_RETURN*/){            
  24.            winform.ed_tel.setFocus()                     
  25.         }
  26.     }
  27. winform.ed_tel.wndproc = function(hwnd,message,wparam,lparam){
  28.         if(message == 0x101/*_WM_KEYUP*/ && wparam == 0xD/*_VK_RETURN*/){            
  29.            winform.btn_adddb.oncommand()                    
  30.         }
  31.     }
  32. winform.listview.insertColumn("序号",80,1)
  33. winform.listview.insertColumn("单位名称或联系人",200,2)
  34. winform.listview.insertColumn("电话",-1,3)
  35. var sqlConnection = sqlite("\db.db") //连接数据库,如果不存在库则创建库。
  36. if(not sqlConnection.existsTable("filea")){        //如果不存在表,则创建数据表       
  37.         sqlConnection.exec("CREATE TABLE filea(id INTEGER PRIMARY KEY AUTOINCREMENT,name,tel);")                              
  38. }else {
  39.         var db=sqlConnection.getTable("SELECT * FROM filea");//查询全表数据
  40.         //将查询到的数据显示于listview
  41.         for(i=1;#db;1){winform.listview.addItem({tostring(db[ i ].id);db[ i ].name;db[ i ].tel});}        
  42. }                  
  43. //修改表中数据
  44. winform.listview.onnotify = function(id,code,ptr){
  45.     if(code==0xFFFFFF4B){// 滚动条
  46.         if(!winform.listview.editlable) return ;
  47.         edit = winform.listview.editlable;
  48.         rc=winform.listview.getItemRect(edit.listViewNotifyMessage.iItem,edit.listViewNotifyMessage.iSubItem,,2/*_LVIR_LABEL*/);
  49.         if(rc.top<rc.bottom-rc.top){//选中行向上滚动到了列标题及其以上的位置,不处理的话编辑框会覆盖掉列标题。
  50.             rc.top-=math.abs(rc.bottom);rc.bottom=rc.top;
  51.         }else {
  52.             rc.right += 5; rc.bottom += 5;
  53.         }
  54.         edit.setRect(rc);
  55.         winform.listview.redraw();//经测试,这行会引起滚动条位置变化时listview控件闪烁,如果在意这个问题,请主动给listview控件增加_WS_CLIPCHILDREN样式,可以省略掉这行。
  56.     }
  57.     if(code=0xFFFFFFFD/*_NM_DBLCLK*/ ){
  58.         var notifyMessage = winform.listview.getNotifyMessage(code,ptr);
  59.         if( ! notifyMessage.iItem && notifyMessage.iSubItem ) return ;         
  60.         var edit = winform.listview.editlable
  61.         if( ! edit ){
  62.             winform.listview.addCtrl(
  63.                 editlable = {
  64.                     cls="edit";font = LOGFONT( h = 11 );left = 0;top = 0;
  65.                     right = 50;bottom = 50;autoResize = false ;hide = 1;edge = 1;                    
  66.                     wndproc = function( hwnd, message, wParam, lParam ){
  67.                         if( ( message = 0x8/*_WM_KILLFOCUS*/)
  68.                             || message == 0x101/*_WM_KEYUP*/ && wParam == 0xD/*_VK_RETURN*/){
  69.                             // 按下了回车键或失去焦点,更新listview数据
  70.                             owner.parent.setItemText( owner.text, //格子内容
  71.                                                       owner.listViewNotifyMessage.iItem, //行号
  72.                                                       owner.listViewNotifyMessage.iSubItem );//列号                           
  73.                             var focus=owner.listViewNotifyMessage.iItem
  74.                             var id=winform.listview.getItemText(focus,1);//focus=第i行,第1列                           
  75.                             var name=winform.listview.getItemText(focus,2);                           
  76.                             var tel=winform.listview.getItemText(focus,3);                           
  77.                             //更新语句sqlConnection.exec("UPDATE 表名 SET 更新字段 = '更新值' WHERE 条件字段 = 条件值';");
  78.                             sqlConnection.exec("UPDATE filea SET name='"+name+"',tel='"+tel+"' WHERE id ='"+id+"'");
  79.                             owner.show(false);
  80.                         }
  81.                     }  
  82.                 }
  83.             )            
  84.             edit = winform.listview.editlable;            
  85.         }
  86.         edit.listViewNotifyMessage = notifyMessage;
  87.         edit.text=winform.listview.getItemText(notifyMessage.iItem,notifyMessage.iSubItem);
  88.         var rc=winform.listview.getItemRect( notifyMessage.iItem,notifyMessage.iSubItem,,2/*_LVIR_LABEL*/ )
  89.         rc.right += 5; rc.bottom += 5;
  90.         edit.setRect(rc);
  91.         edit.show();
  92.         edit.setFocus();// 获取焦点        
  93.     }
  94. }
  95. //查询
  96. winform.button.oncommand = function(id,event){
  97.         winform.listview.clear()                       
  98.         var db=sqlConnection.getTable("select * from filea where name like '%%"+winform.ed_name.text+"%%'"+"and tel like  '%%"+winform.ed_tel.text+"%%'");
  99.         for(i=1;#db;1)winform.listview.addItem({tostring(db[ i ].id);db[ i ].name;db[ i ].tel});
  100.         winform.ed_name.text=""
  101.         winform.ed_tel.text=""
  102.         winform.statusbar.setText("总数:"+winform.listview.count,1)       
  103.         winform.listview.setSelected(1)
  104.         winform.listview.setFocus()
  105. }
  106. //帮助
  107. winform.button2.oncommand = function(id,event){
  108.         var str = /*
  109.         1、回车自动添加。
  110.         2、双击编辑复制。
  111.         3、模糊查询,查询空串则显示全部。
  112.         4、全部清除可删数据库。
  113.         */
  114.         win.msgboxTimeout(str,"帮助",10000)       
  115. }
  116. //删除所选数据
  117. winform.btnDelete.oncommand = function(){
  118.         var id = winform.listview.getItemText(winform.listview.selIndex,1);
  119.         if(id!=""){
  120.                 winform.listview.delItem(winform.listview.selIndex)
  121.                 sqlConnection.exec("DELETE FROM filea WHERE id=='"+id+"'")       
  122.                 winform.statusbar.setText("总数:"+winform.listview.count,1)
  123.                 winform.listview.setFocus()
  124.         }                       
  125. }
  126. //添加数据到db
  127. winform.btn_adddb.oncommand = function(){        
  128.         var name=winform.ed_name.text;        
  129.         var tel=winform.ed_tel.text;
  130.         var tel_01;
  131.         var num=sqlConnection.getTable("select tel from filea where tel='"+tel+"'");
  132.         for(i=1;#num;1) tel_01=num[ i ].tel;                     
  133.     if(tel_01!=null)   
  134.        win.msgbox("该号码已经存在","系统提示")               
  135.     else {            
  136.           if(name!="" ? tel!=""){
  137.                   //注意135行和138行不能相反,只有产生新ID号后才能在列表框中添加。                       
  138.                   sqlConnection.exec("insert into filea (name,tel) values('"+name+"','"+tel+"')")
  139.                   var db=sqlConnection.getTable("SELECT * FROM filea");
  140.                   winform.listview.addItem({tostring(db[#db].id);name;tel});            
  141.                   winform.statusbar.setText("总数:"+winform.listview.count,1)
  142.           }        
  143.     }
  144. winform.ed_name.text="";
  145. winform.ed_tel.text="";
  146. winform.ed_name.setFocus();   
  147. }
  148. winform.listview.setFocus();
  149. winform.statusbar.setText("总数:"+winform.listview.count,1)
  150. win.loopMessage();
复制代码

评分

参与人数 7专家分 +100 银币 +200 收起 理由
满月星光 + 40 赞一个!我正碰到难题,在这里看到了解决办法.
qqmmcc + 100 谢谢分享,很好的学习例子
coder + 50
万事发↑新一天 + 40 很给力!
zhoubujin + 10 很给力!
大云斗 + 10 赞一个!
51ak + 50 赞一个!

查看全部评分

回复

使用道具 举报

117

主题

1237

帖子

6592

积分

六级会员

Rank: 9Rank: 9Rank: 9

积分
6592
发表于 2013-1-15 02:29:52 | 显示全部楼层

感谢分享

感谢分享
回复

使用道具 举报

12

主题

77

帖子

483

积分

二级会员

Rank: 3Rank: 3

积分
483
 楼主| 发表于 2013-1-15 02:37:34 | 显示全部楼层

年终了太忙了,以后做个条件查询。

年终了太忙了,以后做个条件查询。
1.jpg

点评

支持一下,这个想法好。  发表于 2013-1-15 12:10
回复

使用道具 举报

15

主题

132

帖子

937

积分

三级会员

Rank: 4

积分
937
发表于 2013-1-15 06:22:48 | 显示全部楼层

不错,学习中。

不错,学习中。
回复

使用道具 举报

23

主题

411

帖子

2240

积分

五级会员

Rank: 8Rank: 8

积分
2240
发表于 2013-1-15 08:18:41 | 显示全部楼层

已收藏,已评分,加油。

已收藏,已评分,加油。
回复

使用道具 举报

6

主题

132

帖子

1113

积分

四级会员

Rank: 6Rank: 6

积分
1113
发表于 2013-1-15 08:25:08 | 显示全部楼层

相当不错 学习一下

相当不错  学习一下
静步
回复

使用道具 举报

7

主题

305

帖子

1912

积分

新手入门

积分
1912
QQ
发表于 2013-1-15 11:37:15 | 显示全部楼层

感谢分享,学习学习。

感谢分享,学习学习。
每天进步一点点......
回复

使用道具 举报

9

主题

78

帖子

504

积分

三级会员

Rank: 4

积分
504
发表于 2013-1-15 11:56:13 | 显示全部楼层

[i=s] 本帖最后由 rimren 于 2013-1-15 12:01 编辑 [/i] [一个问题是双击修改时不能自动选中] 双击要修改的数据格子,可

本帖最后由 rimren 于 2013-1-15 12:01 编辑

[一个问题是双击修改时不能自动选中]

双击要修改的数据格子,可以直接进入要修改的格子呀,

你是想定位那行,而不是直接进入格子修改?
回复

使用道具 举报

13

主题

73

帖子

635

积分

培训班

积分
635
发表于 2013-1-15 12:09:25 | 显示全部楼层

这个要支持,模糊查询偶很想学一下,可可。感谢分享。

这个要支持,模糊查询偶很想学一下,可可。感谢分享。
回复

使用道具 举报

12

主题

77

帖子

483

积分

二级会员

Rank: 3Rank: 3

积分
483
 楼主| 发表于 2013-1-15 14:35:59 | 显示全部楼层

[quote][size=2][color=#999999]rimren 发表于 2013-1-15 11:56[/color] [url=forum.php?

rimren 发表于 2013-1-15 11:56
[一个问题是双击修改时不能自动选中]

双击要修改的数据格子,可以直接进入要修改的格子呀,

不是,是双击某行后,里面的文本自动变黑(被选中)
回复

使用道具 举报

9

主题

28

帖子

281

积分

二级会员

Rank: 3Rank: 3

积分
281
发表于 2013-1-15 15:47:11 | 显示全部楼层

分不多,以资鼓励

分不多,以资鼓励
快乐分享 分享快乐
回复

使用道具 举报

48

主题

593

帖子

3336

积分

五级会员

Rank: 8Rank: 8

积分
3336
发表于 2013-1-15 19:34:35 | 显示全部楼层

感谢分享{:3_59:}

感谢分享
回复

使用道具 举报

0

主题

75

帖子

475

积分

二级会员

Rank: 3Rank: 3

积分
475
发表于 2013-1-15 21:26:50 | 显示全部楼层

正好学学

正好学学
回复

使用道具 举报

9

主题

204

帖子

1301

积分

四级会员

Rank: 6Rank: 6

积分
1301
发表于 2013-1-17 17:27:39 | 显示全部楼层

马上需要用到这个源代码,及时雨,谢谢

马上需要用到这个源代码,及时雨,谢谢
回复

使用道具 举报

7

主题

305

帖子

1912

积分

新手入门

积分
1912
QQ
发表于 2013-1-17 18:22:36 | 显示全部楼层

[quote][size=2][color=#999999]fen 发表于 2013-1-15 14:35[/color] [url=forum.php?mod

fen 发表于 2013-1-15 14:35
不是,是双击某行后,里面的文本自动变黑(被选中)

在这句代码后面
  1. edit.setFocus();// 获取焦点
复制代码
添加
  1. edit.selectAll()
复制代码
即可!
每天进步一点点......
回复

使用道具 举报

16

主题

138

帖子

932

积分

三级会员

Rank: 4

积分
932
发表于 2013-1-19 10:41:26 | 显示全部楼层

非常好!不过还可以继续完善.比如:电话号码不应该允许汉字或字母,删除一行后序号不连续等,不过还是要感谢分享,从中学到了不少东西!

非常好!不过还可以继续完善.比如:电话号码不应该允许汉字或字母,删除一行后序号不连续等,不过还是要感谢分享,从中学到了不少东西!
原创网http://fanal.cn谢谢支持
回复

使用道具 举报

12

主题

77

帖子

483

积分

二级会员

Rank: 3Rank: 3

积分
483
 楼主| 发表于 2013-1-19 12:20:39 | 显示全部楼层

[quote][size=2][color=#999999]vbvfp 发表于 2013-1-19 10:41[/color] [url=forum.php?m

vbvfp 发表于 2013-1-19 10:41
非常好!不过还可以继续完善.比如:电话号码不应该允许汉字或字母,删除一行后序号不连续等,不过还是要感谢分享 ...

兄弟呀,你说的这两种情况其实我早就实现了,最后还是这个版本,你听我慢慢道来。关于电话号码只能是数字问题,因我想记一些网址及邮箱,要不只要在属性那设一下就OK了。关于序号不连续问题,一开始我就直奔这个目的。因效果不太理想而放弃。我是这样的。把自增字段改为一般字段,
回复

使用道具 举报

12

主题

77

帖子

483

积分

二级会员

Rank: 3Rank: 3

积分
483
 楼主| 发表于 2013-1-19 12:35:02 | 显示全部楼层

[quote][size=2][color=#999999]fen 发表于 2013-1-19 12:20[/color] [url=forum.php?mod

fen 发表于 2013-1-19 12:20
兄弟呀,你说的这两种情况其实我早就实现了,最后还是这个版本,你听我慢慢道来。关于电话号码只能是数字 ...

(不好意思按中回车键了)然后用lujjjh 提到的两种方法。详见拙作 33选6的另类算法 。第一种是删除一条记录后后面的都向前移动一位,这种办法效率不高,当记录数近千时就明显了。第二种是用最后条记录更新要删除的记录,这种方法效率很高。记录数上万也是可以的。但是在查询后再修改或删除记录时,很难使数据库和列表图形框同步,故弃之。
回复

使用道具 举报

12

主题

176

帖子

1062

积分

四级会员

Rank: 6Rank: 6

积分
1062
QQ
发表于 2013-1-19 13:03:20 | 显示全部楼层

感谢分享,不错

感谢分享,不错
再烦也别忘微笑,再急也要注意语调!
即使是不成熟的尝试,也胜于胎死腹中的策略。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2018-10-21 22:28 , Processed in 0.125000 second(s), 27 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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