我的程序中有一些自定义的控件,每个控件对应相应的ini文件,在ini文件中存储该控件的基本属性和默认值。
我的想法是这样,在程序开始时,一次读入所有的ini文件,存到一个结构中,具体的ini如下:[PROPERTY]
PROPERTY_COUNT=2[PROPERTY_0]
ITEM_NAME=PROPERTY_TYPE,PROPERTY_TITLE,Operation_1,Operation_2
PROPERTY_TYPE=COMBOBOX
PROPERTY_TITLE=Wnd Style
Operation_1=GFX_WND_NO_TITLE_STYLE
Operation_2=GFX_WND_TITLE_TXT_STYLE
[PROPERTY_1]
ITEM_NAME=PROPERTY_TYPE,PROPERTY_TITLE,LINE_1,LINE_2
PROPERTY_TYPE=LIST
PROPERTY_TITLE=Wnd Style
LINE_1=GFX_WND_NO_TITLE_STYLE,0,text
LINE_2=GFX_WND_NO_TITLE_STYLE,1,text
LINE_3=GFX_WND_TITLE_TXT_STYLE,root,long每一项都存为String,但是具体的ini文件个数不定,而且如上所示一个ini文件中的每个属性的项长度也不定,请问有什么好的设计,我这样读到内存结构中,以后调用就不用再读文件了,比较快点。我想可能是这样吧:以ini文件作为节点,内部的item再以链表存储?请大侠指点迷津,谢谢!

解决方案 »

  1.   

    class CItem
    {
    public:
        CString m_Name;
        CString m_Value;
    }class CProperty
    {
    public:
        CList<CItem> m_Items;
    }class MyIni
    {
    public:
        CList<CProperty> m_Property;
    }这似乎有点太简单了,但是,从你的问题看来,似乎没看到还有什么需要优化的地方,简单写一点,继续讨论吧!
      

  2.   

    大可不必
    你可以对每一个字段的长度也进行ini存储。
    比如对PROPERTY_0字段
    可以存储字段数为5
    [PROPERTY_0Count]
       nCount=5
    每次先读字段数,然后再进行循环读出即可
      

  3.   

    我建议不使用ini进行存储,可以放到一个MDB的文件之中
      

  4.   

    实现一个类。应用层重载GetPrivateProfileXXXX。类只能产生一个实例。构造函数中初始化,读入配置文件所有内容。数据结构:struct key
    {
       CString strKey;
       CString strVal;
    }struct section
    {
       CString strSection;
       CPtrArray arrKeys; // 存key结构指针的数组
    }在类中定义
    private:
       CPtrArray m_arrSections;然后比如
    DWORD GetPrivateProfileString(
        LPCSTR lpAppName,
        LPCSTR lpKeyName,
        LPCSTR lpDefault,
        LPSTR lpReturnedString,
        DWORD nSize,
        LPCSTR lpFileName)
    {
       查找。section,找到后查找key,找到后拷贝值
    }
      

  5.   

    再次请问,如果想把控件信息与属性栏联系起来,应该如何设计比较好?我做的相当与Delphi那样的属性栏,用于新建控件在form中画出后,该控件所有的属性都显示在属性框中,但是:当我修改了属性框中的某个属性后,控件如何知道是改动了那个属性? 我是有一根指针ptr志向当前所编辑的控件, 谢谢各位, 分数不够,另外再开!
      

  6.   

    你可以为控件属性定一一个结构体,然后用标准模板库的Map映射。例如:
    typedef _yourProperty
    {
          CString strName;
          CString strType;
    .............
    } ControlPro;#include <map>定义映射:
    std::map<CString ,ControlPro> m_ctlProperties;
    读入的时候
    m_ctlProperties[控件名]=控件属性结构体;
    使用某个控件的时候:
    m_ctlProperties[控件名].strName;
      

  7.   

    楼上的大侠,你还是无法联系控件与属性栏啊,比如我在属性栏上改变了控件的title,在控件类中有一个属性m_title与之对应,则如何在改变title后,设置ptr->m_title?我费解的地方就在这里,各位大侠,多指点!
      

  8.   

    如果你想作一个可以动态生成界面的应用程序。我觉得如果用MFC做是很辛苦的,你可以转换一个角度,使用MFC加ATL来做会很方便的。如果你的动态生成的控件不是很多的话。建议你自己重新用ATL来做一些ActiveX控件。因为控件本身就支持属性页,当你编辑界面时,可以使用OLE的InPlace,也就是在位激活,把界面编辑好放到INI文本里,或者是XML文件里,因为ActiveX控件可以有Persistent(可持续性),容器可以将你的控件属性保存起来。当你改动属性时,可以控件可以触发事件改变控件的属性。当你动态创建MFC控件时,你必须提前将控件的事件都准备,这是比较麻烦的一点。但是ActiveX控件,你可以通过Connection Point来为他创建事件。如果使用ActiveX控件的话,你还应该为你的ActiveX控件创见一个容器,你可以使用CAxWindow模板类来创建。这样下来,你的动态生成效果就差不多可以实现了。