※……※……※……※……※ 请问这样的数据结构如何设计比较好 ※……※……※……※……※
我的程序中有一些自定义的控件,每个控件对应相应的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再以链表存储?
请大侠指点迷津,谢谢!
问题点数:0、回复次数:19Top
1 楼popyyb(subreina)回复于 2003-12-03 11:16:49 得分 0
upTop
2 楼cajon(峡谷泥)回复于 2003-12-03 11:25:32 得分 0
class CItem
{
public:
CString m_Name;
CString m_Value;
}
class CProperty
{
public:
CList<CItem> m_Items;
}
class MyIni
{
public:
CList<CProperty> m_Property;
}
这似乎有点太简单了,但是,从你的问题看来,似乎没看到还有什么需要优化的地方,简单写一点,继续讨论吧!Top
3 楼nuaawenlin(飘人)回复于 2003-12-03 11:25:39 得分 0
大可不必
你可以对每一个字段的长度也进行ini存储。
比如对PROPERTY_0字段
可以存储字段数为5
[PROPERTY_0Count]
nCount=5
每次先读字段数,然后再进行循环读出即可Top
4 楼spotboy(小光头)回复于 2003-12-03 11:31:14 得分 0
我建议不使用ini进行存储,可以放到一个MDB的文件之中Top
5 楼popyyb(subreina)回复于 2003-12-03 11:47:02 得分 0
upTop
6 楼timepalette(时间调色板)回复于 2003-12-03 11:48:19 得分 0
实现一个类。应用层重载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,找到后拷贝值
}Top
7 楼popyyb(subreina)回复于 2003-12-03 18:27:24 得分 0
再次请问,如果想把控件信息与属性栏联系起来,应该如何设计比较好?
我做的相当与Delphi那样的属性栏,用于新建控件在form中画出后,该控件所有的属性都显示在属性框中,但是:
当我修改了属性框中的某个属性后,控件如何知道是改动了那个属性? 我是有一根指针ptr志向当前所编辑的控件, 谢谢各位, 分数不够,另外再开!Top
8 楼popyyb(subreina)回复于 2003-12-03 21:07:16 得分 0
upTop
9 楼popyyb(subreina)回复于 2003-12-03 23:35:42 得分 0
upTop
10 楼lukaizhi(上当了)回复于 2003-12-04 00:09:44 得分 0
upTop
11 楼fuxf(布衣)回复于 2003-12-04 00:21:53 得分 0
用链表或向量来处理Top
12 楼popyyb(subreina)回复于 2003-12-04 09:21:05 得分 0
upTop
13 楼popyyb(subreina)回复于 2003-12-04 09:23:15 得分 0
能具体点吗?Top
14 楼guanjinke(纶巾客 blog:www.guanjinke.com)回复于 2003-12-04 09:44:10 得分 0
你可以为控件属性定一一个结构体,然后用标准模板库的Map映射。例如:
typedef _yourProperty
{
CString strName;
CString strType;
.............
} ControlPro;
#include <map>
定义映射:
std::map<CString ,ControlPro> m_ctlProperties;
读入的时候
m_ctlProperties[控件名]=控件属性结构体;
使用某个控件的时候:
m_ctlProperties[控件名].strName;
Top
15 楼popyyb(subreina)回复于 2003-12-04 17:40:22 得分 0
楼上的大侠,你还是无法联系控件与属性栏啊,比如我在属性栏上改变了控件的title,在控件类中有一个属性m_title与之对应,则如何在改变title后,设置ptr->m_title?我费解的地方就在这里,各位大侠,多指点!Top
16 楼popyyb(subreina)回复于 2003-12-04 21:12:36 得分 0
upTop
17 楼popyyb(subreina)回复于 2003-12-05 09:19:06 得分 0
upTop
18 楼guanjinke(纶巾客 blog:www.guanjinke.com)回复于 2003-12-08 11:55:18 得分 0
如果你想作一个可以动态生成界面的应用程序。我觉得如果用MFC做是很辛苦的,你可以转换一个角度,使用MFC加ATL来做会很方便的。如果你的动态生成的控件不是很多的话。建议你自己重新用ATL来做一些ActiveX控件。因为控件本身就支持属性页,当你编辑界面时,可以使用OLE的InPlace,也就是在位激活,把界面编辑好放到INI文本里,或者是XML文件里,因为ActiveX控件可以有Persistent(可持续性),容器可以将你的控件属性保存起来。当你改动属性时,可以控件可以触发事件改变控件的属性。当你动态创建MFC控件时,你必须提前将控件的事件都准备,这是比较麻烦的一点。但是ActiveX控件,你可以通过Connection Point来为他创建事件。如果使用ActiveX控件的话,你还应该为你的ActiveX控件创见一个容器,你可以使用CAxWindow模板类来创建。这样下来,你的动态生成效果就差不多可以实现了。Top
19 楼yl0002(yl)回复于 2003-12-08 12:41:27 得分 0
uuuupTop




