C++Builder高手进阶 (三)用BCB设计DBTreeView组件(续一)

原创 2003年01月29日 13:58:00
 

//DBTreeView详细设计.CPP文件<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

__fastcall TDBTreeView::TDBTreeView(TComponent* Owner)

    : TTreeView(Owner)

{

    //在构造函数中对相关数据进行初始化

FDataLink = new TFieldDataLink;  //建立数据连接类

    FParentIDField = "";    //将节点父标识设置为空

    FPrimaryIDField = "";  //将节点主标识设置为空

    FDisplayField = "";     //将显示字段设置为空

    FActive = false;        //设置为非活动状态

    FAllowModifyDB = false;  //设置数据集不允许修改

}

__fastcall TDBTreeView::~TDBTreeView()

{//在析构函数中释放构造函数分配的资源

    delete FDataLink; //释放数据连接类

}

void __fastcall TDBTreeView::SetActive(bool Value)

{

  //设置状态是否为活动

   if (FActive != Value)  //如果指定状态与当前状态一样,则不做处理,直接返回

    {//否则

        if (Value)//如果指定值为true

        {

            if (FDataLink->DataSource == NULL)//如果未指定数据源则抛出一个异常

                throw Exception("Missing DataSource property.");

            if (FDataLink->DataSource->DataSet == NULL)//否则,如果数据源中未指定数据集,也抛出一个异常

                throw Exception("Invalid DataSource.");

 

            if (FParentIDField == "")//如果父标识字段为空,抛出一个异常

                throw Exception("Missing ParentIDField property.");

            if (FPrimaryIDField == "")//如果主标识字段为空,抛出一个异常

                throw Exception("Missing PrimaryIDField property.");

            if (FDisplayField == "")//如果显示字段为空抛出一个异常

                throw Exception("Missing DisplayField property.");

           //补充说明:从以上几个异常您应该不难看出我们这个组件需要的环境:

          //必须指定数据源,数据集,节点父标识字段,主标识字段,显示字段

            ClearAllNodes();//删除原来所有节点

            FillTreeNodes(0, NULL);//填充所有数据到各节点

        }

        else

        {//如果指定值为false

            ClearAllNodes(); //删除所有节点

        }

        FActive = Value;  //将指定值赋给FActive

    }

}

void __fastcall TDBTreeView::SetDataSource(Db::TDataSource* Value)

{//设置数据源

    if (Value != FDataLink->DataSource)//如果指定值与当前值不一样,则

    {

        FDataLink->DataSource = Value;  //将数据源当前值设置为指定值

    }

}

TDataSource* __fastcall TDBTreeView::GetDataSource()

{//获取数据源

    return FDataLink->DataSource; //返回与数据源

}

void __fastcall TDBTreeView::ClearAllNodes()

{//删除所有节点,调用TreeView的相关方法进行遍历式节点删除

    for (int i=0; i<this->Items->Count; i++)

        delete (TDBTreeNodeData*)(Items->Item[i]->Data);

 

    this->Items->BeginUpdate();

    this->Items->Clear();

    this->Items->EndUpdate();

}

void __fastcall TDBTreeView::FillTreeNodes(int ParentID, TTreeNode* Node)

{//填充数据到节点

    TQuery* AQuery = new TQuery(this);//创建一个数据集控件

    AnsiString strSql, strText;

    int iID, iParentID;

    int iImageIndex, iSelectedIndex;

    TTreeNode* TreeNode;

    TDBTreeNodeData NodeData;

   //用指定条件打开相关数据表

    AQuery->DatabaseName = ((TTable*)(FDataLink->DataSource->DataSet))->DatabaseName;

    AQuery->Close();//关闭数据集

    AQuery->SQL->Clear();//清空原查询条件

 

    strSql = "SELECT * FROM " + ((TTable*)(FDataLink->DataSource->DataSet))->TableName + " WHERE ";

    strSql += FParentIDField + "=:PID";

 

    AQuery->SQL->Add(strSql);//指定新的查询条件

    AQuery->ParamByName("PID")->AsInteger = ParentID;//取得父标识字段内容

    AQuery->Open();//打开数据集

 

    this->Items->BeginUpdate();//准备更新DBTreeView显示

 

    while (!AQuery->Eof)//数据没有到数据集尾,则

    {

        strText = AQuery->FieldByName(FDisplayField)->AsString;//取得显示字段内容

        iID = AQuery->FieldByName(FPrimaryIDField)->AsInteger;//取得主标识字段内容

        iParentID = AQuery->FieldByName(FParentIDField)->AsInteger;//取得父标识字段内容

 

        TreeNode = this->Items->AddChild(Node, strText);//添加此子节点

        iImageIndex = iSelectedIndex = -1;//将节点位图与选中时位图设置为空(-1

        if (FOnSetImageIndex) FOnSetImageIndex(this, iID, iParentID, TreeNode->Level, iImageIndex, iSelectedIndex);//如果位图设置发生变化,则触发相关事件

        TreeNode->ImageIndex = iImageIndex;//设置节点位图及选中时的位图

        TreeNode->SelectedIndex = iSelectedIndex;

 

        NodeData.ID = iID;//设置节点标识及父标识

        NodeData.ParentID = iParentID;

        AddDataToNode(TreeNode, NodeData);//追加数据到指定节点

 

        FillChildTreeNodes(iID, TreeNode, false);//填充子节点

        AQuery->Next(); //移到下条记录

    }

 

    this->Items->EndUpdate(); //更新DBTreeView组件

 

    AQuery->Close(); //关闭数据集

    delete AQuery; //删除临时创建的数据集控件

}

《未完待续》

在C++Builder中安装odac组件

今天接手一个很久前开发的c++builder程序,要试运行,结果编译发现提示无法找到Ora.hpp文件,再细查发现系统中连接数据库多次调用了TOraSession,TOraQuery等类,经过查询,知...
  • mianli85
  • mianli85
  • 2014年03月28日 15:19
  • 479

c++ builder 子窗口长期前置

【Write by wood 小汤——http://blog.csdn.net/tbwood  转载请说明出处,写下来不容易】 要真正的理解和解决这个问题,确实不容易。当我花了好几天时间才搞明白...
  • shang2468
  • shang2468
  • 2013年11月22日 13:36
  • 1789

C++ Builder 的文件读写操作总结

这类函数完成对文件的读写相关的操作,这种类型的操作和C的基于I/O文件操作类似,下表列出这类操作常用的函数及其功能。   FileOpen() 打开文件   FileClose() 关闭文件  ...
  • C_S_D_N_USER
  • C_S_D_N_USER
  • 2014年09月02日 11:37
  • 3323

BCB(C++ Builder)创建动态库(DLL,接口导出和调用),动态加载DLL

以前没有封装dll动态库,接触新的工作之后需要用,折腾了一整天,终于搞定了。 毕竟是生手,就简单分析注意点和遇到的一些问题及解决方案: (1)首先准备要生成DLL的工程。 (1.1)我用的是BC...
  • lushangqiushui
  • lushangqiushui
  • 2014年04月03日 22:40
  • 824

JVM 菜鸟进阶高手之路三

笨神大大分享: 在微信小程序里面搜索:JVMPocket,这个小程序是笨神大大提供的,里面可以搜索相关JVM参数,用法。 -XX:MaxTenuringThreshold,这个参数主要是设置YGC的时...
  • lirenzuo
  • lirenzuo
  • 2017年07月22日 10:09
  • 1463

C++ Builder初学问与答

一直以来都想写一点为BCB初学者快速入门的东西,前不久写了几篇《闲谈BCB》想把自己学习BCB中如何来解决难点的方法说给大家,没想到被骂得不成样子。本想不写了,但觉得这些东西留下来能做什么呢?还是用另...
  • wozengcong
  • wozengcong
  • 2014年01月04日 16:44
  • 1493

C++Builder建立及调用DLL

C++Builder建立及调用DLL DLL简称动态链接库,是Windows中程序的重要组成部分。想象一下,一个程序需要多人共同完成开发,怎么个共同法?这时我们就要考虑把程 序分为好几个模块,团队...
  • qq_36096752
  • qq_36096752
  • 2016年11月28日 15:37
  • 1376

c++builder如何通过鼠标拖动改变无边框窗体的大小(bsnone)

转自http://www.ccrun.com/article.asp?i=990&d=70jx1b 在C++Builder中,将Form的BorderStyle设为bsNone以后该窗体将没有边框,...
  • lz465350
  • lz465350
  • 2014年11月06日 10:02
  • 1065

BCB中的输入对话框和输出对话框(也就是消息对话框)

刚出去转了一下, 吹吹风, 回来继续写。 我们现在来说BCB中的输出对话框, 这个很常见: //--------------------------------------------...
  • stpeace
  • stpeace
  • 2015年07月26日 14:35
  • 1954

BCB如何加载字符串资源文件(语言资源文件)?

如何在软件.exe中嵌入语言资源呢。常规的想法是, 将语言字符串放到一个文件中, 然后在程序中去读取。 然而这样做存在一个问题: 最后发布的.exe必须依赖于语言字符串文件, 比如lang.txt. ...
  • stpeace
  • stpeace
  • 2015年07月26日 12:45
  • 1548
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++Builder高手进阶 (三)用BCB设计DBTreeView组件(续一)
举报原因:
原因补充:

(最多只允许输入30个字)