qq_22086223 2024-07-19 11:35 采纳率: 100%
浏览 21
已结题

aardio tabs 控件切换时动态调用不同的方法

需求:aardio tabs 控件切换时动态调用不同的方法。
场景:图1 是调用 tab1里面定义的方法。图2 回车怎么调用 tab2里的事件?

img

img


import win.ui;
if( ! win.loadForm("\dlg\login\login.aardio").doModal() ){
    return;
}
/*DSG{{*/
mainForm = win.form(text="tab窗口";right=959;bottom=591)
mainForm.add(
custom={cls="\dlg\main\userInfo.aardio";text="custom";left=568;top=544;right=944;bottom=584;db=1;dr=1;z=1};
tab={cls="tab";left=8;top=16;right=944;bottom=536;db=1;dl=1;dr=1;dt=1;edge=1;z=2}
)
/*}}*/

var tabs1=mainForm.tab.loadForm("\dlg\main\tabs1.aardio");
var tabs2=mainForm.tab.loadForm("\dlg\main\tabs2.aardio");
var tabs3=mainForm.tab.loadForm("\dlg\main\tabs3.aardio");

mainForm.tab.onnotify = function(id,code,ptr){
    if(code==0xFFFFFDD9/*_TCN_SELCHANGE*/) 
        mainForm.msgbox("切换选项卡") 
} 

mainForm.onCancel = function(){
    mainForm.msgbox("你按了ESC");
    mainForm.close();
}

mainForm.onOk = function(){
      mainForm.msgbox("你按了Enter");    
      // 调用 tabs1 的 winform.button.oncommand() 事件
      tabs1.button.oncommand();  
}

/*
窗口会自动检测默认的对话框快捷键,
默认Enter会触发onOk事件,ESC键会触发onCancel事件,
可选如下自定义检测对话框快捷键函数 winform.isDialogMessage
*/
mainForm.isDialogMessage = function(hwnd,msg){
    if( msg.message == 0x100/*_WM_KEYDOWN*/){
        
        if(  msg.wParam == 0xD/*_VK_RETURN*/ ){ 
            //return true;//告诉消息处理函数这是一个快捷键,阻止按键消息继续分发
        }
        
        if( msg.wParam == 0x1B/*_VK_ESC*/ ){
            //return true;//告诉消息处理函数这是一个快捷键,阻止按键消息继续分发
        } 
    }
    
    //检测并响应默认快捷键
    return win.isDialogMessage(hwnd,msg);
}

mainForm.show();
return win.loopMessage();

  • 写回答

5条回答 默认 最新

  • 檀越@新空间 2024-07-19 11:41
    关注

    上午好☀️☀️☀️️
    本答案参考ChatGPT-3.5

    问题要求实现在 aardio tabs 控件切换时动态调用不同的方法。具体场景是在 tab1 中调用 tab2 的事件。下面给出解决方案:

    1. 在代码中,tabs1、tabs2和tabs3是通过mainForm.tab.loadForm函数加载的子窗口。
    2. 为了实现在切换选项卡时动态调用不同的方法,可以在mainForm.tab.onnotify回调函数中监听选项卡切换事件。
    3. 当选项卡切换事件触发时,可以根据切换到的选项卡的索引来判断是调用哪个子窗口的方法。
    4. 在tab1的回车事件处理函数mainForm.onOk中,通过tabs1.button.oncommand()来调用tabs1中的winform.button.oncommand()事件。
    5. 同样,在切换到tab2时,可以调用tabs2中相应的方法。

    下面是修改后的代码:

    import win.ui;
    
    if (!win.loadForm("\dlg\login\login.aardio").doModal()) {
        return;
    }
    
    /*DSG{{*/
    mainForm = win.form(text = "tab窗口"; right = 959; bottom = 591)
    mainForm.add(
        custom = { cls = "\dlg\main\userInfo.aardio"; text = "custom"; left = 568; top = 544; right = 944; bottom = 584; db = 1; dr = 1; z = 1 };
        tab = { cls = "tab"; left = 8; top = 16; right = 944; bottom = 536; db = 1; dl = 1; dr = 1; dt = 1; edge = 1; z = 2 }
    )
    /*}}*/
    
    var tabs1 = mainForm.tab.loadForm("\dlg\main\tabs1.aardio");
    var tabs2 = mainForm.tab.loadForm("\dlg\main\tabs2.aardio");
    var tabs3 = mainForm.tab.loadForm("\dlg\main\tabs3.aardio");
    
    mainForm.tab.onnotify = function (id, code, ptr) {
        if (code == 0xFFFFFDD9/*_TCN_SELCHANGE*/) {
            // 获取当前选项卡的索引
            var currentIndex = mainForm.tab.getCurrentIndex();
            
            // 根据索引调用不同的方法
            if (currentIndex == 0) {
                mainForm.msgbox("切换到tab1");
                tabs1.button.oncommand();
            } else if (currentIndex == 1) {
                mainForm.msgbox("切换到tab2");
                tabs2.button.oncommand();
            } else if (currentIndex == 2) {
                mainForm.msgbox("切换到tab3");
                tabs3.button.oncommand();
            }
        }
    }
    
    mainForm.onCancel = function () {
        mainForm.msgbox("你按了ESC");
        mainForm.close();
    }
    
    mainForm.onOk = function () {
        mainForm.msgbox("你按了Enter");
    
        // 调用tabs1的winform.button.oncommand()事件
        tabs1.button.oncommand();
    }
    
    /*
    窗口会自动检测默认的对话框快捷键,
    默认Enter会触发onOk事件,ESC键会触发onCancel事件,
    可选如下自定义检测对话框快捷键函数 winform.isDialogMessage
    */
    mainForm.isDialogMessage = function (hwnd, msg) {
        if (msg.message == 0x100/*_WM_KEYDOWN*/) {
    
            if (msg.wParam == 0xD/*_VK_RETURN*/) {
                //return true;//告诉消息处理函数这是一个快捷键,阻止按键消息继续分发
            }
    
            if (msg.wParam == 0x1B/*_VK_ESC*/) {
                //return true;//告诉消息处理函数这是一个快捷键,阻止按键消息继续分发
            }
        }
    
        //检测并响应默认快捷键
        return win.isDialogMessage(hwnd, msg);
    }
    
    mainForm.show();
    return win.loopMessage();
    

    注意:以上代码中的getCurrentIndex()函数来自于aardio的tab控件,需要确保该函数的存在。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 7月27日
  • 已采纳回答 7月19日
  • 创建了问题 7月19日