最近要做一个打印组件,要能够实现比如说,我现在有一张能够打印的纸,但是上面的图片,文字等都没有排版好,我这个打印组件要能够自动给他布局好,然后打印!请大家帮忙!

解决方案 »

  1.   

    用TQuickRep来作应该要方便一些。
    不过TNND,QuickRpt只有DCU,没有Pas文件
      

  2.   

    我是说要能把内容自动排版好,不一定只有自动对齐这个问题,还有图片的排放位置
    类似WORD里边的一个东西,我忘了
      

  3.   

    没看明白你的意思。但我觉得FastReport已非常不错了,他本身还支持Script,一般要求的功能都可直接或间接完成。
      

  4.   

    给你个参考的,一个可直接打印Panel组件,你的要求俺不会-_-||unit PPanel;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ExtCtrls, Printers, StdCtrls, DBCtrls, Mask, ComCtrls, Grids, DBGrids,
      Chart;type
      TPPanel = class(TPanel)
      private
        { Private declarations }
        FShowBorder:Boolean;
      protected
        { Protected declarations }
      public
        { Public declarations }
      published
        { Published declarations }
        Procedure Print(AGrid:TObject;PPI:Integer);
        Procedure About;    Property ShowBorder:Boolean Read FShowBorder Write FShowBorder;
      end;procedure Register;implementationprocedure Register;
    begin
      RegisterComponents('Standard', [TPPanel]);
    end;Procedure TPPanel.About;
    Begin
         Application.MessageBox('PPanel 作者:彭富章 2000.03','关于 PPanel',MB_OK+MB_ICONINFORMATION);
    End;Procedure TPPanel.Print(AGrid:TObject;PPI:Integer);
    Var SX,SY:Real;
        NowPage:Integer;
        ControlCount,I,N:Integer;
        AObj:TControl;
        ARect:TRect;
        PX,PY:Integer;
        MorePage:Boolean;
        Stemp:String;    WidthArray:Array[1..24] of Integer;
        ValueArray:Array[1..24] Of String;
        ColumnCount,X,Y,NowX,NowY:Integer;    NowRow:Integer;
    Begin
         Try
         SX:=GetDeviceCaps(Printer.Handle,logPixelsX)/PPI;
         SY:=GetDeviceCaps(Printer.Handle,logPixelsY)/PPI;     ControlCount:=Self.ControlCount;     NowPage:=1;
         Printer.BeginDoc;
         MorePage:=True;
         With Printer Do
         While MorePage Do
         Begin
              MorePage:=False;
              
              //print a page
              For I:=0 To ControlCount-1 Do
              Begin
                   AObj:=Self.Controls[I];
                   ARect:=AObj.BoundsRect;               PX:=Round((ARect.Left+4)*SX);
                   PY:=Round((ARect.Top+2)*SY);               ARect.Left:=Round(ARect.Left*SX);
                   ARect.Top:=Round(ARect.Top*SY);
                   ARect.Right:=Round(ARect.Right*SX);
                   ARect.Bottom:=Round(ARect.Bottom*SY);               If FShowBorder Then
                   If ((AObj Is TEdit) OR (AObj Is TDBEdit) OR (AObj Is TMaskEdit) OR (AObj Is TDateTimePicker) OR (AObj Is TComboBox)
                   OR (AObj Is TDbComboBox) OR (AObj Is TMemo) OR (AObj Is TDBmemo) OR (AObj Is TDBGrid) OR (AObj Is TStringGrid)) Then
                   Begin
                        Canvas.Pen.Width:=2;
                        Canvas.MoveTo(ARect.Left,ARect.Top);
                        Canvas.LineTo(ARect.Right,ARect.Top);
                        Canvas.LineTo(ARect.Right,ARect.Bottom);
                        Canvas.LineTo(ARect.Left,ARect.Bottom);
                        Canvas.LineTo(ARect.Left,ARect.Top);
                        Canvas.Pen.Width:=1;
                   End;               If AObj Is TLabel Then
                   Begin
                        Stemp:=Uppercase(TLabel(AObj).Caption);                    Canvas.Font:=TLabel(AObj).Font;                    If Stemp='%UP%' Then
                        Begin
                             If NowPage>1 Then
                                Canvas.TextOut(ARect.Left,ARect.Top,'接上页');
                        End
                        Else If Stemp='%DOWN%' Then
                             Canvas.TextOut(ARect.Left,ARect.Top,'接下页')
                        Else If Stemp='%PAGE%' Then
                             Canvas.TextOut(ARect.Left,ARect.Top,'第 '+IntToStr(NowPage)+' 页')
                        Else If Stemp='%DATE%' Then
                             Canvas.TextOut(ARect.Left,ARect.Top,'日期:'+FormatDateTime('YYYY-MM-DD',Now))
                        Else If Stemp='%TIME%' Then
                             Canvas.TextOut(ARect.Left,ARect.Top,'时间:'+FormatDateTime('HH:MM:SS',Now))
                        Else
                            Canvas.TextOut(ARect.Left,ARect.Top,TLabel(AObj).Caption);
                   End
                   Else If AObj Is TDBText Then
                   Begin
                        Try
                        If Not TDBText(AObj).DataSource.DataSet.Active Then Continue;                    Canvas.Font:=TDBText(AObj).Font;
                        Canvas.TextOut(ARect.Left,ARect.Top,TDBText(AObj).Field.AsString);
                        Except
                        End;
                   End
                   Else If AObj Is TEdit Then
                   Begin
                        Canvas.Font:=TEdit(AObj).Font;
                        Canvas.TextOut(PX,PY,TEdit(AObj).Text);
                   End
                   Else If AObj Is TDBEdit Then
                   Begin
                        Try
                        If Not TDBEdit(AObj).DataSource.DataSet.Active Then Continue;                    Canvas.Font:=TDBEdit(AObj).Font;
                        Canvas.TextOut(PX,PY,TDBEdit(AObj).Field.AsString);
                        Except
                        End;
                   End
                   Else If AObj Is TMaskEdit Then
                   Begin
                        Canvas.Font:=TMaskEdit(AObj).Font;
                        Canvas.TextOut(PX,PY,TMaskEdit(AObj).Text);
                   End
                   Else If AObj Is TDateTimePicker Then
                   Begin
                        Canvas.Font:=TDateTimePicker(AObj).Font;
                        If TDateTimePicker(AObj).ShowCheckBox Then
                        If TDateTimePicker(AObj).Checked Then
                           Stemp:='■'
                        Else
                            Stemp:='□';                    If TDateTimePicker(AObj).Kind=dtkDate Then
                           Stemp:=Stemp+FormatDateTime('YYYY-MM-DD',TDateTimePicker(AObj).Date)
                        Else
                            Stemp:=Stemp+FormatDateTime('HH:MM:SS',TDateTimePicker(AObj).Time);                    Canvas.TextOut(PX,PY,Stemp);
                   End
                   Else If AObj Is TBevel Then
                   Begin
                        If TBevel(AObj).Shape=bsBottomLine Then
                        Begin
                             Canvas.MoveTo(ARect.Left,ARect.Bottom);
                             Canvas.LineTo(ARect.Right,ARect.Bottom);
                        End
                        Else If TBevel(Aobj).Shape=bsTopLine Then
                        Begin
                             Canvas.MoveTo(ARect.Left,ARect.Top);
                             Canvas.LineTo(ARect.Right,ARect.Top);
                        End
                        Else If TBevel(AObj).Shape=bsLeftLine Then
                        Begin
                             Canvas.MoveTo(ARect.Left,ARect.Top);
                             Canvas.LineTo(ARect.Left,ARect.Bottom);
                        End
                        Else If TBevel(AObj).Shape=bsRightLine Then
                        Begin
                             Canvas.MoveTo(ARect.Right,ARect.Top);
                             Canvas.LineTo(ARect.Right,ARect.Bottom);
                        End
                        Else If TBevel(AObj).Shape=bsBox Then
                        Begin
                             Canvas.MoveTo(ARect.Left,ARect.Top);
                             Canvas.LineTo(ARect.Right,ARect.Bottom);
                        End
                        Else
                        Begin
                             Canvas.MoveTo(ARect.Left,ARect.Top);
                             Canvas.LineTo(ARect.Right,ARect.Top);
                             Canvas.LineTo(ARect.Right,ARect.Bottom);
                             Canvas.LineTo(ARect.Left,ARect.Bottom);
                             Canvas.LineTo(ARect.Left,ARect.Top);
                        End;
      

  5.   

    End
                   Else If AObj Is TComboBox Then
                   Begin
                        Canvas.Font:=TComboBox(AObj).Font;
                        Canvas.TextOut(PX,PY,TComboBox(AObj).Text);
                   End
                   Else If AObj Is TDBComboBox Then
                   Begin
                        If Not TDBComboBox(AObj).DataSource.DataSet.Active Then Continue;                    Canvas.Font:=TDBComboBox(AObj).Font;
                        Canvas.TextOut(PX,PY,TDBComboBox(AObj).Field.AsString);
                   End
                   Else If AObj Is TCheckBox Then
                   Begin
                        Canvas.Font:=TCheckBox(AObj).Font;
                        If TCheckBox(AObj).Checked Then
                           Canvas.TextOut(PX,PY,'■'+TCheckBox(AObj).Caption)
                        Else
                            Canvas.TextOut(PX,PY,'□'+TCheckBox(AObj).Caption);
                   End
                   Else If AObj Is TDBCheckBox Then
                   Begin
                        If Not TDBCheckBox(AObj).DataSource.DataSet.Active Then Continue;                    Canvas.Font:=TDBCheckBox(AObj).Font;
                        If TDBCheckBox(AObj).Checked Then
                           Canvas.TextOut(PX,PY,'■'+TDBCheckBox(AObj).Caption)
                        Else
                            Canvas.TextOut(PX,PY,'□'+TDBCheckBox(AObj).Caption);
                   End
                   Else If AObj Is TRadioButton Then
                   Begin
                        Canvas.Font:=TRadioButton(AObj).Font;
                        If TRadioButton(AObj).Checked Then
                           Canvas.TextOut(PX,PY,'●'+TRadioButton(AObj).Caption)
                        Else
                            Canvas.TextOut(PX,PY,'◎'+TRadioButton(AObj).Caption);
                   End
                   Else If AObj Is TChart Then
                   Begin
                        TChart(AObj).DrawToMetaCanvas(Canvas,ARect);
                   End
                   {Else If AObj Is TDBChart Then
                   Begin
                        TDBChart(AObj).DrawToMetaCanvas(Canvas,ARect);
                   End}
                   Else If AObj Is TImage Then
                   Begin
                        Canvas.StretchDraw(ARect,TImage(AObj).Picture.Graphic);
                   End
                   Else If AObj Is TDBImage Then
                   Begin
                        Canvas.StretchDraw(ARect,TDBImage(AObj).Picture.Graphic);
                   End
                   Else If AObj Is TDBGrid Then
                   Begin
                        Canvas.Font:=TDBGrid(AObj).Font;                    ColumnCount:=TDBGrid(AObj).Columns.Count;
                        If ColumnCount>24 Then ColumnCount:=24;                    NowX:=ARect.Left;
                        For X:=0 To ColumnCount-1 Do
                        Begin
                             WidthArray[X+1]:=Round(TDBGrid(AObj).Columns[X].Width*SX);
                             ValueArray[X+1]:='';
                             NowX:=NowX+WidthArray[X+1];
                             If NowX>ARect.Right Then
                             Begin
                                  ColumnCount:=X;
                                  Break;
                             End;
                        End;                    //draw DBGrid Title
                        NowX:=ARect.Left;
                        NowY:=ARect.Top;
                        For X:=0 To ColumnCount-1 Do
                        Begin
                             Canvas.TextOut(NowX+4,NowY+2,TDBGrid(AObj).Columns[X].Field.DisplayLabel);
                             NowX:=NowX+WidthArray[X+1];
                        End;                    NowY:=NowY+Round((ABS(TDBGrid(AObj).Font.Height)+4)*SY);
                        Canvas.Pen.Width:=2;
                        Canvas.MoveTo(ARect.Left,NowY);
                        Canvas.LineTo(ARect.Right,NowY);
                        Canvas.Pen.Width:=1;                    //draw records
                        While Not TDBGrid(AObj).DataSource.DataSet.Eof Do
                        Begin
                             //draw a record
                             NowX:=ARect.Left;
                             For X:=0 To ColumnCount-1 Do
                             Begin
                                  If TDBGrid(AObj).Columns[X].Field.AsString<>ValueArray[X+1] Then
                                  Begin
                                       ValueArray[X+1]:=TDBGrid(AObj).Columns[X].Field.AsString;
                                       Canvas.TextOut(NowX+8,NowY+2,TDBGrid(AObj).Columns[X].Field.AsString);
                                  End
                                  Else
      

  6.   

    Canvas.TextOut(NowX+8,NowY+2,TDBGrid(AObj).Columns[X].Field.AsString);                              NowX:=NowX+WidthArray[X+1];
                             End;                         TDBGrid(AObj).DataSource.DataSet.Next;
                             NowY:=NowY+Round((ABS(TDBGrid(AObj).Font.Height)+4)*SY);
                             If (NowY+Round((ABS(TDBGrid(AObj).Font.Height)+4)*SY))>ARect.Bottom Then
                                Break;                         Canvas.MoveTo(ARect.Left,NowY);
                             Canvas.LineTo(ARect.Right,NowY);
                             NowY:=NowY+Round(4*SY);
                         End;                    //draw lines
                        Canvas.Pen.Width:=2;
                        NowX:=ARect.Left;
                        For X:=1 To ColumnCount-1 Do
                        Begin
                             NowX:=NowX+WidthArray[X];
                             Canvas.MoveTo(NowX,ARect.Top);
                             Canvas.LineTo(NowX,ARect.Bottom);
                        End;
                        Canvas.Pen.Width:=1;
                   End
                   Else If AObj Is TStringGrid Then
                   Begin
                        Canvas.Font:=TStringGrid(AObj).Font;                    ColumnCount:=TStringGrid(AObj).ColCount;
                        If ColumnCount>24 Then ColumnCount:=24;                    NowX:=ARect.Left;
                        NowY:=ARect.Top;
                        For X:=0 To ColumnCount-1 Do
                        Begin
                             WidthArray[X+1]:=Round(TStringGrid(AObj).ColWidths[X]*SX);
                             NowX:=NowX+WidthArray[X+1];
                             If NowX>ARect.Right Then
                             Begin
                                  ColumnCount:=X;
                                  Break;
                             End;
                        End;                    //draw
                        NowRow:=0;
                        While NowRow<TStringGrid(AObj).RowCount Do
                        Begin
                             //draw a record
                             NowX:=ARect.Left;
                             For X:=0 To ColumnCount-1 Do
                             Begin
                                  Canvas.TextOut(NowX+8,NowY+2,TStringGrid(AObj).Cells[X,NowRow]);
                                  NowX:=NowX+WidthArray[X+1];
                             End;                         Inc(NowRow);
                             NowY:=NowY+Round((ABS(TStringGrid(AObj).Font.Height)+4)*SY);
                             If (NowY+Round((ABS(TStringGrid(AObj).Font.Height)+4)*SY))>ARect.Bottom Then
                                Break;                         Canvas.MoveTo(ARect.Left,NowY);
                             Canvas.LineTo(ARect.Right,NowY);
                             NowY:=NowY+Round(4*SY);
                         End;                    //draw lines
                        Canvas.Pen.Width:=2;
                        NowX:=ARect.Left;
                        For X:=1 To ColumnCount-1 Do
                        Begin
                             NowX:=NowX+WidthArray[X];
                             Canvas.MoveTo(NowX,ARect.Top);
                             Canvas.LineTo(NowX,ARect.Bottom);
                        End;
                        Canvas.Pen.Width:=1;
                   End;
              End;          //if need more page continue
              If AGrid=Nil Then
                 Break;          If AGrid Is TDBGrid Then
                 If Not TDBGrid(AGrid).DataSource.DataSet.Eof Then
                    MorePage:=True;          If MorePage Then
                 NewPage;
                 
              Inc(NowPage);
         End;
         Finally
         Printer.EndDoc;
         End;
    End;end.
      

  7.   

    好了
    我现在知道怎么回事了
    要求是要象WORD一样能够给表格自动调整行间距之类的
    还有就是能调整表格的位置
    大家帮忙
    和WORD的功能差不多!
      

  8.   

    呵呵
    原来是这样
    我还以为真是自动的呢?
    同为河北老乡
    给你顶建议:查看WORD宏,看完之后这样的问题就很容易解决了就
      

  9.   

    帮你顶.其它语言里调用用OCX吧.我习惯用这个.