• 其他语言



可移植和可重用 GUI 控件的设计
页面和feed选项
打印
收藏此页
Digg此页 | 添加到您的del.icio.us帐号
目录

数据加载
当处理大型数据集时,这些数据集通常存储在某个外部数据源中。外部数据源可能随着应用程序的不同而有所不同(文件、数据库等)。因此,您需要使用一种机制来独立地从外部数据源快速地加载数据。快速常常意味着加载部分数据,因为如果要真正地获得大型数据集,无论如何都不能快速地执行加载。但是,控件一般只需要数据中的一小部分来进行处理,您应当只加载这一部分数据。

有两种方法可用来实现部分加载。第一种类似于上面说明的快速绘图和事件处理。您需要定义一个界面,这个界面与数据源无关,可用来加载数据。您应当尝试实现以下方法,即可以用于定义需要加载的数据,而不是执行全部加载。然后可以定义应加载的数据元素,通过界面只针对这些元素调用加载函数。

不总是可以将元素定义为自动加载。另一种实现部分加载的方法是让用户输入。这种情况下,用户负责定义应何时加载数据,以及应加载哪些数据。

ChangesType PortNodeHandler::HandleClick(Node n, double inX, double inY, 
int kstate, idvc::MouseButton Button)
{
ChangesType processed = ctNone;
idvc::dpoint pos = n->GetPosition();
idvc::dsize size = n->GetSize();

// 如果节点没有嵌套的节点且使用鼠标左键对其单击
if ( (n->GetOwned()->GetCount() == 0) && (Button == idvc::mbLeft) )
    {
if (node_drawer.IsLeftPortClicked(n, inX, inY))
	 {
	     bool hide = ( CountAllParents(n) == CountVisibleParents(n) );
	     // 如果所有父节点可见
	     if( hide )   Fold(n, fdParents);
	     else       Unfold(n, fdParents);
	 }
else if (node_drawer.IsRightPortClicked(n, inX, inY))
	 {
	     bool hide = ( CountAllChildren(n) == CountVisibleChildren(n) );
	     // 如果所有子节点可见
	     if( hide ) Fold(n, fdChildren);
	     else     Unfold(n, fdChildren);
	 }
else
        {
// 如果用户单击节点本身,则会选中它
SetFlag(n, Node::fSelected, !IsFlagSet(n, Node::fSelected));
        };
processed = ctAll;
    };
OnClick.fire(n, inX, inY, kstate, Button);
return processed;
};
      
上一部分1  2  3  4  5  下一部分

第 5 页, 共 7 页