unittree.cpp

来自「课程设计的简单Access学生数据库系统」· C++ 代码 · 共 182 行

CPP
182
字号
// UnitTree.cpp: implementation of the UnitTree class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "SM.h"
#include "Unit.h"
#include "UnitTree.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

//##ModelId=40A481F0015C
UnitTree::UnitTree(CTreeCtrl * pTreeCtrl):pTree(pTreeCtrl)
{
	pUnitTable = new CDaoTableDef(&theDatabase);
	pUnitTable->Open(_T("unit"));
	pUnitRS = new CDaoRecordset();
	pUnitRS->Open(pUnitTable);
	ImageList.Create(16, 16, ILC_COLOR24 | ILC_MASK, 6, 4);
	ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON3));
	ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON3));
	ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON1));
	pTree->SetImageList(&ImageList, TVSIL_NORMAL);
}

//##ModelId=40A481F00167
UnitTree::~UnitTree()
{
	pUnitRS->Close();
	pUnitTable->Close();
	delete pUnitRS;
	delete pUnitTable;
}

//##ModelId=40A481F000DB
bool UnitTree::Load()
{
	Clear();
	LoadAll(1, TVI_ROOT);
	this->SetSelectUnit(1);
	return true;
}

//##ModelId=40A481F0008D
void UnitTree::LoadAll(int ID, HTREEITEM parent)
{
	COleVariant var;
	var.ChangeType(VT_I4);
	var.lVal = (long)ID;

	pUnitRS->SetCurrentIndex(_T("id"));	
	if(pUnitRS->Seek("=", &var))
	{
		CDaoVariant v_ID, v_name, v_superior;

		//插入当前树结点
		v_ID = pUnitRS->GetFieldValue("ID");
		v_name = pUnitRS->GetFieldValue("Unit");
		v_superior = pUnitRS->GetFieldValue("Superior_id");
		Units.push_back(Unit(v_ID.AsInt(), v_name.AsString(), v_superior.AsInt()));
		HTREEITEM item = pTree->InsertItem(v_name.AsString(), 1, 0, parent);
		Items.push_back(item);
		pTree->SetItemData(item, DWORD(Items.size()-1));

		//插入子结点
		pUnitRS->SetCurrentIndex(_T("Superior_id"));
		if(pUnitRS->Seek("=", &var))
		{
			vector<int> childs;
			int id, sid;
			do
			{
				id = pUnitRS->GetFieldValue("ID").lVal;
				sid = pUnitRS->GetFieldValue("Superior_id").lVal;
				if(sid == ID)
					childs.push_back(id);
				pUnitRS->MoveNext();
			}
			while(sid==ID && !pUnitRS->IsEOF());
			for(int i=0; i<childs.size(); i++)
				LoadAll(childs[i], item);
		}
		else
		{
			return;
		}
	}
	else
		return;
}

//##ModelId=40A481F00082
void UnitTree::Clear()
{
	pTree->DeleteAllItems();
	Units.clear();
	Items.clear();
}

//##ModelId=40A481F00080
Unit& UnitTree::GetSelcetUnit()
{
	HTREEITEM item = pTree->GetSelectedItem();
	ASSERT(item != NULL);
	if(item != NULL)
		return Units[pTree->GetItemData(item)];
	else
		return Units[0];//缺省返回
}

//##ModelId=40A481F0007D
bool UnitTree::SetSelectUnit(int ID)
{
	for(int i=0;i<Units.size();i++)
		if(Units[i].ID==ID)
			break;
	if(i==Units.size())
		return false;
	pTree->Select(Items[i], TVGN_FIRSTVISIBLE);
	pTree->SelectItem(Items[i]);
	return true;
}

//##ModelId=40A481F0006D
bool UnitTree::IsChild(int father_id, int child_id)
{
	if(father_id == child_id)
		return false;

	HTREEITEM father;
	HTREEITEM child;
	int flag =0, i;
	for(i=0;i<Units.size();i++)
	{
		if(Units[i].ID==father_id)
			father = Items[i], flag++;
		if(Units[i].ID==child_id)
			child = Items[i], flag++;
		if(flag==2)
			break;
	}
	if(i==Units.size())
		return false;

	HTREEITEM item = child;
	while((item=pTree->GetParentItem(item)))
		if(item==father)
			return true;
	return false;

}

//##ModelId=40A481F0005D
long UnitTree::GetParent(long ID)
{
	COleVariant var(ID);
	pUnitRS->SetCurrentIndex(_T("id"));	
	if(pUnitRS->Seek("=", &var))
		return pUnitRS->GetFieldValue("Superior_ID").lVal;
	return 0;
}

//##ModelId=40A481F00040
bool UnitTree::IsSelected()
{
	return pTree->GetSelectedItem()!=NULL;
}

//##ModelId=40A481F0003F
void UnitTree::ExpandRoot()
{
	pTree->Expand(pTree->GetRootItem(),TVE_EXPAND);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?