[Error] Unit1.pas(206): Undeclared identifier: 'printer'
代码是
procedure TForm1.Button3Click(Sender: TObject);
const
   LeftBlank=1;
   RightBlank=1;
   TopBlank=1;
   ButtomBlank=1;
//定义四周的页边距,单位厘米
var
   PointX,PointY:integer;
   PointScale,PrintStep:integer;
   s:string;
   x,y:integer;
   i:integer;
   
begin 
//获取当前打印机的分辨率
PointX:=Trunc(GetDeviceCaps(Printer.Handle,LOGPIXELSX)/2.54);
PointY:=Trunc(GetDeviceCaps(Printer.Handle,LOGPIXELSY)/2.54);
//根据打印机和屏幕的分辨率计算出从屏幕转换到打印机的比例
PointScale:=Trunc(GetDeviceCaps(Printer.Handle,LOGPIXELSX)/Screen.PixelsPerInch+0.5);
//设置打印机横向打印
printer.Orientation:=poLandscape;
//设置打印机打印的字体和大小
printer.Canvas.Font.Name:='宋体';
printer.canvas.Font.Size:=10;
//根据字体的大小确定每行的高度
   s:='Some Famous Corp.';
    PrintStep:=printer.canvas.TextHeight(s)+16;
    //设置打印的起点位置
   x:=PointX*LeftBlank;
   y:=PointY*TopBlank;
 //DataSource1是DBGrid1所连接的数据源
if ((DataSource1.DataSet).Active=true) and ((DataSource1.DataSet).RecordCount)0) then
//判断数据源是否正常连接以及是否有数据可以进行打印输出
     begin
       printer.BeginDoc;
        (DataSource1.DataSet).First;
        //移动到数据表的第一条记录
while not (DataSource1.DataSet).Eof do
        //进行循环输出数据表中的每一行.
         begin
//循环打印DBGrid中当前行的所有列
            for i:=0 to DBGrid1.FieldCount-1 do
             begin
                //假如所要打印的列超出了打印范围,则忽略该列
                if (x+DBGrid1.Columns.Items[i].Width*PointScale)<=(Printer.PageWidth-PointX*RightBlank) then
                  begin
//画表格线
//在每页的第一行打印表头
Printer.Canvas.Rectangle(x,y,x+DBGrid1.Columns.Items[i].Width*PointScale,y+PrintStep); 
if y=PointY*TopBlank then
Printer.Canvas.TextOut(x+8,y+8,DBGrid1.Columns[i].Title.Caption)
else
Printer.Canvas.TextOut(x+8,y+8,DBGrid1.Fields[i].asString);
end; 
//计算下一列的横坐标
x:=x+DBGrid1.Columns.Items[i].Width*PointScale;
end;
if not (y=PointY*TopBlank) then 
                (DataSource1.DataSet).next;
           x:=PointX*LeftBlank;
y:=y+PrintStep; 
//换页
           if (y+PrintStep)>(Printer.PageHeight-PointY*BottomBlank) then
            begin
              Printer.NewPage;
              y:=PointY*TopBlank;
            end;
        end;
        printer.EndDoc;
    (DataSource1.DataSet).First;
      Application.MessageBox(′打印完成′,′打印′,32);
    end;end;
end;

解决方案 »

  1.   

    你要先声明一个TPrinter类型的变量Printer,然后记住Use Printers单元即可!
      

  2.   

    谢谢大家,现在可以了,但我想根据dbgrid1的栏数来决定横向或竖向打印,下面的代码编译有问题,为什么?
    在前面申明
    var
      Form1: TForm1;
      p:TPrinterOrientation;
    然后
    procedure TForm1.Button3Enter(Sender: TObject);
    begin
    if dbgrid1.Columns>4 then
      begin
    //设置打印机横向打印
       p:=poLandscape;
      end else
      begin
       p:=poPortrait;
      end;
    end;
    出现这个错误:
    [Error] Unit1.pas(250): Incompatible types
      

  3.   

    哈,找到错了,
    if dbgrid1.Columns  .count>4    then
      就行了,哈。准备结了。