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方法

java 中 一般打印对象不都是需要重写toString()方法吗?

重写慢日志解析程序,实现打印慢SQL信息及其所属数据库