Memo打印1

 
 
 
 
 
Delphi 打印Memo里面的内容 实现的功能和记事本的打印的功能一样
打印保存为文件时此时的文件名如何设置?
当Memo里的文本数量巨大时 窗体正在打印会出现点数字显示问题 闪烁
 
PageSetup没做任何功能

 
 
 
 
 
 
 
 
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    PrinterSetupDialog1: TPrinterSetupDialog;
    Button2: TButton;
    PrinterSetupDialog2: TPrinterSetupDialog;
    PrintDialog2: TPrintDialog;
    Label1: TLabel;
     procedure Button1Click(Sender: TObject);
     procedure Button2Click(Sender: TObject);
   private
     { Private declarations }
   public
     { Public declarations }
   end;

var
  Form1: TForm1;

implementation
uses printers, Unit2;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
   PrinterSetupDialog1.Execute; //选择输出的打印机以及其他打印控制选项
end;




procedure MemoPrinter(Memo:TMemo;TitleStr: string = '无标题');
var
Left:Integer;
Top:Integer;
 i,j,x,y : integer;   //PageHeight,
PagesStr: String;
posX,posY,Posx1,posY1:Integer;
PrintDialog1:TPrintDialog;
begin
    Left := 500;
    Top := 800;
    y := Top; // 40
    x := Left; // 80
    j:=1;
  PrintDialog1 :=TPrintDialog.Create(Application);
   if  PrintDialog1.Execute then
     With Printer do
     begin
      BeginDoc; // 另存的打印的文件名 如何实现  默认为 .jnt
      Form2.Show;

      Canvas.Font :=Memo.Font;


      //-------------------------------------------------------------------------
      //打印文件名的标题
      // TitleStr:='无标题';
      posx :=(PageWidth div 2) - Length(TitleStr) * 50 ; //x+1800;
      posy := (PageHeight * 6) div 100;

       //第N页的标题
      PagesStr :=Format( '第 %d 页',[Printer.PageNumber]);
      posX1 :=(PageWidth div 2) - Length(PagesStr) * 50;
      posY1 :=(PageHeight * 92) div 100;
      //-------------------------------------------------------------------------
       for i := 0 to Memo.Lines.Count - 1 do
       begin
        Canvas.TextOut(x,y,Memo.Lines[i]);    //TextOut(Left,Top,string);
        y := y + Memo.Font.Size * 10;           //Memo.Font.Size*10为行间距 第1行与第2行的间距,2和3,3与4,...

         if(y > PageHeight - Top) then
           begin
            Canvas.TextOut(posx,posy,TitleStr);
             for j := 1 to Printer.PageNumber do
             begin
                PagesStr := Format( '第 %d 页',[j]);
                Canvas.TextOut(posX1,posY1,PagesStr);
                Application.ProcessMessages;
                Form2.Label1.Caption :=System.Concat( ' 正在打印',# 13# 10,TitleStr,# 13# 10,Format( '第 %d 页',[j]));
                 if Form2.Tag = 1 then
                 begin
                  Abort;
                  Exit;
                 end;
             end;
            NewPage;
            y := Top;
           end;
       end;
        Canvas.TextOut( posX, posY, TitleStr );
        Canvas.TextOut( posX1,posY1,Format( '第 %d 页',[j]) );
        Form2.Close;
        Form1.Label1.Caption :=System.Concat( ' 正在打印',# 13# 10,TitleStr,# 13# 10,Format( '第 %d 页',[j]));
      EndDoc;
      // Form1.Caption:= Format('x = %d y = %d Width = %d Height = %d ',[x,y,PageWidth,Pageheight]);
     end;
end;



procedure TForm1.Button2Click(Sender: TObject);
begin
    MemoPrinter(Memo1, 'Hello Roman');
end;


end.
 
 
 

unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm2 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
     procedure Button1Click(Sender: TObject);
   private
     { Private declarations }
   public
     { Public declarations }

   end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

uses Unit1;

procedure TForm2.Button1Click(Sender: TObject);
begin
    Tag := 1;
    Close;
end;

end.
 
 
 
 





附件列表

 

转载于:https://www.cnblogs.com/xe2011/p/3374229.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值