aardio 官方社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 9583|回复: 7

遇到问题,不知道是不是写错了

[复制链接]

5

主题

26

回帖

226

积分

二级会员

积分
226
发表于 2012-5-6 14:16:14 | 显示全部楼层 |阅读模式
这是我的代码:
  1. import win.ui;
  2. import process;
  3. /*DSG{{*/
  4. var winform = win.form( bottom=400;parent=...;right=479;text="aardio Form" )
  5. winform.add(
  6. button2={ bottom=40;text="显示所有进程";left=296;top=8;z=4;right=376;cls="button" };
  7. listview={ bgcolor=16777215;bottom=392;right=472;left=8;top=48;z=6;edge=1;cls="listview" };
  8. edit={ bottom=32;right=200;left=104;top=8;z=2;edge=1;cls="edit" };
  9. button={ bottom=40;text="KILL";left=208;top=8;z=3;right=288;cls="button" };
  10. static={ bottom=72;right=160;left=8;top=16;transparent=1;notify=1;text="请输入进程PID";z=1;cls="static" };
  11. button3={ bottom=40;text="刷新";left=384;top=8;z=5;right=464;cls="button" }
  12. )
  13. /*}}*/

  14. winform.listview.onnotify = function(id,code,ptr){
  15.         //var nmdr = win.ui.NMHDR(); raw.convert( ptr,nmdr );;
  16.        
  17.        
  18. }
  19. winform.static.oncommand = function(id,event){
  20.         //winform.msgbox( winform.static.text );
  21.        
  22.        
  23. }
  24. winform.wndproc = function(hwnd,message,wParam,lParam){
  25.         select( message ) {
  26.                 case 0x205/*_WM_RBUTTONUP*/{
  27.                         //鼠标右键弹起,下面获取坐标
  28.                         var x,y = win.getMessagePos(lParam);
  29.                        
  30.                 }
  31.                 else{
  32.                        
  33.                 }
  34.         }
  35.         //无返回值则继续调用默认回调函数
  36. }

  37. winform.button.oncommand = function(id,event){
  38.         //winform.msgbox( winform.button.text );
  39.         prcId = winform.edit.text
  40.         killPrc(prcId);
  41.        
  42. }
  43. GetProcessMemoryInfo = ::Psapi.api("GetProcessMemoryInfo","int(pointer hProcess,struct& ppsmemCounters,int cb)")

  44. PROCESS_MEMORY_COUNTERS= class{
  45.     int cb;
  46.     int PageFaultCount;
  47.     int PeakWorkingSetSize; //物理内存的最大值
  48.     int WorkingSetSize;     //物理内存的大小
  49.     int QuotaPeakPagedPoolUsage;
  50.     int QuotaPagedPoolUsage;
  51.     int QuotaPeakNonPagedPoolUsage;
  52.     int QuotaNonPagedPoolUsage;
  53.     int PagefileUsage;      //虚拟内存大小
  54.     int PeakPagefileUsage;  //虚拟内存的最大值
  55. }

  56. mem=PROCESS_MEMORY_COUNTERS()



  57. killPrc = function(prcId){

  58. }
  59. i=0
  60. for processEntry in process.each( ".*.exe" ) {  
  61.      i++;  
  62.      prc=process(processEntry.th32ProcessID)
  63.      GetProcessMemoryInfo(prc.handle,mem,raw.sizeof(mem))
  64.   procName=processEntry.szExeFile //进程名称
  65.   procId=processEntry.th32ProcessID //进程PID
  66.   procMem=mem.WorkingSetSize/1024 ++ "K"
  67.    winform.listview.addItem("",i) //插入的行数
  68.    winform.listview.setItemText(procName,i,1)
  69.    winform.listview.setItemText(tostring(procId),i,2)
  70.    winform.listview.setItemText(procMem,i,3)
  71.    
  72. }

  73. tlv={ "进程名称";"进程PID";"进程使用内存" }
  74. for ( k,v in tlv ){
  75. if(v="进程名称"){
  76.                         len=150;
  77.                 }elseif(v="进程PID"){
  78.                         len=150;
  79.                 }else {
  80.                 len=158;
  81.                 }
  82.                 winform.listview.insertColumn(v,len,i,0x2/*_LVCFMT_LEFT*/)
  83.                
  84. }

  85. winform.text="进程管理器"
  86. winform.show()
  87. win.loopMessage();
  88. return winform;
复制代码
第二列和第三列的数值没有出来?


43

主题

628

回帖

3765

积分

版主

积分
3765
发表于 2012-5-6 14:56:15 | 显示全部楼层
规范代码重新写了一遍, 问题自然就没有了.
代码不规范,思路也就乱,问题也就多,找起来也很痛苦,

import win.ui;
import process;
/*DSG{{*/
var winform = ..win.form( bottom=400;parent=...;right=479;text="aardio Form" )
winform.add(
btnListProcess={ bottom=40;text=
"显示所有进程";left=296;top=8;z=4;right=376;cls="button" };
listview={ bgcolor=16777215;bottom=392;right=472;left=8;top=48;z=6;edge=1;cls=
"listview" };
button={ bottom=40;text=
"KILL";left=208;top=8;z=3;right=288;cls="button" };
static={ bottom=72;right=160;left=8;top=16;transparent=1;notify=1;text=
"请输入进程PID";z=1;cls="static" };
editProcId={ bottom=32;right=200;left=104;top=8;z=2;edge=1;cls=
"edit" };
btnRefresh={ bottom=40;text=
"刷新";left=384;top=8;z=5;right=464;cls="button" }
)
/*}}*/

//列表视图添加列
tlv={ { "进程名称";150};{ "进程PID";150};{ "进程使用内存";-1} }
for ( i,column in tlv ){
     winform.listview.insertColumn(column[1],column[2] );
}

//杀除进程  
winform.button.oncommand = function(id,event){
   
var prcId = tonumber(winform.editProcId.text)
   process(prcId).terminate()
}

//列表视图响应鼠标点击
winform.listview.onnotify = function(id,code,ptr){
   
   
select(code) {
        
case  0xFFFFFF9B/*_LVN_ITEMCHANGED*/ {
            
var nm = winform.listview.getNotifyMessage(code,ptr)
            
if(winform.listview.selIndex){
                winform.editProcId.text = winform.listview.getItemText(nm.iItem,2)
            }
        }
        
case 0xFFFFFFFB/*_NM_RCLICK*/  {
            
var x,y = mouse.getPos()
            
//弹出菜单
        }
    }
}

//获取进程内存
GetProcessMemoryInfo = ::Psapi.api("GetProcessMemoryInfo","int(pointer hProcess,struct& ppsmemCounters,int cb)")
PROCESS_MEMORY_COUNTERS=
class{
    int cb;
    int PageFaultCount;
    int PeakWorkingSetSize;
//物理内存的最大值
    int WorkingSetSize;     //物理内存的大小
    int QuotaPeakPagedPoolUsage;
    int QuotaPagedPoolUsage;
    int QuotaPeakNonPagedPoolUsage;
    int QuotaNonPagedPoolUsage;
    int PagefileUsage;      
//虚拟内存大小
    int PeakPagefileUsage;  //虚拟内存的最大值
}
memory_counters =PROCESS_MEMORY_COUNTERS()

import fsys;
listProcess =
function(){
    winform.listview.clear();
    win.delay(500);
   
   
for processEntry in process.each( ".*.exe" ) {   
   
        
var prc=process(processEntry.th32ProcessID)
        
if(!prc) continue;
        
        GetProcessMemoryInfo(prc.handle,memory_counters,raw.sizeof(memory_counters))
        procName=processEntry.szExeFile
//进程名称
        procId=processEntry.th32ProcessID //进程PID
        procMem= fsys.formatSize(memory_counters.WorkingSetSize)
        
        
var row = winform.listview.addItem(procName ) //插入的行数
        winform.listview.setItemText(tostring(procId),row,2)
        winform.listview.setItemText(procMem,row,3)
    }   
}
listProcess();

winform.btnRefresh.oncommand =
function(id,event){
    listProcess();
}

winform. btnListProcess.oncommand =
function(id,event){
    listProcess();  
}

winform.text=
"进程管理器"
winform.show()

win.loopMessage();
return winform;

43

主题

628

回帖

3765

积分

版主

积分
3765
发表于 2012-5-6 14:58:17 | 显示全部楼层
你先添加每个列的数据, 可是这时候这些列还没有创建.
应当先创建listview的所有列, 再填充数据.

编码的时候注意规范, 把初始化的代码写在前面.

5

主题

26

回帖

226

积分

二级会员

积分
226
 楼主| 发表于 2012-5-6 15:17:10 | 显示全部楼层
非常感谢楼上提出的解答,是啊,因为自己是初学者,一下子思路感觉有点乱了,也看了许多的例子,现在在开始写一些代码,刚开始的,确实遇到不少问题

5

主题

26

回帖

226

积分

二级会员

积分
226
 楼主| 发表于 2012-5-6 15:18:31 | 显示全部楼层
再问一下,这边var row = winform.listview.addItem(procName ) //插入的行数
        winform.listview.setItemText(tostring(procId),row,2)
        winform.listview.setItemText(procMem,row,3)
这样第一列的数据就自动插入了?

5

主题

26

回帖

226

积分

二级会员

积分
226
 楼主| 发表于 2012-5-6 15:33:23 | 显示全部楼层
我自己试了下,确实在定义局部变量var row = winform.listview.addItem(procName ) ,第一列就已经插入了,我只是遇到这个小问题,后面的几个控件功能都还没有去写,没有想到,编程同志全部给完成了。

43

主题

628

回帖

3765

积分

版主

积分
3765
发表于 2012-5-6 15:58:28 | 显示全部楼层
一般常见的需求,标准库的函数一般也会考虑到了,
用的时候注意看一下代码提示,或者到相应的库看一下函数源码。
象listview的源码在 win.ui.ctrl.listview 里。

一个就是写代码的时候注意整理清晰,注意书写规范。
另外一个就是遇到问题留心你忽略的细节,这样可以少走很多弯路。

5

主题

26

回帖

226

积分

二级会员

积分
226
 楼主| 发表于 2012-5-6 16:20:02 | 显示全部楼层
有一些代码都是写好的直接拷过来,只知道这样可以实现某功能,但具体的为什么要这样写,还不是很清楚,有好的办法?
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2024-10-4 20:17 , Processed in 0.055649 second(s), 22 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

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