vc 转 delphi(金额转大写)

jhldelphi 2009-09-04 04:18:23
STDMETHODIMP CDNRJetParser::GBMoneyEx(VARIANT var, long position, VARIANT* pValue)
{
if (var.vt == VT_I2 || var.vt == VT_I4
|| var.vt == VT_R4 || var.vt == VT_R8 || var.vt == VT_CY)
{
_variant_t varTmp = var;
varTmp.ChangeType(VT_R8);
CComBSTR bstrValue;

if (varTmp.dblVal >= 1000000000000)
bstrValue = L"Undefine";
else
{
TCHAR buf[50];

#if _UNICODE
if (position > 0)
wsprintf(buf, L"%d", (int)varTmp.dblVal);
else if (position < 0)
{
wsprintf( buf, L"%d", (int)((varTmp.dblVal-(int)varTmp.dblVal+0.005)*100) );
}
//wsprintf(buf, L"%.2f", varTmp.dblVal);
#else
if (position > 0)
sprintf(buf, "%d", (int)varTmp.dblVal);
else if (position < 0)
{
sprintf( buf, "%d", (int)((varTmp.dblVal-(int)varTmp.dblVal+0.005)*100) );
}
//sprintf(buf, "%.2f", varTmp.dblVal);
#endif
int nSize = _tcslen(buf);
if (nSize == 1)
{
bstrValue = number2Currency(buf, "");
}
else if (nSize >= position)
{
if (position < 0)
position = position==-1 ? 2 : 1;

CComBSTR bstrRet;
bstrRet.Empty();
USES_CONVERSION;
if (nSize > 1)
Mid(T2W(buf), _tcslen(buf)-position+1, 1, bstrRet);
//::MessageBox(NULL,W2T(bstrRet),"",0);
bstrValue = number2Currency(W2T(bstrRet), "");
bstrRet.Empty();
}
else
{
bstrValue = number2Currency("0", "");
}
}

::VariantClear(pValue);
::VariantCopy(pValue, &_variant_t(bstrValue));
}

return S_OK;
}


// called by ChineseMoney()
// 最大数是万亿差一。
CString number2Currency(CString strMoney, CString strUnit)
{
DN_INTER_STRING;
//const CString strUnit = RSTR(_Module.m_hInstResource,IDS_STATIC_14);
const CString strNumber = RSTR(_Module.m_hInstResource,IDS_STATIC_15);
const CString strOtherUnit = strUnit;//RSTR(_Module.m_hInstResource,IDS_STATIC_16);

// 将数字分整数部份与小数部份处理
int nPos = strMoney.Find(".");
int nLength = strMoney.GetLength();
if (nPos < 0)
nPos = nLength;

CString strReturnValue;
int nCount = 0;
bool bZero = false;
bool bNeedLevel = false; // 对段的识别,用于是否需要出现段名,如亿,万等

// 对整数部份进行反向识别处理
for (int i = nPos - 1; i >= 0; i--)
{
TCHAR ch = strMoney.GetAt(i);
if (nCount % 4 == 0 && nCount > 0)
{
// 如果处理的数字为第四位(万),或第八位(亿)等,则要求置段
bNeedLevel = true;
}

if (ch == _T('0'))
{
// 只对拾佰仟位的0进行识别,主要考虑到拾的特殊性,即如10读壹拾,不会读壹拾零
//if (nCount % 4 != 0)
strReturnValue += strNumber.Left(2);
}
else
{
CString strTemp(strReturnValue);
strReturnValue = strNumber.Mid((ch - 0x30) * 2 , 2);
if (nCount > 0)
{
strReturnValue += strUnit;//.Mid(nCount * 2 , 2);
if(nCount % 4 != 0 && bNeedLevel)
{
// 这里判断是否需要读段名,如万,亿等
strReturnValue += strUnit;//.Mid(int(nCount / 4) * 8 , 2);
}
bNeedLevel = false;
}
if(bZero)
{
// 只有比当前处理的位要低中有数字才补零
if(!strTemp.IsEmpty())
strReturnValue += strNumber.Left(2);
bZero = false;
}
strReturnValue += strTemp;
}

nCount++;
}

// 如果整数为零,那么根据要求加上“零元”,否则就加“元”
// if (strReturnValue.IsEmpty() /* && bNeedZeroYuan */)
// ;//strReturnValue += RSTR(_Module.m_hInstResource,IDS_STATIC_17);
// else
// strReturnValue += strUnit;//.Left(2);


//
// 小数处理
//
int flag = 0; // 2 - 分位非零
if (nPos < nLength) {
for (int i = 0; i < nLength-nPos-1; i++)
{
TCHAR ch = strMoney.GetAt(nPos+i+1);
if (ch != _T('0'))
{
if (i == 1)
flag = 2;
strReturnValue += strNumber.Mid ((ch - 0x30) * 2 , 2);
strReturnValue += strOtherUnit;//.Mid ((i + 1) * 2 , 2);
}
}
}
//if (flag == 0)
// strReturnValue += RSTR(_Module.m_hInstResource,IDS_STATIC_18);
return strReturnValue;
}
// called by ChineseMoney()
// 最大数是万亿差一。
CString number2Currency(CString strMoney)
{
DN_INTER_STRING;

const CString strUnit = RSTR(_Module.m_hInstResource,IDS_STATIC_14);
const CString strNumber = RSTR(_Module.m_hInstResource,IDS_STATIC_15);
const CString strOtherUnit = RSTR(_Module.m_hInstResource,IDS_STATIC_16);

// 将数字分整数部份与小数部份处理
int nPos = strMoney.Find(".");
int nLength = strMoney.GetLength();
if (nPos < 0)
nPos = nLength;

CString strReturnValue;
int nCount = 0;
bool bZero = false;
bool bNeedLevel = false; // 对段的识别,用于是否需要出现段名,如亿,万等

// 对整数部份进行反向识别处理
for (int i = nPos - 1; i >= 0; i--)
{
TCHAR ch = strMoney.GetAt(i);
if (nCount % 4 == 0 && nCount > 0)
{
// 如果处理的数字为第四位(万),或第八位(亿)等,则要求置段
bNeedLevel = true;
}

if (ch == _T('0'))
{
// 只对拾佰仟位的0进行识别,主要考虑到拾的特殊性,即如10读壹拾,不会读壹拾零
if (nCount % 4 != 0)
bZero = true;
}
else
{
CString strTemp(strReturnValue);
strReturnValue = strNumber.Mid((ch - 0x30) * 2 , 2);
if (nCount > 0)
{
strReturnValue += strUnit.Mid(nCount * 2 , 2);
if(nCount % 4 != 0 && bNeedLevel)
{
// 这里判断是否需要读段名,如万,亿等
strReturnValue += strUnit.Mid(int(nCount / 4) * 8 , 2);
}
bNeedLevel = false;
}
if(bZero)
{
// 只有比当前处理的位要低中有数字才补零
if(!strTemp.IsEmpty())
strReturnValue += strNumber.Left(2);
bZero = false;
}
strReturnValue += strTemp;
}

nCount++;
}

// 如果整数为零,那么根据要求加上“零元”,否则就加“元”
if (strReturnValue.IsEmpty() /* && bNeedZeroYuan */)
strReturnValue += RSTR(_Module.m_hInstResource,IDS_STATIC_17);
else
strReturnValue += strUnit.Left(2);


//
// 小数处理
//
int flag = 0; // 2 - 分位非零
if (nPos < nLength) {
for (int i = 0; i < nLength-nPos-1; i++)
{
if (atol(strMoney.Right(nLength-nPos-1)) == 0)
{
flag = 0;
break;
}

TCHAR ch = strMoney.GetAt(nPos+i+1);
//if (ch != _T('0'))
{
if (i == 1)
flag = 2;
if (i == 0) //角
{
strReturnValue += strNumber.Mid ((ch - 0x30) * 2 , 2);
if (ch != _T('0'))
strReturnValue += strOtherUnit.Mid ((i + 1) * 2 , 2);
}
else if (i == 1 && ch != _T('0')) //分
{
strReturnValue += strNumber.Mid ((ch - 0x30) * 2 , 2);
strReturnValue += strOtherUnit.Mid ((i + 1) * 2 , 2);
}
}
}
}
if (flag == 0)
strReturnValue += RSTR(_Module.m_hInstResource,IDS_STATIC_18);
return strReturnValue;
}
...全文
150 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hzw008 2009-09-05
  • 打赏
  • 举报
回复
ToBigRMB(),正解
de410 2009-09-05
  • 打赏
  • 举报
回复
function ToBigRMB(S: string): string; 
const
rmbNumber: array[0..10] of string=('零','壹','贰','叁','肆','伍','陆','柒','捌','玖','点'); {定义数组}
rmbUnit:array[0..15] of string=('厘','分','角','元','拾','佰','仟','万','拾','佰','仟','亿','拾','佰','仟','万');
var i,j:integer; {定义枚举变量}
t:string;
begin
j:=pos('.',s);
if j=0 then
j:=3
else
j:=3-(length(s)-j);
for i:= length(s) downto 1 do
begin
case s[i] of
'.':begin t:=rmbNumber[10]+t; end;
else begin t:=rmbNumber[strtoint(s[i])]+rmbUnit[j]+t;inc(j);end;
end;
end;
t:=rmbNumber[0]+rmbUnit[j]+t;
Result:=t;
end;
wxsan 2009-09-05
  • 打赏
  • 举报
回复
帮你顶一下。
jhldelphi 2009-09-04
  • 打赏
  • 举报
回复
以前是用VC写的,到网上弄一个,银行说不标准,
所以想把以前VC的改成Delphi
bdmh 2009-09-04
  • 打赏
  • 举报
回复
wintergoes 2009-09-04
  • 打赏
  • 举报
回复
DELPHI也有相关的代码
蹭点分顺便
jhldelphi 2009-09-04
  • 打赏
  • 举报
回复
STDMETHODIMP CDNRJetParser::GBMoneyEx(VARIANT var, long position, VARIANT* pValue) 
{
if (var.vt == VT_I2 || var.vt == VT_I4
|| var.vt == VT_R4 || var.vt == VT_R8 || var.vt == VT_CY)
{
_variant_t varTmp = var;
varTmp.ChangeType(VT_R8);
CComBSTR bstrValue;

if (varTmp.dblVal >= 1000000000000)
bstrValue = L"Undefine";
else
{
TCHAR buf[50];

#if _UNICODE
if (position > 0)
wsprintf(buf, L"%d", (int)varTmp.dblVal);
else if (position < 0)
{
wsprintf( buf, L"%d", (int)((varTmp.dblVal-(int)varTmp.dblVal+0.005)*100) );
}
//wsprintf(buf, L"%.2f", varTmp.dblVal);
#else
if (position > 0)
sprintf(buf, "%d", (int)varTmp.dblVal);
else if (position < 0)
{
sprintf( buf, "%d", (int)((varTmp.dblVal-(int)varTmp.dblVal+0.005)*100) );
}
//sprintf(buf, "%.2f", varTmp.dblVal);
#endif
int nSize = _tcslen(buf);
if (nSize == 1)
{
bstrValue = number2Currency(buf, "");
}
else if (nSize >= position)
{
if (position < 0)
position = position==-1 ? 2 : 1;

CComBSTR bstrRet;
bstrRet.Empty();
USES_CONVERSION;
if (nSize > 1)
Mid(T2W(buf), _tcslen(buf)-position+1, 1, bstrRet);
//::MessageBox(NULL,W2T(bstrRet),"",0);
bstrValue = number2Currency(W2T(bstrRet), "");
bstrRet.Empty();
}
else
{
bstrValue = number2Currency("0", "");
}
}

::VariantClear(pValue);
::VariantCopy(pValue, &_variant_t(bstrValue));
}

return S_OK;
}


// called by ChineseMoney()
// 最大数是万亿差一。
CString number2Currency(CString strMoney, CString strUnit)
{
DN_INTER_STRING;
//const CString strUnit = RSTR(_Module.m_hInstResource,IDS_STATIC_14);
const CString strNumber = RSTR(_Module.m_hInstResource,IDS_STATIC_15);
const CString strOtherUnit = strUnit;//RSTR(_Module.m_hInstResource,IDS_STATIC_16);

// 将数字分整数部份与小数部份处理
int nPos = strMoney.Find(".");
int nLength = strMoney.GetLength();
if (nPos < 0)
nPos = nLength;

CString strReturnValue;
int nCount = 0;
bool bZero = false;
bool bNeedLevel = false; // 对段的识别,用于是否需要出现段名,如亿,万等

// 对整数部份进行反向识别处理
for (int i = nPos - 1; i >= 0; i--)
{
TCHAR ch = strMoney.GetAt(i);
if (nCount % 4 == 0 && nCount > 0)
{
// 如果处理的数字为第四位(万),或第八位(亿)等,则要求置段
bNeedLevel = true;
}

if (ch == _T('0'))
{
// 只对拾佰仟位的0进行识别,主要考虑到拾的特殊性,即如10读壹拾,不会读壹拾零
//if (nCount % 4 != 0)
strReturnValue += strNumber.Left(2);
}
else
{
CString strTemp(strReturnValue);
strReturnValue = strNumber.Mid((ch - 0x30) * 2 , 2);
if (nCount > 0)
{
strReturnValue += strUnit;//.Mid(nCount * 2 , 2);
if(nCount % 4 != 0 && bNeedLevel)
{
// 这里判断是否需要读段名,如万,亿等
strReturnValue += strUnit;//.Mid(int(nCount / 4) * 8 , 2);
}
bNeedLevel = false;
}
if(bZero)
{
// 只有比当前处理的位要低中有数字才补零
if(!strTemp.IsEmpty())
strReturnValue += strNumber.Left(2);
bZero = false;
}
strReturnValue += strTemp;
}

nCount++;
}

// 如果整数为零,那么根据要求加上“零元”,否则就加“元”
// if (strReturnValue.IsEmpty() /* && bNeedZeroYuan */)
// ;//strReturnValue += RSTR(_Module.m_hInstResource,IDS_STATIC_17);
// else
// strReturnValue += strUnit;//.Left(2);


//
// 小数处理
//
int flag = 0; // 2 - 分位非零
if (nPos < nLength) {
for (int i = 0; i < nLength-nPos-1; i++)
{
TCHAR ch = strMoney.GetAt(nPos+i+1);
if (ch != _T('0'))
{
if (i == 1)
flag = 2;
strReturnValue += strNumber.Mid ((ch - 0x30) * 2 , 2);
strReturnValue += strOtherUnit;//.Mid ((i + 1) * 2 , 2);
}
}
}
//if (flag == 0)
// strReturnValue += RSTR(_Module.m_hInstResource,IDS_STATIC_18);
return strReturnValue;
}
// called by ChineseMoney()
// 最大数是万亿差一。
CString number2Currency(CString strMoney)
{
DN_INTER_STRING;

const CString strUnit = RSTR(_Module.m_hInstResource,IDS_STATIC_14);
const CString strNumber = RSTR(_Module.m_hInstResource,IDS_STATIC_15);
const CString strOtherUnit = RSTR(_Module.m_hInstResource,IDS_STATIC_16);

// 将数字分整数部份与小数部份处理
int nPos = strMoney.Find(".");
int nLength = strMoney.GetLength();
if (nPos < 0)
nPos = nLength;

CString strReturnValue;
int nCount = 0;
bool bZero = false;
bool bNeedLevel = false; // 对段的识别,用于是否需要出现段名,如亿,万等

// 对整数部份进行反向识别处理
for (int i = nPos - 1; i >= 0; i--)
{
TCHAR ch = strMoney.GetAt(i);
if (nCount % 4 == 0 && nCount > 0)
{
// 如果处理的数字为第四位(万),或第八位(亿)等,则要求置段
bNeedLevel = true;
}

if (ch == _T('0'))
{
// 只对拾佰仟位的0进行识别,主要考虑到拾的特殊性,即如10读壹拾,不会读壹拾零
if (nCount % 4 != 0)
bZero = true;
}
else
{
CString strTemp(strReturnValue);
strReturnValue = strNumber.Mid((ch - 0x30) * 2 , 2);
if (nCount > 0)
{
strReturnValue += strUnit.Mid(nCount * 2 , 2);
if(nCount % 4 != 0 && bNeedLevel)
{
// 这里判断是否需要读段名,如万,亿等
strReturnValue += strUnit.Mid(int(nCount / 4) * 8 , 2);
}
bNeedLevel = false;
}
if(bZero)
{
// 只有比当前处理的位要低中有数字才补零
if(!strTemp.IsEmpty())
strReturnValue += strNumber.Left(2);
bZero = false;
}
strReturnValue += strTemp;
}

nCount++;
}

// 如果整数为零,那么根据要求加上“零元”,否则就加“元”
if (strReturnValue.IsEmpty() /* && bNeedZeroYuan */)
strReturnValue += RSTR(_Module.m_hInstResource,IDS_STATIC_17);
else
strReturnValue += strUnit.Left(2);


//
// 小数处理
//
int flag = 0; // 2 - 分位非零
if (nPos < nLength) {
for (int i = 0; i < nLength-nPos-1; i++)
{
if (atol(strMoney.Right(nLength-nPos-1)) == 0)
{
flag = 0;
break;
}

TCHAR ch = strMoney.GetAt(nPos+i+1);
//if (ch != _T('0'))
{
if (i == 1)
flag = 2;
if (i == 0) //角
{
strReturnValue += strNumber.Mid ((ch - 0x30) * 2 , 2);
if (ch != _T('0'))
strReturnValue += strOtherUnit.Mid ((i + 1) * 2 , 2);
}
else if (i == 1 && ch != _T('0')) //分
{
strReturnValue += strNumber.Mid ((ch - 0x30) * 2 , 2);
strReturnValue += strOtherUnit.Mid ((i + 1) * 2 , 2);
}
}
}
}
if (flag == 0)
strReturnValue += RSTR(_Module.m_hInstResource,IDS_STATIC_18);
return strReturnValue;
}
Grid++Report是一款C/S与B/S集成报表工具,功能全面易学易用。C/S开发适用于VB.NET, C#, VB, VC, Delphi, BCB, 易语言等。B/S开发适用于ASP.NET, ASP, PHP, JSP(Java)等,支持所有操作系统服务器与WEB服务器。开发C/S报表与B/S报表共享相同的开发知识与设计资源。提供独有的报表查询显示功能,让报表查询显示、打印、打印预览及数据导出等功能集成一体化实现。轻松实现表格报表、动态报表、多层表头、票据套打、交叉表、统计图表、表中表及各种特殊报表等,是中式报表的最佳开发工具。提供详尽帮助文档与各种编程平台下的丰富例子,安装中包括可直接运行例子程序,安装后即刻体验此报表工具。Unicode编码,多国语言集成支持。历经数年发展,多家有影响力的通用软件厂商选用,用户遍布各行各业,已经成为用户受众面最广的国产报表工具。 Grid++Report 报表组件具有如下特点: 1、支持C/S报表与B/S报表开发,支持全部主流开发语言。C/S开发:VB.NET、C#、VB、VCDelphi等,B/S开发:ASP.NET、ASP、PHP、JSP等,支持所有WEB服务器。 2、多国语言集成支持与UNICOD E编码支持,方便开发多国语言软件。 3、功能强大,稳定高效:实现表格报表、多层表头、票据套打、交叉表等各种报表非常简便;报表完全可编程定义,适合开发通用软件中的动态报表。 4、独有的报表查询显示功能:提供报表查询与输出的集成一次性实现,保证数据不同展现方式的一致性与完整性。 5、报表数据来源丰富:支持绑定(报表数据拉模式)与非绑定(报表数据推模式),一切数据库数据与其它数据都可以作为报表数据源。 6、提供图表功能,包括:饼图、叠加饼图、柱状图、气泡图、折线图、曲线图、散列点图等,支持三维图形。 7、报表数据导出格式丰富,格式包括:Excel、RTF、PDF、图像、HTML、文本,CSV 等。 8、支持数十种一维条码,支持PDF417与QRCode这两种最常用的二维条码,条码打印精度高且易读取。 9、提供脚本编程功能,直接在报表模板中自定义报表行为,采用通用的JScript与VBScript脚本引擎。 10、特有的分组单元格合并功能,轻松实现常见的中国式报表分组在列中展现并垂直居中要求。 11、全中文界面,针对中国式报表进行了很多专门实现,如:表格报表、财务金额线、大写金额、发票圈叉图标、负数红字、多层表头等。很多在国外报表工具中很难实现的功能都可以轻易实现。 12、提供丰富交互事件,轻松实现报表行为自定义、穿透(透视)查询和报表交互。 13、重新发布简单:C/S报表只需分发两个DLL文件;B/S报表只要在WEB服务器布署报表网页与报表插件安装包,服务端不需其它配置,客户端零配置。 14、易学易用:完全可视化设计,完善的复制/剪切/粘贴(Copy/Cut/Paste)和恢复重做(Undo/Redo)功能,专业的拖放操作与即时编辑功能。 15、编写了完整详尽的帮助文档。提供了丰富例程,C/S报表包括VB.NET、C#、VB、VCDelphi、C++Builder、VFP、中文编程易语言,B/S报表包括ASP.NET,ASP,PHP,JSP。 Grid++Report 网站:http://www.rubylong.cn Grid++Report 演示:http://www.rubylong.cn/WebReport
一款高性能的报表开发工具,特别适用于管理信息系统,如ERP、进销存、财务等软件的报表开发。适用范围广:VB.NET、C#.NET、VB、VCDelphi、C++Builder、中文编程易语言等一切支持 COM 的开发工具。
功能强大:实现普通格式报表、表格报表、多层表头、票据套打、交叉表等各种报表非常简便;报表完全可编程定义,非常适合开发通用软件中的动态报表。
独有的报表查询显示功能:除了提供报表的打印、打印预览、数据导出等功能,还提供独有的报表查询显示功能,既提供报表查询与输出的集成一次性实现,又能保证数据的一致性与完整性。
报表完全可编程定义,报表运行编程可控制,开发动态报表方便灵活。
特有的分组单元格合并功能,轻松实现常见的中国式报表分组在列中展现形式。
实现票据套打非常简便:对票据套打进行了专门的实现。
提供图表功能,包括饼图、柱状图、叠加柱状图、连线图、散列点图等,在报表中直接实现图表功能。
报表数据导出格式丰富,包括:Excel、PDF、图像、HTML、文本,CSV等多种格式。
支持所有常规条形码。
报表模板提供脚本编程功能,直接在报表模板中自定义报表行为。
支持参数化报表查询SQL语句,轻松实现动态过滤条件筛选报表数据。
运行时打印生成对纸张有适应能力,即使不以设计时纸张进行打印也可以得到输出布局合理的报表。
报表查询显示时提供报表内容文字查找功能。
全中文界面,针对中国报表进行了很多专门实现,如:报表表格线、财务金额线、数字大写金额、负数红字显示、多层表头等。
组件提供丰富交互事件,轻松实现报表穿透(透视)查询和报表交互。
重新发布简单:最多只需分发两个 DLL 文件。
易学易用:完全可视化设计,完善的复制/剪切/粘贴(Copy/Cut/Paste)和恢复与重做(Undo/Redo)功能。
编写了完整详尽的帮助文档。提供了丰富例程,包括VB.NET、C#、VB、VCDelphi、CBuilder、中文编程易语言。
Delphi、C++Builder 进行了专门的包装,象使用 VCL 构件一样使用
Grid++Report 报表控件适用于VB.NET、C#、VB、VCDelphi、C++Builder、Foxpro(VFP)、易语言等一切支持 COM 的开发工具。除了提供报表的统计分析、打印、打印预览、数据导出等功能,还提供独有的报表查询显示功能,让报表查询显示、打印、打印预览及数据导出等功能集成一体化实现。轻松实现通用报表、表格报表、动态报表、多层表头、票据与发票套打、交叉表、表中表及各种特殊报表等。提供详尽帮助文档与各种编程平台下的丰富例子,安装中包括可直接运行例子程序,安装后即刻体验此报表工具。包括简体中文版、繁体中文版与英文版。经过数年的发展,已经被国内多家有影响力的通用软件厂商采用,其用户遍布各行各业,已经成为用户受众面最广的国产报表开发工具。Grid++Report 报表组件具有如下特点:1、适用范围广:VB.NET、C#、VB、VCDelphi、C++Builder、VFP、易语言等一切支持 COM 的开发工具。2、功能强大:实现普通格式报表、表格报表、多层表头、票据套打、交叉表等各种报表非常简便;报表完全可编程定义,非常适合开发通用软件中的动态报表。3、独有的报表查询显示功能:除了提供报表的打印、打印预览、数据导出等功能,还提供独有的报表查询显示功能,既提供报表查询与输出的集成一次性实现,又能保证数据的一致性与完整性。4、特有的分组单元格合并功能,轻松实现常见的中国式报表分组在列中展现并垂直居中。5、提供图表功能,在报表中直接实现图表功能。包括:饼图、叠加饼图、柱状图,连线图、散列点图等。6、报表数据导出格式丰富,格式包括:Excel、PDF、图像、HTML、文本,CSV 等。7、提供脚本编程功能,直接在报表模板中自定义报表行为,采用通用的 VBScript 与 JScript 脚本引擎。8、支持参数化报表查询SQL语句,轻松实现动态过滤条件筛选报表数据。9、报表查询显示时提供报表内容文字查找功能。10、全中文界面,针对中国报表进行了很多专门实现,如:报表表格线、财务金额线、大写金额、发票打印圆圈中画叉图标、负数红字显示、多层表头等。很多在国外报表控件中很难实现的功能在本报表控件中可以轻易实现。11、组件提供丰富交互事件,轻松实现报表穿透(透视)查询和报表交互。12、重新发布简单:只需分发两个 DLL 文件。13、易学易用:完全可视化设计,完善的复制/剪切/粘贴(Copy/Cut/Paste)和恢复重做(Undo/Redo)功能,专业的拖放操作与即时编辑功能。14、编写了完整详尽的帮助文档。提供了丰富例程,包括VB.NET、C#、VB、VCDelphi、C++Builder、VFP、中文编程易语言。15、为 Delphi、C++Builder 编写专门的包装类,象使用 VCL 控件一样使用 Grid++Report。16、支持所有常规条形码,打印条形码精度高易读取。

5,928

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧