我试图用Delphi 2010打印文本文件。我发现了一些代码,但是当我运行时,它要求保存一个xps文件,它没有显示打印对话框。代码位于http://www.delphipages.com/forum/showthread.php?t=72986
procedure TForm1.print_btnClick(Sender: TObject);
var
filename: string;
begin
filename := 'printfile.txt';
ShellExecute(handle, 'print', pchar(Filename), nil, nil, SW_NORMAL);
end;
另一个位于http://www.delphibasics.co.uk/Article.asp?Name=Printing
这个一次又一次地循环“ok”对话框,它不能打印任何东西。
问候
答案 0 :(得分:3)
显然,计算机上的默认打印机是XPS文件生成器。如果在Windows资源管理器中从该文件的上下文菜单中选择“打印”命令,则会得到相同的行为。将您的默认打印机更改为其他内容。
答案 1 :(得分:3)
选项1
您可以编写自己的打印代码。一个简单的例子(uses Printers
):
procedure PrintTextFile(const FileName: string; const Numbering: boolean = true);
const
FONT_NAME = 'Times New Roman';
FONT_SIZE = 10;
var
MARGIN: integer;
sl: TStringList;
i, h: Integer;
r, rFooter: TRect;
s: string;
DocEnd: integer;
begin
with TPrintDialog.Create(nil) do
try
if not Execute then
Exit;
finally
Free;
end;
sl := TStringList.Create;
try
sl.LoadFromFile(FileName);
Printer.BeginDoc;
Printer.Title := FileName; // or application name or sth else
Printer.Canvas.Font.Name := FONT_NAME;
Printer.Canvas.Font.Size := FONT_SIZE;
MARGIN := 5*Printer.Canvas.TextWidth('M');
DocEnd := Printer.PageHeight - MARGIN;
if Numbering then
begin
dec(DocEnd, 2*Printer.Canvas.TextHeight('8'));
rFooter := Rect(0, DocEnd, Printer.PageWidth, Printer.PageHeight - MARGIN);
DrawText(Printer.Canvas.Handle,
PChar(IntToStr(Printer.PageNumber)),
length(IntToStr(Printer.PageNumber)),
rFooter,
DT_SINGLELINE or DT_CENTER or DT_BOTTOM);
end;
r.Left := MARGIN;
r.Top := MARGIN;
for i := 0 to sl.Count - 1 do
begin
r.Right := Printer.PageWidth - MARGIN;
r.Bottom := DocEnd;
s := sl.Strings[i];
if s = '' then s := ' ';
h := DrawText(Printer.Canvas.Handle, // Height of paragraph on paper
PChar(s),
length(s),
r,
DT_LEFT or DT_TOP or DT_WORDBREAK or DT_CALCRECT);
if r.Top + h >= DocEnd then
begin
Printer.NewPage;
if Numbering then
DrawText(Printer.Canvas.Handle,
PChar(IntToStr(Printer.PageNumber)),
length(IntToStr(Printer.PageNumber)),
rFooter,
DT_SINGLELINE or DT_CENTER or DT_BOTTOM);
r.Top := MARGIN;
r.Bottom := DocEnd;
end;
if h > Printer.PageHeight - 2*MARGIN then
raise Exception.Create('Line too long to fit on single page.');
DrawText(Printer.Canvas.Handle,
PChar(s),
length(s),
r,
DT_LEFT or DT_TOP or DT_WORDBREAK);
inc(r.Top, h);
end;
Printer.EndDoc;
finally
sl.Free;
end;
end;
警告:如果文本文件中的任何一行太宽以至于无法放在单张纸上(在包装完毕后),上面的代码不就可以正常工作)。我现在太累了,无法解决这个问题。
选项2
一个令人讨厌的伎俩是使用不可见的TRichEdit
进行打印。
procedure PrintTextFile(AOwner: TWinControl; const FileName: string);
begin
with TRichEdit.Create(nil) do
try
Visible := false;
Parent := AOwner;
Lines.LoadFromFile(FileName);
with TPrintDialog.Create(nil) do
try
if Execute then
Print(FileName);
finally
Free;
end;
finally
Free;
end;
end;
我建议反对它,因为它有点太讨厌。
答案 2 :(得分:1)
在您的计算机上设置默认打印机 - 确保您具有物理访问权限和正确的用户权限才能使用它。没有设置其他内容时,xps打印机是MS默认打印驱动程序。