Serializing to / from a text file


To serialize the tree view control override the Serialize() function. The Serialize() function is a virtual function defined in Cobject.

In the code below we save the outline to a text file and can read it back from a text file. When saving the outline to the archive, tabs are used to indent the item text. Again, when reading back, tabs are used to determine the level that the newly read item should be placed at.
 

void CTreeCtrlX::Serialize(CArchive& ar) 
{
	if (ar.IsStoring())
	{	
		// storing code
		HTREEITEM hti = GetRootItem();
		while( hti )
		{
			int indent = GetIndentLevel( hti );
			while( indent-- )
				ar.WriteString( "\t" );
			ar.WriteString( GetItemText( hti ) + "\r\n");
			hti = GetNextItem( hti );
		}
		
	}
	else
	{	
		// loading code
		CString sLine;
		if( !ar.ReadString( sLine ) )
			return;

		HTREEITEM hti = NULL;
		int indent, baseindent = 0;
		while( sLine[baseindent] == '\t' )
			baseindent++;
		do
		{
			if( sLine.GetLength() == 0 )
				continue;
			for( indent = 0; sLine[indent] == '\t'; indent++ )
				;		// We don't need a body
			sLine = sLine.Right( sLine.GetLength() - indent );
			indent -= baseindent;

			HTREEITEM parent;
			int previndent = GetIndentLevel( hti );
			if( indent ==  previndent)
				parent = GetParentItem( hti );
			else if( indent > previndent )
				parent = hti;
			else
			{
				int nLevelsUp = previndent - indent;
				parent = GetParentItem( hti );
				while( nLevelsUp-- )
					parent = GetParentItem( parent );
			}
			hti = InsertItem( sLine, parent ? parent : TVI_ROOT, TVI_LAST );
		}while( ar.ReadString( sLine ) );

	}
}



int CTreeCtrlX::GetIndentLevel( HTREEITEM hItem )
{
	int iIndent = 0;

	while( (hItem = GetParentItem( hItem )) != NULL )
		iIndent++;
	return iIndent;
}


// GetNextItem	- Get next item as if outline was completely expanded
// Returns		- The item immediately below the reference item
// hItem		- The reference item
HTREEITEM CTreeCtrlX::GetNextItem( HTREEITEM hItem )
{
	HTREEITEM	hti;

	if( ItemHasChildren( hItem ) )
		return GetChildItem( hItem );		// return first child
	else{
		// return next sibling item
		// Go up the tree to find a parent's sibling if needed.
		while( (hti = GetNextSiblingItem( hItem )) == NULL ){
			if( (hItem = GetParentItem( hItem ) ) == NULL )
				return NULL;
		}
	}
	return hti;
}

 



Comments

Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Temporary network outages -- even those lasting just a few minutes -- can cripple organizations that rely on local Internet access at remote locations. Failover systems that automatically switch to 4G LTE cellular when landlines go down let organizations maximize uptime, even when the unexpected happens. Read this white paper to learn how 4G failover systems that use standalone gateways supported by a cloud-based management tool are proving to be a solid choice for improved business continuity and productivity …

  • Traditional approaches to application modernization, either manual rewrite or auto-migration tools, have been proven time and again as inefficient. Rewrite needs scarce dev skills, is slow, risky and costly; auto-migration is what Verccio Dale of Gartner defines as "a pig with a lipstick, is still a pig." Are there alternatives? Find out, download this short practical guide now!

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date