StringGrid打印(100分)

  • 主题发起人 主题发起人 老金
  • 开始时间 开始时间

老金

Unregistered / Unconfirmed
GUEST, unregistred user!
我在进行统计过程中,需要根据用户的要求来把结果放到一个StringGrid中,然后打印,由于StringGrid的长和宽都是不定的,也就是列数和行数每一次都不一样,而用户又要能打印出报表,请哪位高手指教一下。
 
既然不固定,如果列数超出打印纸宽度怎么办呢?
 
stringgrid.paintto(printer.canvas.handle, 0,0)
 
我也遇到了这个问题,我用
stringgrid.paintto(printer.canvas.handle, 0,0)
打印一个stringgrid, 但是打出来的表格只有3厘米宽
如何调整? 如何设置 pagewidth和pageheight?
是不是可以把canvas中的图像放大?

 
我用如下的程序打印, 把位图放大到纸张大小,
但是, 图像很粗糙, 如果要求不高, 可以凑合着用
procedure TForm1.SpeedButton8Click(Sender: TObject);
var
bitmap:Tbitmap;
rect:Trect;
begin
bitmap:=Tbitmap.create;
bitmap.width:=stringgrid1.Width;
bitmap.height:=stringgrid1.height;
stringgrid1.paintto(bitmap.canvas.handle,0,0);
rect.top:=150;
rect.left:=150;
rect.right:=printer.pagewidth-150;
rect.bottom:=bitmap.height*printer.pagewidth div bitmap.Width+50;
printer.begin
doc;
printer.canvas.stretchdraw(rect, bitmap);
printer.enddoc;
end;

线性差值法 我可不会, 后没有比较简单的方法可以打印出
较好的质量,
实在不行, 只好从表格中读数据, 自己画标, 一个一个写到
printer.canvas理了.
 
你可以试一试Ehlib,一个扩展的DbGrid控件,自带打印,超宽自动分页打印,很方便。
 
自己做一个打印控件吧!
做一个这样的控件也不是很复杂呀!其实也就是在Print.Canvas上画出你的图形罢了.
至于如何画,参考一下TCusotmGrid中的Paint函数,一般而言,你可以将其中的Canvas换成
你的Printer.Canvas就行了,不过,如果要WYSIWYG(所见即所得)的话,你就需要一些特殊的
操作,具体而言,也就是将其中的像素值通过
GetDeviceCaps之类的函数转换成在两个Canvas中看上去一样的长度!
再有具体一点,就是提供一个属性,我的做法是做一个PrinterInfo属性,里面的长度单位都
是cm的,然后,设置了之后,也就可以啦
 
为什么不用TAdvStringGrid呢?去下一个吧,需要的话我可以E-Mail给你,只要你肯给我份久可以了
 
我是在c++ Builder 环境下实现的:
定义一 TlistView PList;
将 StringGrid 下的内容按每个网个单元,逐行写入 PList;
调用下面的函数打印:
void TViewParaFrm::RawPrintQEvent()
{
char szTemp[200];
char szDriver[80];
char szDevice[80];
char szPort[80];
int hDevMode;
SYSTEMTIME st;
GetLocalTime(&st);
//设置打印标题
sprintf(szTemp," %s打印 ( %d年%02d月%02d日 %02d:%02d:%02d )",
ComboBox1->Items->Strings[ComboBox1->ItemIndex].c_str(),st.wYear,st.wMonth,st.wDay,
st.wHour,st.wMinute,st.wSecond);
RawPrinter1->Title = +"打印";
TPrinter *Printer1;
Printer1 = Printer();
hDevMode = 0;
Printer1->GetPrinter(szDevice,szDriver,szPort,hDevMode);
RawPrinter1->DriverName = AnsiString(szDriver);
RawPrinter1->PortName = AnsiString(szPort);
RawPrinter1->DeviceName = AnsiString(szDevice);
RawPrinter1->startraw();
RawPrinter1->write(szTemp);
RawPrinter1->writeln();
//逐行打印
for(int i=0;i<pList->Count;i++)
{
sprintf(szTemp," %s",pList->Strings.c_str());
RawPrinter1->write(szTemp);
RawPrinter1->writeln();
}
RawPrinter1->endraw();
}
C++ Builder 与 Delphi 用法相似, 只是语法不同。
 
参见《delphi开发大全》打印部分
 
heat:
哪儿能找到《delphi开发大全》?
 
自动生成HTML文件,用IE打印
 
请问哪位有Rxlib For D5的?
 
本人也碰到这种问题,TStringGrid内容的打印,要求TStringGrid的列,行,以及列的顺序都可以
任意调整,后来专门写了一控件TLdGridReport ,可轻松解决上述TStringGrid打印问题,
如果需要可以E_Mail to You !
 
接受答案了.
 
To Chenxy
可以E_Mail To Me?
Yourfriendq@sina.com
 
To Chenxy
可以E_Mail To Me?
nmks2000@sina.com
 
To Chenxy
可以E_Mail To Me?
lwgygz@sina.com
 
后退
顶部