QuickReport报表中QRLabel显示的数据的换行问题

sunliwen780502 2004-11-20 10:16:58
在用QuickReport做报表时,用QRLabel显示数据,但是QRLabel并不直接支持换行,需要用属性设置
WordWrap为true, 和AotoStretch 属性为true.为了能随着内容的变化动态的换行.我写的程序和修改后的程序,代码如下:

int iLength; //要显示的文字的总长度
int iRows; //行数
int iY; //余数
AnsiString temp = ""; //存放临时字符串
String Str;

//使报表值自动换行
iLength = strlen(Str.c_str());
iRows = iLength / 100;
iY = iLength % 100;

if (iRows == 0)
{
lbl->Caption = Str;
}

if ((iRows == 1) && (iY > 0))
{
lbl->Caption = Str.SubString(1, 100) + " ";
}

if ((iRows > 1) && (iY >= 0))
{
for (int i = 0; i < iRows; i++)
{
temp += Str.SubString(i * n + 1, (i + 1) * n) + " ";
lbl->Caption = temp;
}



/*******************************************************************************
FunctionName: AutoNewLine
Description: 报表组件QRLabel的显示的信息的自动换行函数
Date: 2004-11-13
参数说明:lbl TQRLabel 类型
Str 要显示的字符串
n 组件每行显示的字符的长度
********************************************************************************/
void AutoNewLine(TQRLabel *lbl, AnsiString Str, int n)
{
int iLength; //要显示的文字的总长度
int iRows; //行数
int iY; //余数
AnsiString temp = ""; //存放临时字符串

iLength = strlen(Str.c_str());
iRows = iLength / n;
iY = iLength % n;

if ((iRows == 0) || ((iRows == 1) && (iY == 0)))
{
lbl->Caption = Str;
}

if ((iRows == 1) && (iY >= 0)) //表示有余数,还不够两行
{
lbl->Caption = Str.SubString(1, n) + " ";
}

if ((iRows > 1) && (iY >= 0))
{
for (int i = 0; i < iRows; i++)
{
temp += Str.SubString(i * n + 1, (i + 1) * n) + " ";
lbl->Caption = temp;
}
}

/*
if (((iRows == 0) && (iY > 0)) || ((iRows == 1) && (iY == 0)))
{
lbl->Caption = Str;
}

else
{
for (int i = 0; i < iRows; i++)
{
temp += Str.SubString(i * n + 1, (i + 1) * n) + " ";
lbl->Caption = temp;
}
}
*/
}
请大家帮忙看一看,如果分数不够,可以再加.
...全文
315 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
chengsetianxie 2004-11-26
  • 打赏
  • 举报
回复
我顶顶顶!!!
sunliwen780502 2004-11-24
  • 打赏
  • 举报
回复
程序的再次改进.
int iLength; //要显示的文字的总长度
int iRows; //行数
int iY; //余数
AnsiString temp = ""; //存放临时字符串
AnsiString SubStr = ""; //存放剩余的字符串

iLength = strlen(Str.c_str());
iRows = iLength / n;
iY = iLength % n;

//要显示的字符串小于QRLabel一行能显示的字符串,不换行
if (((iRows == 0) && (iY > 0)) || ((iRows == 1) && (iY == 0)))
{
lbl->Caption = Str;
}

//表示有余数,还不够两行
if ((iRows == 1) && (iY > 0))
{
lbl->Caption = Str.SubString(1, n) + " " + RightStr(Str, iLength - n + 1);
}

//要显示的字符串是QRLabel每行显示的字符的整数倍,或者有余数的情况
if ((iRows > 1) && (iY >= 0))
{
for (int i = 0; i < iRows; i++)
{
temp += Str.SubString(i * n + 1, (i + 1) * n) + " ";
SubStr = RightStr(Str, (iLength - (i + 1) * n) + 1); //改进处
}
lbl->Caption = temp + SubStr;
}
sunlw78 2004-11-24
  • 打赏
  • 举报
回复
用QRDBRichText组件和数据集绑定为什么不显示数据呢?
jinhaiwu 2004-11-24
  • 打赏
  • 举报
回复
用TQrMemo或者TQrRichEdit就不会有你这样的问题了。
wsdgs 2004-11-23
  • 打赏
  • 举报
回复
顶!
sunlw78 2004-11-23
  • 打赏
  • 举报
回复
好帖.顶!
sunliwen780502 2004-11-23
  • 打赏
  • 举报
回复
散分都没人要,自己顶了.
sunliwen780502 2004-11-23
  • 打赏
  • 举报
回复
我的问题已经解决了,我把最新的代码发上来,供大家参考!
/*******************************************************************************
FunctionName: AutoNewLine
Description: 报表组件QRLabel的显示的信息的自动换行函数
Date: 2004-11-13
参数说明:lbl TQRLabel 类型
Str 要显示的字符串
n 组件每行显示的字符的长度
********************************************************************************/
void AutoNewLine(TQRLabel *lbl, AnsiString Str, int n)
{
int iLength; //要显示的文字的总长度
int iRows; //行数
int iY; //余数
AnsiString temp = ""; //存放临时字符串

iLength = strlen(Str.c_str());
iRows = iLength / n;
iY = iLength % n;

if (((iRows == 0) && (iY > 0)) || ((iRows == 1) && (iY == 0)))
{
lbl->Caption = Str;
}

if ((iRows == 1) && (iY > 0)) //表示有余数,还不够两行
{
lbl->Caption = Str.SubString(1, n) + " " + RightStr(Str, iLength - n + 1); //出问题处
}

if ((iRows > 1) && (iY >= 0))
{
for (int i = 0; i < iRows; i++)
{
temp += Str.SubString(i * n + 1, (i + 1) * n) + " ";
lbl->Caption = temp;
}
}
}

问题解决了,我想把分散了,大家都来吧.来者有分!
jiangchaofeng 2004-11-23
  • 打赏
  • 举报
回复
顶!
sunliwen780502 2004-11-23
  • 打赏
  • 举报
回复
我在把我的改进程序发上来.
还没有测试,请大家先帮忙看一看.

int iLength; //要显示的文字的总长度
int iRows; //行数
int iY; //余数
AnsiString temp = ""; //存放临时字符串

iLength = strlen(Str.c_str());
iRows = iLength / n;
iY = iLength % n; //余数

if (((iRows == 0) && (iY > 0)) || ((iRows == 1) && (iY == 0)))
{
lbl->Caption = Str;
}

if ((iRows == 1) && (iY > 0)) //表示有余数,还不够两行
{
lbl->Caption = Str.SubString(1, n) + " ";
}

if ((iRows > 1) && (iY >= 0))
{
for (int i = 0; i < iRows; i++)
{
temp += Str.SubString(i * n + 1, (i + 1) * n) + " ";
lbl->Caption = temp;
}
}
sunliwen780502 2004-11-23
  • 打赏
  • 举报
回复
回答的人太少,只好自己顶了.那些所谓的高手都哪里去了,难道这样的问题都解决不了吗?
他们可是挂着红星的啊?
sunliwen780502 2004-11-22
  • 打赏
  • 举报
回复
h98458(零点起飞) ( ) :
我写的程序就是解决换行的问题,当要显示的信息超过QRLabel横行显示的数据几个字符时,没有效果,但是如果超过2倍,或者更多倍时就可以自动换行了. 你帮我看看,为什么超过横行几个字符时,就不换行呢?也请下面将要回答的朋友畅所欲言.
h98458 2004-11-22
  • 打赏
  • 举报
回复
QuickReport自动换行一直以来都是一个悬而未决的问题,你可以在要换行的地方加空格解决~~
sunliwen780502 2004-11-22
  • 打赏
  • 举报
回复
一直没人回答,自己先顶一下.难道这问题就这么难么?

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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