文档中心

控件开发_复杂数据模型和显示

02.复杂数据模型

TD图形软件系统提供的复杂数据模型本质上是一棵树,只有一个根节点,每个节点可以有任意多个子节点,子孙节点的深度无限制。每个节点都有一个字符串 ID来表示这个节点的类型(type),每个节点还有一个表(TTable)来容纳这个节点的多个属性(字符串 ID和表 TTable详见《3.TD开发平台_基础》)。树状的节点关系可以涵盖大部分的复杂数据组织, 如目录树等。表(TTable)是一个复合数据容器,可以按需容纳多种类型的数据成员。

用 TwDataModel来表示这个数据模型,用 TwDataNode来表示数据节点,通过下面的函数来操作复杂数据模型:

TwDataModel * TwDMCreate(T_ID root_type)

创建一个数据模型,参

数是根节点的类型

void TwDMDestroy(TwDataModel *dm)

销毁一个数据模型

void TwDMLock(TwDataModel *dm)

数据模型上锁

void TwDMUnlock(TwDataModel *dm)

数据模型解锁

TwDataNode * TwDMGetRootNode(TwDataModel *dm)

得到根节点

TwDataNode * TwDMAddNode(TwDataNode *parent, T_ID

type)

增加一个节点,参数是

节点的类型

void TwDMDeleteNode(TwDataNode *node)

删除一个节点

TTable * TwDMGetNodeValue(TwDataNode *node, Tbool

create)

参数 create表示该节点没有值时, 是否创建一个空的 Table返回

得到节点的值 Table

void TwDMSetNodeValue(TwDataNode *node, TTable

*value)

设置节点的值,并改变

了节点的值

Tint TwDMGetChildNodeCount(TwDataNode *node)

得到子节点个数

TwDataNode * TwDMGetParentNode(TwDataNode *node)

得到父节点

TwDataNode

TwDMGetChildNode(TwDataNode*parent,Tbool first)

*

得到子节点

TwDataNode

TwDMGetSiblingNode(TwDataNode*node,Tbool next)

*

得到兄弟节点

TwDataNode * TwDMSeekNode(TwDataNode *root,

TwDataNode *node);

按照先根遍历的顺序得到 node的下一个节点,不能超过 root节点, root节点必须是 node的前辈,如果 node 为 NULL 就返回

root

遍历节点

当开发人员修改数据模型时(添加节点、删除节点、改变节点的值 Table),一定是先调用TwDMLock()先上锁,批量修改完后再调用 TwDMUnlock()解锁。

如创建一个目录下所有文件信息的数据模型:

struct dirent *dir_ent;
TwDataNode *root, *node;
TTable *value;
TwDataModel *dm = TwDMCreate(TStringID(“dir_tree”));
DIR *dir=opendir(dir);
root=TwDMGetRootNode(dm);
TwDMLock(dm);
while((dir_ent=readdir(dir)) != NULL)
{
    T_ID type;
    if(dir_ent->d_type == DT_DIR)
        type=TStringID(“dir”);
    else
        type=TStringID(“file”); //暂时忽略其他类型
    node=TwDMAddNode(dm, root, type);
    value=TwDMGetNodeValue(node, TRUE);
    /* 把该文件的名字加入到 Table中 */
    TTableAddString(TStringID(“name”), dir_ent->d_name);
    /*
    把该文件的其他信息(比如大小,修改时间等)添加到 Table中
    */
}
TwDMUnlock(dm);
closedir(dir1);

数据模型是一个 C语言封装的对象(见《3.TD开发平台_基础》),在TwDMUnlock()中解锁前会触发 TStringID(“commit”)事件。