动态报表问题!(你可不一定会哟,嘿嘿!!!)(50分)

L

lsh22

Unregistered / Unconfirmed
GUEST, unregistred user!
在做动态报表的时候,需要让用户自己决定哪些字段要打印,哪些不打印,,但是如果事先把所有可以打印的字段都放在窗口上,然后在让用户选择的话,我觉得还是不够“动态”,(我想问的是如果要打印的字段不是固定,可以增,可减,怎么样在我的窗口中动态显示出来(当然也是把所有的字段显示出来))
 
用Dbgrideh,表里有什么就打什么。
DBGridEh.Columns[x].visible :=false;//将某一列隐藏.
 
Dbgrideh这 是什么控件?
你说的意思,不太明白.
 
可以,用qr就行了,要打印的字段用个循环显示在qr中就行了.
 
其实实现动态列出字段都还不难,难的是要算出这些选择出来的字段加起来的宽度是否
超出打印机设置的页宽,超出以后如何实现折行。
 
我想问的是如果要打印的字段不是固定,可以增,可减,
(不是通过用户选择决定,而是通过数据库,可能出现这样的情况,第一次打印的字段在数据库所有字段中,但是第二次打印的一个字段,可能不是在所有字段中,这样该如何?)
怎么样在我的窗口中动态显示出来(当然也是把所有的字段显示出来,包括我说的第二种情况),以便用户选择哪些需要
打印,哪些不需打印!
 
你所说的这个我都明白,我的意思是在让用户设置一些打印参数的窗口中怎么样动态的把需要打印的字段的选项(如“是否打印”复选按钮,“对齐方式”,"高度"文本框动态显示出来,由于每次打印字段都不一样(要打印的字段可能在所有字段中,但也可能不在所有字段中,既所有字段可增可减,是不是说的有点复杂),这样动态显示好象很麻烦,如果预先把所有要打印的字段都放在窗口中的话,那就不是”动态“的了),显示在窗口中,而不是根据用户选择动态生成打印的一些控件(QRband)。。。
 
高手在吗?
 
我的一点看法如下,摘自我的报表设计器原码,使用的是C++Builder,请原谅了。此程序仅供参考,具体的细节自己体会了。
void __fastcall TReport:: InitBands(void)
{
if(FPageRoot==NULL)ErrorBreak();//you can not care this line
for(int i=bsCanvas;i<=bsSummary;i++)
InitBand((TBandStyle)i);
}
void __fastcall TReport:: InitBand(TBandStyle Style)
{
PBand Value;
Value = new TBand;
if(Value == NULL)ErrorBreak();
Value->Style = Style;
Value->Color = Style;
Value->Rect.Left,Top,Height,Width = 0,0,30,0;
//节省一点空间,各位见谅
Value->Frame.Color,DrawBottom,DrawLeft,DrawRight,DrawTop,Style,Width=clBlack,false,false,false,false,PS_SOLID,1;
int AWidth,alen;
switch(Style)
{
case bsCanvas:
{
AWidth = FPageRoot->Rect.Width;
alen = ConversionUnit(FMargin.Unit,puPixes,FMargin.Left.Value);
Value->Rect.Left = alen;
AWidth -= alen;
alen = ConversionUnit(FMargin.Unit,puPixes,FMargin.Right.Value);
AWidth -= alen;
Value->Rect.Width = AWidth;
AWidth = FPageRoot->Rect.Height;
alen = ConversionUnit(FMargin.Unit,puPixes,FMargin.Top.Value);
Value->Rect.Top = alen;
AWidth -= alen;
alen = ConversionUnit(FMargin.Unit,puPixes,FMargin.Bottom.Value);
AWidt-= alen;
Value->Rect.Height = AWidth;
break;
}
default:
{
TRegionRect Rrect = FList[Style-1]->Value->Rect;
Value->Rect = Rrect;
if(Style!=bsTitle)
Value->Rect.Top = Rrect.Top + Rrect.Height;
Value->Rect.Height = 40;
break;
}
}
InsertTree(rsBand,Value);//将它插入你的属性列表中效果一样的
Value = NULL;
delete Value;

}
//小弟的动态报表设计器不久也完成了,现在都能测试了,一起努力吧,有什么问题一起探讨一下。
 
可惜我对cb一点也不懂,不过还是很感谢你给的代码,我现在正在尝试着做一个简单点的报表。。。。。
谢谢!
 
使用REPORTEXPERT,看对各种表的处理!
http://www.smartparter.com/download/ReportExpert20.zip
 
关注,我正在想做一个能让用户动态增加报表内容,动态调整字段位置的报表程序。希望各位富翁多提意见。
 
用DBGridEh可以记忆字段的增减,保存在注册表里
 
Ehlib控件
可以直接打印DbGridEh表所显示的内容
动态控件字段即列
可能将此列设为显示与隐藏
下载该控件
Delphi园地
http://mydelphi.8u8.com
 
用什么都可以写一点代码就就行了
不过
如果要用户直接可以修改的话
建议用fastreport
 
支持caffen,我最近也在用fastrport——你想怎么动态都可以,绝对能完成楼主的需求。
 
最好是用Ehlib控件了,你用一个窗口显示所有字段名,让用户输入每一字段的列宽,
为0就是不显示和不打印了,下次想打印时再重新设置,可以直接拖动列宽以适应打印的
纸张。想让用户多些设置选择,可使用ExpressPrinting System,一样是打印数据表格的
控件,对于简单的打印完全胜任,不用自己设计报表这么麻烦。
 
我也正在搞这个问题,既然fastreport这么厉害,我试试
 
顶部