⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 express.cpp.svn-base

📁 股票软件源码
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:
		crText	=	AfxGetProfile().GetColor(CColorClass::clrText);
		break;
	case	SLH_RATIO_HOLDERRIGHT:			// 股东权益比率
	case	SLH_RATIO_LONGDEBT:				// 长期负债率
	case	SLH_RATIO_DEBT:					// 资产负债率
		crText	=	AfxGetProfile().GetColor(CColorClass::clrPlane);
		break;

		// ★投资收益能力
	case	SLH_NETASSET_PS:				// 每股净资产
	case	SLH_NETASSET_PS_REGULATE:		// 调整每股净资产
	case	SLH_EPS:						// 每股收益
	case	SLH_EPS_DEDUCT:					// 扣除后每股收益
	case	SLH_NET_PROFIT:					// 净利润
	case	SLH_MAIN_PROFIT:				// 主营业务利润
	case	SLH_TOTAL_PROFIT:				// 利润总额
		crText	=	AfxGetProfile().GetColor(CColorClass::clrText);
		break;
	case	SLH_PROFIT_INC:					// 主营利润增长率
	case	SLH_INCOME_INC:					// 主营收入增长率
	case	SLH_ASSET_INC:					// 总资产增长率
	case	SLH_ANNGAINS_AVERAGE:			// 年平均收益率
	case	SLH_ANNGAINS_STDDEV:			// 收益标准差
	case	SLH_BETA:						// β值
	case	SLH_SHARP:						// 夏普风险指数
		crText	=	AfxGetProfile().GetColor(CColorClass::clrPlane);
		break;
	case	SLH_TRADE:						// 行业
	case	SLH_PROVINCE:					// 省份
		crText	=	AfxGetProfile().GetColor(CColorClass::clrTitle);
		break;
	default:	;
	}

	return crText;
}

//////////////////////////////////////////////////////////////////////
// CExpress

CExpress::CExpress( )
{
	m_bIsModified	=	FALSE;
	m_nReserved		=	0;
}

CExpress::CExpress( const CExpress &src )
{
	*this	=	src;
}

CExpress::~CExpress( )
{
}

CExpress &CExpress::operator = ( const CExpress &src )
{
	m_strExpressOrg		=	src.m_strExpressOrg;
	m_strExpress		=	src.m_strExpress;
	m_bIsModified		=	src.m_bIsModified;
	m_nReserved			=	src.m_nReserved;
	return *this;
}

void CExpress::Serialize( CSPArchive &ar )
{
	if( ar.IsStoring() )
	{
		ar	<<	m_strExpressOrg;
		ar	<<	m_nReserved;
	}
	else
	{
		ar	>>	m_strExpressOrg;
		ar	>>	m_nReserved;

		m_bIsModified	=	TRUE;
		m_strExpress	=	m_strExpressOrg;
	}
}

BOOL CExpress::SetExpressString( CSPString strExpressOrg )
{
	m_strExpressOrg	=	strExpressOrg;

	m_bIsModified	=	TRUE;
	m_strExpress	=	m_strExpressOrg;
	return TRUE;
}

CSPString CExpress::GetExpressString( )
{
	return m_strExpressOrg;
}

CSPString CExpress::GetLastErrorMsg( )
{
	if( m_parser.IsError() )
	{
		int nErrorCode = m_parser.GetErrorCode( );
		switch( nErrorCode )
		{
		case MP_ErrParserStack:	return express_errparserstack;	break;
		case MP_ErrBadRange:	return express_errbadrange;		break;
		case MP_ErrExpression:	return express_errexpression;	break;
		case MP_ErrOperator:	return express_erroperator;		break;
		case MP_ErrOpenParen:	return express_erropenparen;	break;
		case MP_ErrOpCloseParen:return express_errcloseparen;	break;
		case MP_ErrInvalidNum:	return express_errinvalidnum;	break;
		case MP_ErrMath:		return express_errmath;			break;
		default:				return express_errunknown;
		}
	}
	return "";
}

BOOL CExpress::GetExpressResult( double * pResult, BOOL * pError )
{
	if( !PreCompile( ) )
	{
		if( pError )	*pError	=	TRUE;
		return FALSE;
	}

	if( !InitParser( ) )
	{
		if( pError )	*pError	=	TRUE;
		return FALSE;
	}

	m_parser.Parse( );
	if( pError )
		*pError	=	m_parser.IsError( );
	if( m_parser.IsError() )
		return FALSE;

	if( pResult )
		*pResult	=	m_parser.GetResult( );
	return TRUE;
}

// 去掉空格、冒号、回车、换行等字符
BOOL CExpress::PreCompile( )
{
	if( m_bIsModified )
	{
		CSPString	sTemp = m_strExpress;
		m_strExpress.Empty();
		for( int i=0; i<sTemp.GetLength(); i++ )
		{
			TCHAR ch = sTemp[i];
			if( ':' != ch && ' ' != ch && '\t' != ch 
				&& '\r' != ch && '\n' != ch )
				m_strExpress	+=	ch;
		}

		m_bIsModified	=	FALSE;
	}
	return m_strExpress.GetLength() > 0;
}

// 初始化m_parser变量
BOOL CExpress::InitParser( )
{
	m_parser.SetParserString( m_strExpress );
	m_parser.InitVarMap( 10 );
/* examples
	for( int i=0; i<nCount; i++ )
	{
		m_parser.AddVar( dValue, strName );
	}
*/
	return TRUE;
}


/////////////////////////////////////////////////////////////////////////////
// CIndex

CIndex::CIndex( )
{
	m_nID	=	SLH_INVALID;
}

CIndex::CIndex( const CIndex &src )
{
	*this	=	src;
}

CIndex::~CIndex( )
{
}

CIndex &CIndex::operator = ( const CIndex &src )
{
	*((CExpress *)this)	=	*((CExpress *)&src);
	m_nID			=	src.m_nID;
	m_strName		=	src.m_strName;
	m_strDescript	=	src.m_strDescript;
	m_strReserved	=	src.m_strReserved;

	m_adwVariant.Copy( src.m_adwVariant );
	return *this;
}

void CIndex::Serialize( CSPArchive & ar )
{
	CExpress::Serialize( ar );

	if( ar.IsStoring() )
	{
		ar	<<	m_nID;
		ar	<<	m_strName;
		ar	<<	m_strDescript;
		ar	<<	m_strReserved;
	}
	else
	{
		ar	>>	m_nID;
		ar	>>	m_strName;
		ar	>>	m_strDescript;
		ar	>>	m_strReserved;
	}
}

BOOL CIndex::IsInvalidID( )
{
	return SLH_INVALID == m_nID;
}

BOOL CIndex::SetNextID( )
{
	CIndexContainer &container = AfxGetProfile().GetSListColumnsUser();
	m_nID	=	container.GetNextID( );
	return TRUE;
}

BOOL CIndex::PreCompile( )
{
	if( m_bIsModified )
	{
		// 缓存变量ID
		m_adwVariant.RemoveAll();

		// 将中文变量名替换成英文名
		CSPStringArray astrVarName;
		if( AfxGetVariantNameArray(astrVarName,FALSE) )
		{
			CSPDWordArray adwSortID;
			astrVarName.GetSortIDArray( adwSortID );
			for( int i=adwSortID.GetSize()-1; i>=0; i-- )
			{
				UINT nVariantID = adwSortID.GetAt(i);
				if( strlen(slh_data_array[nVariantID].varname) > 0 )
				{
					if( m_strExpress.Replace( AfxGetVariantName(nVariantID,FALSE), slh_data_array[nVariantID].varname ) > 0 )
						m_adwVariant.Add(nVariantID);
				}
			}
		}

		if( !CExpress::PreCompile( ) )
			return FALSE;

		m_bIsModified	=	FALSE;
	}
	return m_strExpress.GetLength() > 0;
}

// 初始化m_parser变量
BOOL CIndex::InitParser( CStockInfo &info, BOOL *pVariantNoValue )
{
	if( pVariantNoValue )
		*pVariantNoValue	=	FALSE;

	m_parser.SetParserString( m_strExpress );
	m_parser.InitVarMap( SLH_MAX );

	for( int i=0; i<m_adwVariant.GetSize(); i++ )
	{
		UINT nVariantID = m_adwVariant.ElementAt(i);

		// 加入变量及其值
		double	value	=	1.0;
		if( !AfxGetVariantValue( nVariantID, info, &value, NULL ) && pVariantNoValue )
			*pVariantNoValue	=	TRUE;
		m_parser.AddVar( value, slh_data_array[nVariantID].varname );
	}
	return TRUE;
}

BOOL CIndex::CheckExpressValid( )
{
	CStockInfo	info;
	BOOL	bError	=	FALSE;
	double	temp	=	0;
	GetExpressResult( &temp, info, NULL, &bError );
	return !bError;
}

BOOL CIndex::GetExpressResult( double * pResult, CStockInfo &info, BOOL *pVariantNoValue, BOOL * pError )
{
	if( !PreCompile( ) )
	{
		if( pVariantNoValue )	*pVariantNoValue	=	FALSE;
		if( pError )	*pError	=	TRUE;
		return FALSE;
	}

	BOOL	bVariantNoValue	=	FALSE;
	if( !InitParser( info, &bVariantNoValue ) )
	{
		if( pVariantNoValue )	*pVariantNoValue	=	bVariantNoValue;
		if( pError )	*pError	=	TRUE;
		return FALSE;
	}
	if( pVariantNoValue )	*pVariantNoValue	=	bVariantNoValue;

	m_parser.Parse( );
	if( pError )
		*pError	=	m_parser.IsError( );
	if( m_parser.IsError() )
		return FALSE;

	if( bVariantNoValue )
		return FALSE;

	if( pResult )
		*pResult	=	m_parser.GetResult( );
	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CIndexContainer

CIndexContainer::CIndexContainer( )
{
}

CIndexContainer::~CIndexContainer( )
{
	RemoveAll( );
}

void CIndexContainer::RemoveIndex( UINT nID )
{
	for( int i=0; i<GetSize(); i++ )
	{
		CIndex & col = ElementAt(i);
		if( nID == col.m_nID )
		{
			RemoveAt( i );
			return;
		}
	}
}

CIndex & CIndexContainer::GetIndex( UINT nID )
{
	static CIndex idx;
	for( int i=0; i<GetSize(); i++ )
	{
		CIndex & col = ElementAt(i);
		if( nID == col.m_nID )
			return col;
	}
	return idx;
}

CIndex & CIndexContainer::GetIndex( CSPString strName )
{
	static CIndex idx;
	for( int i=0; i<GetSize(); i++ )
	{
		CIndex & index = ElementAt(i);
		if( 0 == strName.Compare( index.m_strName ) )
			return index;
	}
	return idx;
}

BOOL CIndexContainer::EditIndex( CIndex &indexEdit )
{
	for( int i=0; i<GetSize(); i++ )
	{
		CIndex & index = ElementAt(i);
		if( indexEdit.m_nID == index.m_nID )
		{
			index	=	indexEdit;
			return TRUE;
		}
	}
	return FALSE;
}

UINT CIndexContainer::GetNextID( )
{
	UINT	nID	=	SLH_USERDEFINE_BEGIN;
	for( int i=0; i<GetSize(); i++ )
	{
		CIndex & index = ElementAt(i);
		if( index.m_nID >= nID )
		{
			nID	=	index.m_nID + 1;
		}
	}
	return nID;
}

void CIndexContainer::FileSerialize( CSPArchive & ar )
{
	if( ar.IsStoring() )
	{
		ar << GetSize();
		for( int i=0; i<GetSize(); i++ )
		{
			CIndex	& col = ElementAt(i);
			col.Serialize( ar );
		}
	}
	else
	{
		int	size;

		ar >> size;
		SetSize( size );
		for( int i=0; i<size; i++ )
		{
			CIndex	col;
			col.Serialize( ar );
			SetAt( i, col );
		}
	}
}

⌨️ 快捷键说明

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