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

📄 listexpressiondlg.cpp

📁 一个不错的简单实用的公式解析器
💻 CPP
字号:
// ListExpressionDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Calculator.h"
#include "ListExpressionDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CListExpressionDlg dialog


CListExpressionDlg::CListExpressionDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CListExpressionDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CListExpressionDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}

void CListExpressionDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CListExpressionDlg)
	DDX_Control(pDX, IDC_EDIT_RESULT, m_ctrlResult);
	DDX_Control(pDX, IDC_LIST_EXPRESSION, m_ctrlListExpression);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CListExpressionDlg, CDialog)
	//{{AFX_MSG_MAP(CListExpressionDlg)
	ON_BN_CLICKED(IDC_BUTTON_SELECT, OnButtonSelect)
	ON_LBN_SELCHANGE(IDC_LIST_EXPRESSION, OnSelchangeListExpression)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CListExpressionDlg message handlers

BOOL CListExpressionDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();

	m_ctrlListExpression.AddString("!(1 > 3) OR .F.");
	m_ctrlListExpression.AddString("+1/-1");
	m_ctrlListExpression.AddString("1+2+3+1/2");
	m_ctrlListExpression.AddString("(121-1)/10-2");
	m_ctrlListExpression.AddString("(1+1)*3+(2+2)");
	m_ctrlListExpression.AddString("(1+1)+(2+2)+(3+3)");
	m_ctrlListExpression.AddString("(1+1)+(2+2)*(3+3)*100");
	m_ctrlListExpression.AddString("1+1*(1+1)");
	m_ctrlListExpression.AddString("(10+5*9-15/3+(2*10-(12-2)))-((2.91-0.90-1.01)*100/10)");
	m_ctrlListExpression.AddString("ABS(ABS(-45)-ABS(5)-ABS(10-30)-ABS(30-10))");
	m_ctrlListExpression.AddString("ALLTRIM(\" TEST \") + ALLTRIM(\" 0\") + ALLTRIM(\"1 \")");
	m_ctrlListExpression.AddString("ANSITOOEM(\"义耱\")+\"-\"+OEMTOANSI(ANSITOOEM(\"义耱\"))");
	m_ctrlListExpression.AddString("CHR(ASC('A'))+CHR(ASC('Z'))");
	m_ctrlListExpression.AddString("AT(\"test\",\"Is the test string\")");
	m_ctrlListExpression.AddString("ATC(\"Test\",\"Is the test string\")");
	m_ctrlListExpression.AddString("ATAN(0) + ATAN(PI()/2)");
	m_ctrlListExpression.AddString("BETWEEN(4,0,10) AND BETWEEN(DATE(),DATE()-1,DATE()+1)");
	m_ctrlListExpression.AddString("CMONTH(DATE())+\" \"+CDOW(DATE())");
	m_ctrlListExpression.AddString("CEILING(10.1)+CEILING(-10.9)");
	m_ctrlListExpression.AddString("CHRTRAN('ABCDEF','ACE','XYZQRST')");
	m_ctrlListExpression.AddString("COS(PI()) + SIN(PI()/2)");
	m_ctrlListExpression.AddString("CTOD(\"01 2002\")");
	m_ctrlListExpression.AddString("CTOT(\"01 2002 18:20\")");
	m_ctrlListExpression.AddString("YEAR(DATE())*10000+MONTH(DATE())*100+DAY(DATE())");
	m_ctrlListExpression.AddString("DMY(DATE())");
	m_ctrlListExpression.AddString("DTOC(DATE())+\" \"+DTOC(DATE(),1)+\" \"+DTOS(DATE())");
	m_ctrlListExpression.AddString("EMPTY(CTOD('')) AND EMPTY('') AND EMPTY(0)");
	m_ctrlListExpression.AddString("LOG(EXP(2))+LOG10(100)+EXP(0)");
	m_ctrlListExpression.AddString("FLOOR(10.1)+FLOOR(-10.9)");
	m_ctrlListExpression.AddString("GOMONTH(GOMONT(DATE()-DAY(DATE()),1),-2)");
	m_ctrlListExpression.AddString("HOUR(DATETIME())*60*60+MINUTE(DATETIME())*60+SEC(DATETIME())");
	m_ctrlListExpression.AddString("IIF(IIF(1>2,1,2)>0,DATE(),DATE()-1)");
	m_ctrlListExpression.AddString("INT(-12.5)+INT(12.1)");
	m_ctrlListExpression.AddString("ISALPHA('z') AND ISDIGIT('9')");
	m_ctrlListExpression.AddString("ISLOWER('g') AND ISUPPER('G')");
	m_ctrlListExpression.AddString("LEFT(\"TECT\",2)+RIGHT(\"test\",2)");
	m_ctrlListExpression.AddString("LEN(\"Test\")");
	m_ctrlListExpression.AddString("LIKE('Ch*','Chess') AND LIKE('*ss*','Chess') AND LIKE('*h?s?','Chess')");
	m_ctrlListExpression.AddString("UPPER(\"Is \")+LOWER(\"Test\")");
	m_ctrlListExpression.AddString("LTRIM(\"   Test\")");
	m_ctrlListExpression.AddString("MAX(DATE(),DATE()-2,DATE()-3)");
	m_ctrlListExpression.AddString("MIN(MAX(3,8,5),MAX(2,7,3),4)");
	m_ctrlListExpression.AddString("MDY(DATE())");
	m_ctrlListExpression.AddString("MOD((4*9),(90/9))");
	m_ctrlListExpression.AddString("OCCURS('a','abracadabra')");
	m_ctrlListExpression.AddString("PADL(\"-\",3,'0')+PADC(\"|\",3,' ')+PADR(\"-\",3,'0')");
	m_ctrlListExpression.AddString("REPLICATE('HELLO ',4)");
	m_ctrlListExpression.AddString("ROUND(8.099,2)");
	m_ctrlListExpression.AddString("SECONDS()/(60*60)");
	m_ctrlListExpression.AddString("SIGN(-5)+SIGN(0)+SIGN(3)");
	m_ctrlListExpression.AddString("'*'+SPACE(3)+'*'");
	m_ctrlListExpression.AddString("SQRT(2*SQRT(2))");
	m_ctrlListExpression.AddString("STR(3,3,1)+','+STR(3,2)+','+STR(3)");
	m_ctrlListExpression.AddString("STRTRAN('abracadabra', 'a', 'q', 2, 3)");
	m_ctrlListExpression.AddString("STUFF('abcdefghijklm',4,3,'12345')");
	m_ctrlListExpression.AddString("SUBSTR('abcdefghijklm', 1, 5)");
	m_ctrlListExpression.AddString("TAN(PI()/4)");
	m_ctrlListExpression.AddString("TIME()");
	m_ctrlListExpression.AddString("VAL('10')+VAL('5')");
	m_ctrlListExpression.AddString("VARTYPE(DATE())+' '+VARTYPE('test')+' '+VARTYPE(9)");

	m_ctrlListExpression.SetCurSel(0);
	OnSelchangeListExpression();
	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CListExpressionDlg::OnButtonSelect() 
{
	OnOK();
}

void CListExpressionDlg::OnSelchangeListExpression() 
{
	CALXParser m_Parser;
	VARIANT* pvarResult = NULL;

	m_ctrlListExpression.GetText(m_ctrlListExpression.GetCurSel(), m_strExpression);

	try
	{
		m_Parser.Parse(m_strExpression);
		pvarResult = m_Parser.Execute();
	}
	catch(CALXParserException* e)
	{
		m_ctrlResult.SetWindowText("");

		for(int i = 0; i < e->GetErrorCount(); i++)
		{
			e->GetErrorInfo(i);
			e->ReportError();
		}
		e->Delete();

		return;
	}
	catch(CException* e)
	{
		m_ctrlResult.SetWindowText("");

		e->ReportError();
		e->Delete();

		return;
	}

	CString strRez;
	switch(V_VT(pvarResult))
	{
	case VT_R8:
		{
			strRez.Format("%f",pvarResult->dblVal);
			break;
		}
	case VT_BSTR:
		{
			CString strRezult(V_BSTR(pvarResult));
			strRez.Format("\"%s\"",strRezult);
			break;
		}
	case VT_DATE:
		{
			COleDateTime dte(V_DATE(pvarResult));
			strRez = dte.Format();
			break;
		}
	case VT_BOOL:
		{
			if(V_BOOL(pvarResult))
				strRez = ".T.";
			else
				strRez = ".F.";
			break;
		}
	default:
		strRez = "Error result"; 

	}

	m_ctrlResult.SetWindowText(strRez);

	return;
	
}

⌨️ 快捷键说明

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