• DrGraph软件升级:WIN7下的程序BUG修正


    简要说明

    1. 启动程序出现脚本错误(OK)

    提交人

    DrGraph 2013/04/24

    处理状态

    处理完毕

    同步状态

     

    现象

    程序启动时,出现脚本错误

    定位及调试过程

    1. 可以确定,这是起始页面的JavaScript导致的问题
    2. 再定位确定为swfobject_modified.js的484行,打开之

      对应函数

      function setVisibility(id, isVisible) {

              var v = isVisible ? "inherit" : "hidden";

              if (isDomLoaded) {

                  getElementById(id).style.visibility = v;

              }

              else {

                  createCSS("#" + id, "visibility:" + v);

              }

          }

      即getElementById(id).style.visibility = v;出错

      屏蔽该行,再运行,正常

     

     

     

    简要说明

    1. 程序出现内部已捕获处理的异常

    提交人

    DrGraph 2013/04/24

    处理状态

     

    同步状态

     

    现象

    程序运行后,日志中记录

    <Info msg="Open File failed!

    ErrorCode:5

    " />

    <Info msg="出现异常 (null): Failed to get data for 'ServiceType'

    抛出异常处:文件 (null) 第 0 行

    处理异常处: 文件 ??尮潆浲屳敗卢牥楶散摁牤獥?牯?挮灰 第 85 行

    " />

    定位及调试过程

    Open File failed!

    ErrorCode:5

    的原因在于,在WIN7下无法写文件,需要加上管理员权限

    Failed to get data for 'ServiceType'

    的原因在于,在WIN7无法读取注册表,需要加上管理员权限

    乱码的所在:

    THelper::FormatString(L"出现异常 %s: %s\n\n抛出异常处:文件 %s 第 %d 行\n\n处理异常处: 文件 %s 第 %d 行\n\n", \

    __ThrowExceptionName(), ex.Message.c_str(), __ThrowFileName(), \

    __ThrowLineNumber(), __FILE__, __LINE__)

    即__FILE__写入到其中出现乱码

    单独测试一下:

        THelper::MessageBox(

            THelper::FormatString(L"出现异常 \n\n抛出异常处:文件 行\n\n处理异常处: 文件 %s 第 %d 行\n\n", \

                __FILE__, __LINE__), false);

    查帮助,知道:

    __FILE__

    String literal

    Name of the current file being processed.

    不费事再去查__FILE__是如何定义的了,直接强制转化

    THelper::MessageBox(

            THelper::FormatString(L"出现异常 \n\n抛出异常处:文件 行\n\n处理异常处: 文件 %s 第 %d 行\n\n", \

                UnicodeString(__FILE__).w_str(), __LINE__), false);

    得到结果,达到目标:

    最终,如果不以管理员权限运行程序,会记录日志:

    如果以管理员权限运行程序,会记录日志:

     

     

    简要说明

    1. 自动属性赋值代码

    提交人

    DrGraph 2013/04/24

    处理状态

    OK

    同步状态

    完成

    现象

    经常有以下情况:

    有多个控件(如A、B控件)

    A控件属性修改时,其事件处理函数中会导致B控件的属性也相应赋值

    B控件属性修改时,其事件处理函数中会导致A控件的属性也相应赋值

    从而导致死循环

    定位及调试过程

    加上一个全局变量,标志是否正在修改,或允许修改

    class TGlobalVariables {

        static bool EnableAutoChangeValue;

    ///< 全局变量:允许自动修改值,主要用途:避免多个控件属性修改时,导致关联控件属性事件触发,出现死循环

    };

    bool TGlobalVariables::EnableAutoChangeValue = true; // 缺省为true,允许修改

     

    则使用时,首先判断该标志,若不为true,则不处理;然后置该标志为false,避免其它地方再入;处理完成后,恢复该标志。即:

        if (!TGlobalVariables::EnableAutoChangeValue)    

            return;

        TRestore(TGlobalVariables::EnableAutoChangeValue, false);

    为编码方便,定义一个宏:

    #define CBW_PREVENT_CHANGE_LOOP \

        if (!TGlobalVariables::EnableAutoChangeValue)    \

            return; \

        TRestore(TGlobalVariables::EnableAutoChangeValue, false);

    则在使用时,只需在最开始处加上:

    CBW_PREVENT_CHANGE_LOOP;

    即可。

  • 相关阅读:
    应用 memcached 提升站点性能
    Servlet 工作原理解析
    AJAX的一些基础和AJAX的状态
    回调地狱以及用promise怎么解决回调地狱
    Ajax的封装
    promise的理解和应用
    jsonp跨域
    浅谈事件冒泡和事件捕获
    JS中的兼容问题总结
    JS写的二级导航栏(利用冒泡原理)
  • 原文地址:https://www.cnblogs.com/drgraph/p/3040946.html
Copyright © 2020-2023  润新知