搜索
查看: 1329|回复: 5

调用界面线程窗口函数不能遍历树形控件父节点下的子节点吗?

[复制链接]

2

主题

39

帖子

335

积分

二级会员

Rank: 3Rank: 3

积分
335
发表于 2017-9-25 16:01:31 | 显示全部楼层 |阅读模式
如何多线程遍历树形控件父节点下的子节点,下面用调用界面线程窗口函数的代码会报错实现不了...
import win.ui; import console;
/*DSG{{*/
var mainForm = win.form(text="aardio";right=355;bottom=421;parent=...)
mainForm.add(
button={cls="button";text="button";left=241;top=76;right=327;bottom=144;z=2};
treeview={cls="treeview";left=15;top=34;right=207;bottom=349;asel=false;bgcolor=16777215;edge=1;z=1}
)
/*}}*/

var hitem = mainForm.treeview.insertItem( {
        text = "children数组指定子节点";
        children = {
            { text = "子节点"  };
            { text = "子节点2" };
        }
} )

mainForm.show();


mainForm.threadCallable();  

thread.invoke(
        function(mainForm){
                import console; import win.ui;
                  
                for hItem in mainForm.treeview.each(hitem) {
                        console.debug(mainForm.treeview.getItemText(hItem));
                }
               
        },mainForm
)


win.loopMessage();
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2017-10-20 05:21:39 | 显示全部楼层
新版本中已经支持跨线程调用控件的迭代器
import win.ui;
/*DSG{{*/
var mainForm = win.form(text="aardio";right=679;bottom=407;parent=...)
mainForm.add(
edit={cls=
"edit";left=256;top=40;right=640;bottom=352;edge=1;multiline=1;z=2};
treeview={cls=
"treeview";left=15;top=34;right=207;bottom=349;asel=false;bgcolor=16777215;edge=1;z=1}
)
/*}}*/

var hItem = mainForm.treeview.insertItem( {
    text =
"children数组指定子节点";
    children = {
        { text =
"子节点"  };
        { text =
"子节点2" };
    }
} )


thread.invoke(
   
function(mainForm,hRootItem){
        
for hSubItem in mainForm.treeview.each(hRootItem) {
             mainForm.edit.print(mainForm.treeview.getItemText(hSubItem));
        }
            
    },mainForm,hItem
)

mainForm.show();
win.loopMessage();
要注意在工作线程中不能直接使用界面线程中的局部变量hItem,通过线程函数的参数传过去
回复

使用道具 举报

10

主题

88

帖子

509

积分

三级会员

Rank: 4

积分
509
发表于 2017-10-17 16:23:55 | 显示全部楼层
hitem变量的大小写容易误导,我改成hItem了,我本地测试通过

  1. import win.ui;
  2. import console;
  3. import thread;

  4. /*DSG{{*/
  5. var mainForm = win.form(text="aardio";right=355;bottom=421;parent=...)
  6. mainForm.add(
  7. button={cls="button";text="button";left=241;top=76;right=327;bottom=144;z=2};
  8. treeview={cls="treeview";left=15;top=34;right=207;bottom=349;asel=false;bgcolor=16777215;edge=1;z=1}
  9. )
  10. /*}}*/

  11. var hItem = mainForm.treeview.insertItem( {
  12.          text = "children数组指定子节点";
  13.          children = {
  14.              { text = "子节点"  };
  15.              { text = "子节点2" };
  16.          }
  17. } )


  18. mainForm.button.oncommand = function(id,event){

  19.         //thread.create(test,hItem,mainForm.treeview.hwnd)//另一种方式
  20.         thread.invoke(test,hItem,mainForm.treeview.hwnd)

  21. }

  22. test = function(hItem,hwnd){
  23.         import win.ui.ctrl.treeview;
  24.         import win;
  25.         treeview=win.ui.ctrl.treeview()
  26.         treeview.hwnd = hwnd;

  27.            for hItem in treeview.each(hItem){
  28.                    win.msgbox(treeview.getItemText(hItem))
  29.            }

  30. }

  31. mainForm.show();
  32. return win.loopMessage();
复制代码
~什么都会点,什么都不会~
回复

使用道具 举报

2

主题

39

帖子

335

积分

二级会员

Rank: 3Rank: 3

积分
335
 楼主| 发表于 2017-10-17 20:17:47 | 显示全部楼层
mzky 发表于 2017-10-17 16:23
hitem变量的大小写容易误导,我改成hItem了,我本地测试通过

谢谢,学习了,要传句柄和节点进去才可以
回复

使用道具 举报

10

主题

88

帖子

509

积分

三级会员

Rank: 4

积分
509
发表于 2017-10-18 12:07:42 | 显示全部楼层
Danboy 发表于 2017-10-17 20:17
谢谢,学习了,要传句柄和节点进去才可以


其实只传句柄就行 比如这样
  1. import win.ui;
  2. import console;
  3. import thread;
  4. /*DSG{{*/
  5. var mainForm = win.form(text="aardio";right=355;bottom=421;parent=...)
  6. mainForm.add(
  7. button={cls="button";text="button";left=241;top=76;right=327;bottom=144;z=2};
  8. treeview={cls="treeview";left=15;top=34;right=207;bottom=349;asel=false;bgcolor=16777215;edge=1;z=1}
  9. )
  10. /*}}*/

  11. mainForm.treeview.insertItem( {
  12.          text = "children数组指定子节点";
  13.          children = {
  14.              { text = "子节点"  };
  15.              { text = "子节点2" };
  16.          }
  17. } )


  18. mainForm.button.oncommand = function(id,event){

  19.         //thread.create(test,mainForm.treeview.hwnd)//另一种方式
  20.         thread.invoke(test,mainForm.treeview.hwnd)

  21. }

  22. test = function(hwnd){
  23.         import win.ui.ctrl.treeview;
  24.         import win;
  25.         treeview=win.ui.ctrl.treeview()
  26.         treeview.hwnd = hwnd;
  27.                
  28.         var treeRoot = treeview.getRoot()//在这里返回根节点

  29.         for hItem in treeview.each(treeRoot){
  30.                 win.msgbox(treeview.getItemText(hItem))
  31.         }

  32. }

  33. mainForm.show();
  34. return win.loopMessage();
复制代码
~什么都会点,什么都不会~
回复

使用道具 举报

2

主题

39

帖子

335

积分

二级会员

Rank: 3Rank: 3

积分
335
 楼主| 发表于 2017-10-20 09:52:56 | 显示全部楼层
Jacen.He 发表于 2017-10-20 05:21
新版本中已经支持跨线程调用控件的迭代器
要注意在工作线程中不能直接使用界面线程中的局部变量hItem,通 ...

不断的完善,aardio大法好
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2018-12-15 17:07 , Processed in 0.062500 second(s), 24 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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