• C++ Builder XE2随意学习 (15) > 类静态数据的一个小问题


    正如之前所说,学C++ Builder XE2是为了把我自己以前编的程序FutureGraph自CB6升级为C++ Builder XE2版本,这个过程是下了很大决心的,现在刚开始,鼓励自己说前途是光明的,道路是曲折的。

    此话不假。

    这次升级,想把代码规范下,在C++ Builder XE2中有个Ctrl+D快捷键,再乱的代码,Ctrl+D一下,就规整化了,这一点不错。

    靠C++ Builder XE2来规范代码,只是表面的,深层次的还得靠自己。比如,全局变量,命名空间等。

    我这次把以前分散定义在各处的全局变量统一在一个地方声明。为了享受C++ Builder XE2的代码完成功能,我就把这些变量声明在一个类TGlobalVariable中,全部实现为静态数据成员。

              /**
    * @class TGlobalVariable
    * @brief 全局变量类
    *
    * 本系统中将用到的各种全局变量
    * - 若变量名称全大写,表示为常量,不可修改;
    * - 反之表示该变量可以动态修改
    *
    * @author 陈斌文
    * @version 2.0
    * @date 2012-02-13
    */
    class TGlobalVariable {
    public:
    /** @name 全局可变变量
    * @{
    */
    static ApplicationStatus ApplicationCurrentStatus;
    ///< 全局变量:本应用程序的当前状态,缺省为cfsWorking,即工作中

    static bool EnableGetRoundValue;
    ///< 全局变量:取整标志(为真时:如果小数与其最近的整数之间误差小于e, 则取整),缺省为false,即精确化处理
    static bool EnableLocateObjectInForm;
    ///< 全局变量:允许在窗口中定位对象标志,缺省为真
    static bool EnableWaitForDelay;
    ///< 全局变量:允许等待,该标志为假时,将忽略系统的等待函数,主要用于编译过程中对等待函数的处理。缺省为真,即进行等待
    static bool EnableWaitNextSimulateStep;
    ///< 全局变量:允许等待仿真分析下一步骤事件
    static bool EnableComulsoryDebug;
    ///< 全局变量:强制调试标志,如果该标志为真,则将输出所有调试信息。该标志缺省为false,如果文件C:\ForceDebug.txt存在,则该标志为真
    static bool EnablePromptMessage;
    ///< 全局变量:允许弹出提示框的标志
    static bool EnableLogElapseInfo;
    ///< 全局变量: 允许代码段记录耗时量,缺省为false,即不记录

    static bool IsApplicationAtTopest;
    ///< 全局变量:当前应用为激活状态,即为Windows系统的最前端应用

    static AnsiString StartPageFileName;
    ///< 全局变量:起始页面文件名称,缺省为空,可由配置文件进行配置
    static AnsiString HelpFileName;
    ///< 全局变量:帮助文件名称,缺省为FutureGraph.chm

    static HANDLE hNextSimulateStepEvent;
    ///< 全局变量:等待仿真分析下一步骤事件,暂未用
    static TObject * GetHelpInfoObject;
    ///< 全局变量:待取得帮助的对象
    static bool EnableRestoreFocusedHandle;
    ///< 全局变量:定位后允许重回定位前窗口句柄焦点,缺省为false
    // static TAppExceptionHandler * AppExceptionHandler;
    ///< 全局变量:应用异常处理句柄
    static int FunctionCallLever;
    ///< 全局变量:函数调用级数,缺省为-1
    static AnsiString UserName;
    ///< 全局变量:用户姓名,用于提示,缺省为ArWen
    static AnsiString ApplicationName;
    ///< 全局变量:应用名称,用于提示,缺省为 非常图形FutureGraph
    static int DisplayDecimalNumber;
    ///< 全局变量:显示小数时,最多显示其小数点后的数字位数
    /** @} 全局可变变量 */

    /** @name 全局常量
    * @{
    */
    static const bool DO_NOT_DELETE_OBJECT;
    ///< 全局常量:不用删除对象,该值固定为false
    static const bool HIDDEN_DIRECTORY;
    ///< 全局常量:隐藏目录,该值固定为true
    static const bool PROMPT_INFO;
    ///< 全局常量:进行消息提示,该值固定为true
    static const double LITTLE_AMOUNT;
    ///< 全局常量:可忽略的小量,e,该值固定为1e-6
    static const double PI;
    ///< 全局常量:数学圆周率PI
    static const int INVALID_TAG_VALUE;
    ///< 非正常的TAG值(被测对象为空或无TAG属性)
    static const int PROGRESS_INVISIBLE;
    ///< 全局常量:进度条不可见
    static const TFloatPoint DEFAULT_FLOAT_POINT;
    ///< 全局变量:缺省浮点值,为 (-100, -100)
    static const bool TTL_HIGH;
    ///< 全局变量:TTL高值,即真值
    static const bool TTL_LOW;
    ///< 全局变量:TTL低值,即假值
    static const AnsiString AUTHOR_NAME;
    ///< 全局变量:作者姓名,用于版权声明,缺省为BinWen CHEN
    static const AnsiString CONFIG_FILE_NAME;
    ///< 全局变量:配置文件名称,缺省为 cbw.graph.cfg
    static const int COLOR_NUMBER;
    ///< 全局变量:可命名颜色数目
    static const TColor FREQUENCE_USED_COLORS[];
    ///< 全局变量:可命名颜色各值
    static const AnsiString FREQUENCE_USED_COLOR_STRINGS[];
    ///< 全局变量:可命名颜色对应的字符串
    static const int CHART_SET_NUMBER;
    ///< 全局变量:字符集数目
    static const int CHAR_SETS[];
    ///< 全局变量:字符集集合
    static const AnsiString CHAR_SET_STRINGS[];
    ///< 全局变量:字符集对应名称
    static const int COMBOBOX_COLOR;
    ///< 全局变量:下拉框颜色处理
    static const int CBW_COMBOBOX_DASH;
    ///< 全局变量:下拉框虚线样式处理
    static const int COMBOBOX_LINETYPE;
    ///< 全局变量:下拉框线类型处理
    static const int COMBOBOX_CAPSTYLE;
    ///< 全局变量:下拉框线端格式处理
    static const int COMBOBOX_CAPSIZE;
    ///< 全局变量:下拉框线端尺寸处理
    static const int COMBOBOX_BRUSHSTYLE;
    ///< 全局变量:下拉框画刷样式处理
    static const int LISTBOX_DELETE_KEYDOWN;
    ///< 全局变量:列表框删除键处理
    /** @} 全局常量 */
    };

    不知是哪位仙人说过:理想很丰满,现实很骨感。TMD太对了。

    代码写成这样后,确实也爽了一段时间,感觉自己的编程水平提高了不少,效率也高。谁说程序员一天只能编几十行代码,我一天可以整理上千行代码。

    一直爽ing,直到刚才

    我判断一个值是否为某个常量,如LISTBOX_DELETE_KEYDOWN

    代码写成这样,神仙都说没错:

    void __fastcall THelper::ATFormatOnListBox(TListBox * listBox, int type)
    {
        switch(type) {
            case TGlobalVariable::LISTBOX_DELETE_KEYDOWN:
                   ...
                   break;
            default:
                   break;
        }
    }
    

    编译居然说错:

    [BCC32 Error]HelperObjects.cpp(176): E2313 Constant expression required.

    傻眼了,我在类外声明实现后,编译OK。

    幸亏是在虚拟机里安装的CB XE2,在主机里还有CB6,回到CB6下测试一下,居然通过了。

    唉,一声叹息。

    用还是不用,这是个问题。

    还是接着用吧,至多不在switch语句中判断全局常量了,我改用if...else...总可以了吧。

    if(TGlobalVariable::LISTBOX_DELETE_KEYDOWN == type)

    ...

    能通过上面这两句代码看得出我是编程资深人士的,他确实是高手。

    基本可以确定是embarcadero的一个小BUG。

    今年情人节略过,Arwen留此存念。

  • 相关阅读:
    [栈]
    [数据结构实验]学生成绩管理
    [数据结构实验]集合交并
    shapefile 转 geojson 文件类型
    ubuntu sublime text key
    opengl
    c++
    sublime text3 key
    ubuntu安装nvidia驱动
    全球国家svg边界svg
  • 原文地址:https://www.cnblogs.com/drgraph/p/2351897.html
Copyright © 2020-2023  润新知