Delphi 打印使用文件重写功能
Posted
技术标签:
【中文标题】Delphi 打印使用文件重写功能【英文标题】:Delphi Printing using file rewrite function 【发布时间】:2021-01-15 06:38:20 【问题描述】:在我的应用程序中,所有打印机都使用printer.printers
命令列出。这仅列出打印机名称。选择后,它会保存在数据库中。
稍后,使用AssignFile
函数将这个打印机名称分配给一个文本文件。
并且使用Rewrite
函数完成打印。
如果我在数据库中将选定的打印机保存为\\PCname\printer name
,然后将其与Rewrite
函数一起使用,那么它可以工作。
但如果我们只在数据库中保存打印机名称,则打印不会发生。
是否需要保存\\PCname\printer name
路径?或者有没有其他解决方案。
【问题讨论】:
@DelphiCoder:是的,请......这对我们会有帮助。 @DelphiCoder:我接受了你的回答。谢谢。 【参考方案1】:使用 Pascal 文件访问函数进行打印的另一种方法是将 Windows API 用于后台处理程序。
function PrintWithSpooler(const Name: string; const Data: AnsiString): integer;
var
hPrinter: THandle;
DocInfo: TDocInfo1;
bSuccess: boolean;
dwBytesWritten: DWORD;
begin
result := S_OK;
bSuccess := false;
DocInfo.pOutputFile := nil;
DocInfo.pDatatype := 'RAW';
DocInfo.pDocName := 'Label';
if OpenPrinter(PChar(Trim(Name)), hPrinter, nil) then
begin
try
if StartDocPrinter(hPrinter, 1, @DocInfo) > 0 then
begin
try
if StartPagePrinter(hPrinter) then
begin
try
bSuccess := WritePrinter(hPrinter, Pointer(Data), Length(Data), dwBytesWritten);
finally
EndPagePrinter(hPrinter);
end;
end;
finally
EndDocPrinter(hPrinter);
end;
end;
finally
ClosePrinter(hPrinter);
end;
end;
if not bSuccess then
begin
result := GetLastError;
// in case there was no error from GetLastError
if result = S_OK then
result := S_FALSE;
end;
end;
【讨论】:
【参考方案2】:显然,您需要 PCname。你可以按照你说的把它保存在数据库中,但是如果从多台PC上使用数据库就会出现问题,只在数据库中保存打印机名称并在使用打印机的PC上添加PCname。您可以使用GetComputerName获取PCname
【讨论】:
以上是关于Delphi 打印使用文件重写功能的主要内容,如果未能解决你的问题,请参考以下文章
Delphi实现窗口一直在桌面工作区内显示(重写WM_WINDOWPOSCHANGING消息)
当我试图重写计算机上现有文件中的某些行时,为啥我的程序最后打印了 2 行相同的行? [复制]
delphi中覆盖override父类的静态方法和虚函数有啥不同?
转: Delphi的OverRideOverLoad和Virtual方法