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

原创 2003年01月29日 14:06:00
 

//续二<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

void __fastcall TDBTreeView::FillChildTreeNodes(int ParentID, TTreeNode* Node, bool Nest)

{//用指定值填充子节点

    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();//清空原SQL语句

 

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

    strSql += FParentIDField + "=:PID";

 

    AQuery->SQL->Add(strSql);//指定新的SQL语句

    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;//设置节点位图与选中时位图

        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);

 

        if (Nest) FillChildTreeNodes(iID, TreeNode);//如果指定参数Nesttrue,则递归调用以填充所有子节点

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

    }

 

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

 

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

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

}

void __fastcall TDBTreeView::AddDataToNode(TTreeNode* Node, TDBTreeNodeData& Data)

{//追加数据到节点

    TDBTreeNodeData* pData = new TDBTreeNodeData;

    *pData = Data;

    Node->Data = pData;

}

//---------------------------------------------------------------------------

TDBTreeNodeData __fastcall TDBTreeView::GetNodeData(TTreeNode* Node)

{//取得指定节点的数据

    return *(TDBTreeNodeData*)(Node->Data);

}

//---------------------------------------------------------------------------

void __fastcall TDBTreeView::Loaded(void)

{//调用原Load方法

    TCustomTreeView::Loaded();

    /* TODO : Loaded */

}

//---------------------------------------------------------------------------

void __fastcall TDBTreeView::Notification(Classes::TComponent* AComponent, Classes::TOperation Operation)

{

 //事件响应

 TCustomTreeView::Notification(AComponent, Operation);//调用原方法

  if ((Operation == opRemove) && (FDataLink != NULL) && (AComponent == DataSource))//如果操作为opRemove以及数据连接不为空且指定组件为数据源,则

      DataSource = NULL;//使数据源为空

}

//---------------------------------------------------------------------------

void __fastcall TDBTreeView::Edit(const tagTVITEMA &Item)

{//编辑节点

    TCustomTreeView::Edit(Item);//调用原方法

 

    if (FAllowModifyDB)//如果允许修改,则

    {

        TTreeNode* Node;

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

        AnsiString TableName = ((TTable*)(FDataLink->DataSource->DataSet))->TableName;

        TDBTreeNodeData NodeData;

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

        AnsiString strSql;

 

        if ((Item.state & TVIF_PARAM) != 0) Node = (TTreeNode*)(Item.lParam);

        else Node = Items->GetNode(Item.hItem);

 

        NodeData = GetNodeData(Node);

        strSql = "UPDATE " + TableName + " SET " + FDisplayField + " =:NewDispText WHERE " + FPrimaryIDField + "=:ID";//用指定条件更新数据集

 

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

        AQuery->DatabaseName = DatabaseName;//设置数据库连接

        AQuery->SQL->Clear();//清空原SQL语句

        AQuery->SQL->Add(strSql);//追加SQL语句

        AQuery->ParamByName("NewDispText")->AsString = Node->Text;//SQL中的参数进行赋值

        AQuery->ParamByName("ID")->AsInteger = NodeData.ID;

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

 

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

    }

}

//---------------------------------------------------------------------------

void __fastcall TDBTreeView::Expand(TTreeNode* Node)

{//展开指定节点

    TCustomTreeView::Expand(Node);//调用原原方法

 

    TDBTreeNodeData NodeData;

    TTreeNode* ANode;

 

    for (ANode = Node->getFirstChild(); ANode; ANode = Node->GetNextChild(ANode))//遍历指定节点的子节点

    {

        NodeData = GetNodeData(ANode);//取得节点数据

        if (ANode->Count == 0)//如果节点数据为0,则填充其子节点

          FillChildTreeNodes(NodeData.ID, ANode);

    }

}

//---------------------------------------------------------------------------

void __fastcall TDBTreeView::KeyDown(Word &Key, Classes::TShiftState Shift)

{

   //键盘处理

   TWinControl::KeyDown(Key, Shift);//调用原键盘处理方法

 

    if (Key == VK_F2 && Shift == TShiftState())//如果是Shift+F2

    {

        /* Handle 'F2' key */

        if (this->Selected != NULL)//编辑当前选中的节点

            this->Selected->EditText();

    }

}

//---------------------------------------------------------------------------

void __fastcall TDBTreeView::Change(TTreeNode* Node)

{//处理节点发生变化事件

TCustomTreeView::Change(Node);//调用原方法

    static TTreeNode* OldNode = NULL;

    TTreeNode* SelectedNode = this->Selected;//取得已选节点指针

    TDBTreeNodeData NodeData;

    TTable *ATable = (TTable*)(FDataLink->DataSource->DataSet);//指定数据集

 

    if (OldNode == SelectedNode) return;//如果旧节点等于选中的节点则直接返回

    if (ATable == NULL) return;//如果数据集为空则直接返回

    if (SelectedNode == NULL) return;//如果没有已选节点则直接返回

    NodeData = GetNodeData(SelectedNode);//取得指定节点数据

    ATable->SetKey();//按指定条件查找数据记录

    ATable->FieldByName(FPrimaryIDField)->AsInteger = NodeData.ID;

    ATable->GotoKey();

    OldNode = SelectedNode;//旧节点等于现在已选节点

}

//---------------------------------------------------------------------------

bool __fastcall TDBTreeView::CustomDrawItem(TTreeNode* Node, TCustomDrawState State, TCustomDrawStage Stage, bool &PaintImages)

{

  //自绘节点

    bool Result;//调用原自绘方法

    Result = TCustomTreeView::CustomDrawItem(Node, State, Stage, PaintImages);

 

    /* TODO : ... */

    //TDBTreeNodeData NodeData = GetNodeData(Node);

    return Result;

}

//---------------------------------------------------------------------------

void __fastcall TDBTreeView::FullExpand(void)

{//展开所有节点

    if (!Active)//如果DBTreeView不是活动状态,则抛出一个异常

        throw Exception("DBTreeView is Inactive.");

    this->Items->BeginUpdate();//开始更新DBTreeView

    ClearAllNodes();//清空所有节点

    FillChildTreeNodes(0, NULL, true);//填充子节点

    this->Items->EndUpdate();//结束更新

    TCustomTreeView::FullExpand();//调用原方法实现展开所有节点

}

 

//---------------------------------------------------------------------------

void __fastcall TFieldNameProperty::GetValues(Classes::TGetStrProc Proc)

{//取得字段值

    int i;

    TDBTreeView* ADBTreeView;

 

    ADBTreeView = (TDBTreeView*)GetComponent(0);

    if (ADBTreeView->DataSource != NULL)//如果DBTreeView的数据源不为空,则

    {//遍历所有字段,并将其填充到相关字段属性中

        for (i = 0; i < ADBTreeView->DataSource->DataSet->FieldCount; i ++)

            Proc(ADBTreeView->DataSource->DataSet->Fields->Fields[i]->FieldName);

    }

    else

    {//否则抛出异常

        throw Exception("Missing DataSource property.");

    }

}

TTypeInfo* AnsiStringTypeInfo(void)

{

    //定义类型信息

TTypeInfo* TypeInfo = new TTypeInfo;

    TypeInfo->Name = "AnsiString";

    TypeInfo->Kind = tkLString;

    return TypeInfo;

}

《未完,见一篇DBTreeView开发总结》

c++builder memo控件与listbox控件 加入 背景图片 c语言 关键字变色 自绘滚动条

  • 2010年09月19日 15:53
  • 461KB
  • 下载

C++Builder文字处理控件TRichView

TRichView 是一套支持Delphi/C++Builder的控件,有和Word相似的功能,主要用于编辑、显示和打印超文本文档。该控件支持各种各样不同的属性(字体、下标和上标,自定义下拉列表,文本...
  • u014542704
  • u014542704
  • 2014年04月22日 12:03
  • 650

C++builder自绘控件框架

#ifndef __switch1__ #define __switch1__ #include "gdi.h" //自定义GDI+函数库 class TSwitchButton : public...
  • chinayu2007
  • chinayu2007
  • 2015年09月06日 15:28
  • 1032

常用的BCB 函数

文件: ActnList  CreateAction 函数 创建一个指定类型的Action,显示在action list editor中。  EnumRegisteredAction 过程 枚举已...
  • binnygoal
  • binnygoal
  • 2016年09月08日 16:17
  • 1323

C++ Builder2006控件的安装方法

  C++ Builder2006控件的安装方法 作者: 来源: 阅读 543 人次 , 2006-4-29 10:13:00   一、安装步骤:  1、拿到源码,要全部源码,不要那种只有部分源码的...
  • MEFULEU
  • MEFULEU
  • 2007年04月12日 20:02
  • 1124

C++ builder 工业控制的第一步

开天辟地第一章,还没有毕业,到公司工作,在车间有一些自动化的设备,有三种,一种是MFC编程的程序,一种Builder还有一种LabView  这三种自动化的设备,不用说,肯定是从C++的入手,MF...
  • cccandccc
  • cccandccc
  • 2015年05月13日 11:29
  • 790

c/c++成长之捷径

c++成长之路不再迷茫!           不知不觉中进入计算机行业已有多个年头了,回首往事依然历历在目。今天我把我这段时间收集的书籍资料以及实例源码帖出来(部分资料太大了放不上去,理解下),...
  • Baoge_leopard
  • Baoge_leopard
  • 2014年10月15日 21:03
  • 2771

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

 C++Builder 高手进阶  nxyc_twz@163.com 前段时间买了本书《C++ Builder深度历险》,暂且不论这本书写的如何,但其作者独特的写作角度令我折服。于是我就有了个想法,能...
  • nxyc_twz
  • nxyc_twz
  • 2003年01月29日 13:58
  • 1482

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

 用BCB设计DBTreeView组件小结续二的最后一个函数,你是不是感到很纳闷:这个函数到底是用来干什么的呢?下面听我慢慢道来:我使用这个函数主要是用来实现定制属性编辑器。细心的读者一定还记得,我设...
  • nxyc_twz
  • nxyc_twz
  • 2003年01月29日 13:57
  • 1343

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

 //DBTreeView详细设计.CPP文件__fastcall TDBTreeView::TDBTreeView(TComponent* Owner)    : TTreeView(Owner){...
  • nxyc_twz
  • nxyc_twz
  • 2003年01月29日 13:58
  • 1568
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ Builder高手进阶 (三)用BCB设计DBTreeView组件(续二)
举报原因:
原因补充:

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