===== 界定应用数据集 ===== XT框架以数据为中心来驱动应用,XT框架用应用文档[[class:application:xdocument|XDocument]]来管理各种数据,从XDocument继承实现新的文档类即可界定应用数据集。 应用数据集即应用文档所管理的数据类型,基于应用数据集就可构建一个应用空间,为了与其他的应用空间区分,每个应用空间被赋予唯一的字符串标识(长度小于64个字符)。所有的应用功能都在这个应用空间里完成,应用功能的交互以及工作流程的设定通过图形界面完成,在这个意义上,图形界面只是附属于应用文档的一层外壳,因此XT框架将与文档配套的图形界面也通过XDocument统一注册(registerUIProxy)。 XDocument提供了统一的接口用来: - 添加数据管理器([[class:application:xdocument#insertitemmanager|insertItemManager]]) - 访问数据管理器([[class:application:xdocument#getitemmanager|getItemManager]]) - 访问数据对象([[class:application:xdocument#getitem|getItem]]) - 构建更新数据对象树([[class:application:xdocument#buildobjecttree|buildObjectTree]]) - 构建更新数据的视图([[class:application:xdocument#createviewdata|createViewData]]) - 文件IO([[class:application:xdocument#load|load]]和[[class:application:xdocument#save|save]]) 在使用应用文档之前,必须首先对应用空间标识注册,将应用文档的构造函数与析构函数与字符串标识绑定,并返回一个整形值: TypeID RegisterTestDocument() { static int i = XDocument::registerDocument("Test", CreateTestDocument, DestroyTestDocument); return i; } 这个整形值将在注册应用功能时帮助构建功能的索引。 在应用文档的构造函数里,指定文档的GUID、应用程序服务提供商的名称、应用文档的版本号以及日志文件的路径。日志文件默认是存放在%TEMP%/XT下对应的目录中。 TestDocument::TestDocument() :XDocument() { sprintf(m_strGUID, "E42074FC-5D3A-4656-BFF2-431D4760620F"); setVender("Test Co. LTD"); setVersion(1, 0, 0, 1); setLogFile("test.log"); } 对应用数据的指定在初始化应用文档时通过调用insertItemManager完成。此外,应用文档的一些全局性设置也在初始化时设定。 void TestDocument::init() { XDocument::init(); XPreference::getInstance()->setVariable(_RENDER_BACKGROUND_TOP_COLOR, "250,250,250", "ui"); XPreference::getInstance()->setVariable(_RENDER_BACKGROUND_BOTTOM_COLOR, "250,250,250", "ui"); insertItemManager(new AnalysisManager(NULL)); insertItemManager(new TestManager(0)); insertItemManager(new PropertyManager(0)); // m_strDocPath[0] = 0; m_strDocName[0] = 0; m_pTree->clear(); setName("Untitled"); m_pTree->setRoot("TestDocument", this, Domain_Document); buildObjectTree(); setModified(false); } 根据文档所包含的应用数据来构造应用文档的对象树,通过重新实现buildObjectTree接口完成。 void TestDocument::buildObjectTree() { m_pTree->clear(); m_pTree->setRoot("TdasDocument", this, Domain_Document); updateDomainTree(getItemManager(Domain_Property), "部件属性", Domain_Property); updateDomainTree(getItemManager(Domain_Analysis), "分析", Domain_Analysis); }