总所周知,常量必须要在申明的时候初始化。如下:const DAT_IOL_IO_TAG = 10但是问题是,在我们的项目中,存在数百个这样的常量。而这些常量的数值经常发生变化。于是我们的解决方案是将这些常量值记录在.ini的文件中。常量改为变量,在程序初始化的时候赋值。'in the public module
public DAT_IOL_IO_TAG as integer
'in initialize module 
DAT_IOL_IO_TAG = getFromINI("COLDATA","DAT_IOL_IO_TAG",0,"DCES.ini")
DAT_IOL_IO_TYPE = getFromINI("COLDATA","DAT_IOL_IO_TYPE",0,"DCES.ini")
DAT_PTL_PT_TAG = getFromINI("COLDATA","DAT_PTL_PT_TAG",0,"DCES.ini")
DAT_PTL_PT_PWUI = getFromINI("COLDATA","DAT_PTL_PT_PWUI",0,"DCES.ini")
DAT_EI_I_PWUI = getFromINI("COLDATA","DAT_EI_I_PWUI",0,"DCES.ini")
.....[code=INIFile]
[COLDATA]
DAT_IOL_IO_TAG = 19
DAT_IOL_IO_TYPE = 31
DAT_PTL_PT_TAG = 21
DAT_PTL_PT_PWUI = 1
DAT_EI_I_PWUI = 1
[/code]这种解决方案虽然解决了常量值经常变化的问题,但是产生了很多极难维护的代码。
在模块initialize里。有300个常量就有300条语句。
我觉得,常量的名字和ini文件中的字段名是一致的,所以能不能有这样的语句用一个循环把所有的常量都初始化了?foreach constVar in ALLConst
    constVar = getFromINI("COLDATA",constVar.name,0,"DCES.ini")
next constVar
 

解决方案 »

  1.   

    您可以把它放到dictionary中,用的时候根据名称就可以找到值了.
    还可以选择加一个Property Get防止修改(只读属性).或者再加一个dictionary保留程序中名称/ini文件中名称的对应关系映射.实现方式:
    读取的时候将名称与对应的值通过关系映射读入到dictionary中,可以用for循环来实现,呵呵.方式1(直接使用字符串,此种方式可以减少代码量):
    property get Properties(byval name as string) as long
       if dict.exists(name) then
           Properties = dict(name)
       else
           debug.assert false
       end if
    end property方式2:
    property get DAT_IOL_IO_TAG() as long
       DAT_IOL_IO_TAG = dict("DAT_IOL_IO_TAG")
    end property:-)
      

  2.   

    是用 GetPrivateProfileString() 读 INI 的吧,只要第二个参数 lpKeyName 用 vbNullString,就可以得到所有的 Key。
    public g_Consts as collection'初始化
    dim s as string, a() as string, i as long
    set g_Consts as new collection
    s = Trim$(getFromINI("COLDATA",vbNullString,vbNullString,"DCES.ini"))
    a = split(s," ")
    for i=0 to ubound(a)
        s = getFromINI("COLDATA",a(i),0,"DCES.ini")
        g_Consts.Add CLng(s), a(i)
    next'使用
    debug.print g_Consts("DAT_IOL_IO_TAG")
    debug.print g_Consts("DAT_IOL_IO_TYPE")