找回密码
 立即注册

微信登录

只需一步,快速开始

QQ登录

只需一步,快速开始

查看: 51|回复: 0

[心得] aardio 驱动程序

[复制链接]
  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 74 天

    连续签到: 5 天

    [LV.6]常住居民II

    39

    主题

    79

    回帖

    1030

    积分

    钻石会员

    积分
    1030
    来自: 中国贵州贵阳
    发表于 4 天前 | 显示全部楼层 |阅读模式 来自: 中国贵州贵阳
    非业余 - aardio 编程语言 - 非官方问答社区
    风行者三期培训:Aardio+Python+Flutter,1000集课程让你成为全栈开发高手!https://mp.weixin.qq.com/s/_WOoHFtITUyLk2k7BXYGkg
    Aardio培训大揭秘,轻松上手打造个人项目!https://mp.weixin.qq.com/s/cr47qhp_Cpz0p57lbbPwug
    aardio风行者第二期培训班https://mp.weixin.qq.com/s/uB6XHUDnGSk0JlWuiBE9AA
    aardio风行者第三期培训班https://mp.weixin.qq.com/s/cdZcvFiAWhlYTaSrQGCPvA
    本帖最后由 XWCXF 于 2025-6-24 09:12 编辑

    事件驱动编程
    今天开始学习事件驱动编程,突然觉得编程就像一场音乐会——每个程序组件都是乐器,而“事件”就像指挥棒的挥动,只有被触发时才会演奏。这种编程模式让程序能根据用户操作、系统状态变化做出响应。
    一、事件绑定基础
    事件绑定的关键是把事件和处理函数关联起来,我在aardio里试了两个例子:
    示例1:按钮点击事件绑定
    [AAuto] 纯文本查看 复制代码
    import win.ui;
    /*DSG{{*/
    var winform = win.form(text="事件绑定示例";right=759;bottom=469)
    winform.add(
    button={cls="button";text="点击我";left=327;top=202;right=432;bottom=241;z=1}
    )
    /*}}*/
    
    // 定义按钮点击事件处理函数
    winform.button.oncommand = function(id,event){
    win.msgbox("按钮被点击啦!")
    }
    
    winform.show();
    win.loopMessage();
    运行后点击按钮真的弹出了消息框!原来通过oncommand属性就能绑定点击事件,匿名函数里的逻辑就是事件触发后的动作。
    示例2:窗口关闭事件绑定
    [AAuto] 纯文本查看 复制代码
    import win.ui;
    /*DSG{{*/
    var winform = win.form(text="窗口关闭事件示例";right=759;bottom=469)
    winform.add(
    edit={cls="edit";text="关闭窗口试试";left=9;top=11;right=747;bottom=170;edge=1;multiline=1;z=1}
    )
    /*}}*/
    
    winform.onClose= function(hwnd,message,wparam){
    select(message) {
    case 0x10{
    if(win.msgboxTest("你要关闭窗口么?") ===false){
    return wparam;
    }
    }
    }
    }
    winform.show();
    win.loopMessage();
    这个例子让我学会了拦截系统事件——当点击窗口关闭按钮时,程序会先弹出确认框,选“否”就不关闭窗口。这里用onClose绑定事件,通过message参数判断是否为关闭事件(0x10是Windows消息中的WM_CLOSE)。
    二、自定义事件”
    系统事件不够用?那就自己定义!试了两个例子:
    示例1:自定义事件触发
    [AAuto] 纯文本查看 复制代码
    import win.ui;
    /*DSG{{*/
    var winform = win.form(text="自定义事件示例";right=759;bottom=469)
    winform.add(
    button={cls="button";text="触发自定义事件";left=327;top=202;right=432;bottom=241;z=1}
    )
    /*}}*/
    
    // 定义自定义事件处理函数
    var customEvent = function(){
    win.msgbox("自定义事件被触发啦!")
    }
    
    // 按钮点击时触发自定义事件
    winform.button.oncommand = function(id,event){
    customEvent()
    }
    
    winform.show();
    win.loopMessage();
    先定义一个customEvent函数,再通过按钮点击事件调用它——这就像自己写了一段旋律,让按钮成为触发演奏的开关。
    示例2:带参数的自定义事件
    [AAuto] 纯文本查看 复制代码
    import win.ui;
    /*DSG{{*/
    var winform = win.form(text="带参数的自定义事件示例";right=759;bottom=469)
    winform.add(
    button={cls="button";text="触发带参数的自定义事件";left=327;top=202;right=432;bottom=241;z=1}
    )
    /*}}*/
    
    // 定义带参数的自定义事件处理函数
    var customEventWithParam = function(param){
    win.msgbox("自定义事件被触发,参数是:" + param)
    }
    
    // 按钮点击时触发带参数的自定义事件
    winform.button.oncommand = function(id,event){
    customEventWithParam("Hello, aardio!")
    }
    
    winform.show();
    win.loopMessage();
    带参数的事件更灵活!比如可以让不同按钮传递不同文本,事件函数根据参数显示不同内容,这让程序逻辑更动态了。
    三、事件队列管理
    事件太多时,需要按顺序执行——这就是事件队列的作用。
    示例1:简单的事件队列
    [AAuto] 纯文本查看 复制代码
    import win.ui;
    /*DSG{{*/
    var winform = win.form(text="事件队列示例";right=759;bottom=469)
    winform.add(
    button={cls="button";text="触发事件队列";left=327;top=202;right=432;bottom=241;z=1}
    )
    /*}}*/
    
    // 定义事件队列
    var eventQueue = {}
    
    // 定义事件处理函数
    var event1 = function(){
    win.msgbox("事件 1 被执行")
    }
    var event2 = function(){
    win.msgbox("事件 2 被执行")
    }
    // 将事件添加到队列
    table.push(eventQueue,event1)
    table.push(eventQueue,event2)
    
    // 按钮点击时依次执行队列中的事件
    winform.button.oncommand = function(id,event){
    
    for(i=1;#eventQueue;1){
    eventQueue[i]()
    }
    }
    winform.show();
    win.loopMessage();
    用数组eventQueue存储事件函数,点击按钮后通过循环依次执行——就像音乐会按节目单逐个演奏曲目,顺序不会乱。
    示例2:动态管理事件队列
    [AAuto] 纯文本查看 复制代码
    import win.ui;
    /*DSG{{*/
    var winform = win.form(text="动态管理事件队列示例";right=759;bottom=469)
    winform.add(
    button1={cls="button";text="添加事件到队列";left=200;top=202;right=305;bottom=241;z=1},
    button2={cls="button";text="执行队列中的事件";left=400;top=202;right=505;bottom=241;z=2}
    )
    /*}}*/
    
    // 定义事件队列
    var eventQueue = {}
    
    // 定义事件处理函数
    var event1 = function(){
    win.msgbox("事件 1 被执行")
    }
    
    // 按钮 1 点击时添加事件到队列
    winform.button1.oncommand = function(id,event){
    table.push(eventQueue,event1)
    win.msgbox("事件已添加到队列")
    }
    
    // 按钮 2 点击时执行队列中的事件
    winform.button2.oncommand = function(id,event){
    for(i=1;#eventQueue;1){
    eventQueue[i]()
    
    }
    }
    winform.show();
    win.loopMessage();
    这个例子更实用!可以随时添加事件到队列,再统一执行。比如用户连续点击“添加事件”按钮,程序会按顺序记录所有事件,最后一次性处理。
    四、挑战
    题目要求做一个带事件队列的窗口,我试着写了代码:
    [AAuto] 纯文本查看 复制代码
    import win.ui;
    /*DSG{{*/
    var winform = win.form(text="综合习题示例";right=759;bottom=469)
    winform.add(
    button1={cls="button";text="添加事件到队列";left=200;top=202;right=305;bottom=241;z=1},
    button2={cls="button";text="执行队列中的事件";left=400;top=202;right=505;bottom=241;z=2}
    )
    /*}}*/
    
    // 定义事件队列
    var eventQueue = {}
    var eventCount = 0
    
    // 按钮 1 点击时添加事件到队列
    winform.button1.oncommand = function(id,event){
    eventCount = eventCount + 1
    var newEvent = function(){
    win.msgbox("事件 " + eventCount + " 被执行")
    }
    table.push(eventQueue,newEvent)
    win.msgbox("事件 " + eventCount + " 已添加到队列")
    }
    
    // 按钮 2 点击时执行队列中的事件
    winform.button2.oncommand = function(id,event){
    for(i=1;#eventQueue;1){
    eventQueue[i]()
    }
    eventQueue = {}
    }
    
    winform.show();
    win.loopMessage();
    运行后发现,每次点击“添加事件”按钮,程序会生成一个带编号的事件并加入队列;点击“执行事件”按钮,会按顺序弹出消息框。这里我用eventCount记录事件编号,每次添加事件时动态创建函数 !

    今日总结
    • 事件驱动编程的核心是“事件触发-函数响应”模式。
    • 事件绑定、自定义事件、事件队列是三大基础模块,通过oncommand、onClose等属性实现交互逻辑


    aardio 新手交流学习群,一起学习的进
    qq群号:697197055
    微信群加我 _825720xw 拉你


    非业余 - aardio 编程语言 - 非官方问答社区
    风行者三期培训:Aardio+Python+Flutter,1000集课程让你成为全栈开发高手!https://mp.weixin.qq.com/s/_WOoHFtITUyLk2k7BXYGkg
    Aardio培训大揭秘,轻松上手打造个人项目!https://mp.weixin.qq.com/s/cr47qhp_Cpz0p57lbbPwug
    aardio风行者第二期培训班https://mp.weixin.qq.com/s/uB6XHUDnGSk0JlWuiBE9AA
    aardio风行者第三期培训班https://mp.weixin.qq.com/s/cdZcvFiAWhlYTaSrQGCPvA
    回复

    使用道具 举报

    *滑块验证:
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Archiver|手机版|小黑屋|非业余 - aardio 编程语言 - 非官方问答社区 知道创宇云防御

    GMT+8, 2025-6-27 18:03 , Processed in 0.122585 second(s), 31 queries .

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

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