void __fastcall TMainFrm::SaveExpandedNodes(TTreeView *ATree,
	std::map<AnsiString, Pointer>& g_TempList)
{
	TTreeNode *ANode;
	TTreeNode *ANextNode;
	TTreeNodes *ANodes;
	ANodes = ATree->Items;
	g_TempList.clear();
	Cardinal FlagVal = 0;
	bool Expaned1 = false;
	bool Selected1 = false;
	ANode = ANodes->GetFirstNode();
	while (ANode)
	{
		Expaned1 = ANode->Expanded;
		Selected1 = ANode->Selected;
		if (Expaned1 || Selected1)
		{
			FlagVal = Selected1 << 1;
			FlagVal = FlagVal | Expaned1;
			AnsiString S = ANode->Text;
			g_TempList[S] = Pointer(FlagVal);
		}
		ANextNode = ANode->getFirstChild();
		while (ANextNode)
		 {
			bool Expaned = ANextNode->Expanded;
			bool Selected = ANextNode->Selected;
			if (Expaned || Selected) {
				FlagVal = Selected << 1;
				FlagVal = FlagVal | Expaned;
				AnsiString S = ANode->Text + ANextNode->Text;
				g_TempList[S] = Pointer(FlagVal);
			}
			ANextNode = ANode->GetNextChild(ANextNode);
		}
		ANode = ANode->getNextSibling();
	}
}
void __fastcall TMainFrm::ExpandNodes(TTreeView *ATree, std::map<AnsiString,
	Pointer>& g_TempList)
{
	TTreeNodes *ANodes = ATree->Items;
	TTreeNode *ANode = ANodes->GetFirstNode();
	TTreeNode *ANextNode;
	AnsiString S;
	Pointer P;
	Cardinal FlagVal;
	bool   Expand, Selected;
	while (ANode)
	{
		S = ANode->Text;
		P = g_TempList[S];
		if (P != 0)
		{
			 FlagVal = Cardinal(P);
			 Expand = FlagVal & 1;
			 Selected = (FlagVal >> 1) & 1;
			if (Expand)
			{
				ANode->Expand(true);
			}
			if (Selected)
			{
				ANode->Selected = true;
			}
		}
		ANextNode = ANode->getFirstChild();
		while (ANextNode)
		{
			S = ANextNode->Text;
			P = g_TempList[ANode->Text + S];
			if (P != 0)
			{
				FlagVal = Cardinal(P);
				Expand = FlagVal & 1;
				Selected = (FlagVal >> 1) & 1;
				if (Expand)
				{
					ANextNode->Expand(true);
				}
				if (Selected)
				{
					ANextNode->Selected = true;
				}
			}
			ANextNode = ANode->GetNextChild(ANextNode);
		}
		ANode = ANode->getNextSibling();
	}
}
原文:http://www.cnblogs.com/liujicai/p/6903394.html