📄 express.cpp
字号:
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 + -