Delphi 使用文件重写功能打印
Delphi Printing using file rewrite function
在我的应用程序中,所有打印机都使用 printer.printers
命令列出。这仅列出打印机名称。选择后,它会保存在数据库中。
稍后,使用 AssignFile
函数将此打印机名称分配给文本文件。
打印是使用 Rewrite
函数完成的。
如果我在数据库中将选定的打印机保存为 \PCname\printer name
,然后将其与 Rewrite
函数一起使用,那么它就可以工作了。
但是,如果我们只在数据库中保存打印机名称,则不会进行打印。
是否需要保存\PCname\printer name
路径?或者有没有其他解决办法。
显然,您需要 PCname。可以按照你说的保存到数据库中,但是如果数据库是从多台PC使用的,就会出现问题,只能在数据库中保存打印机名称,并在使用打印机的PC上添加PCname。您可以使用 GetComputerName
获取 PCname
使用 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;
在我的应用程序中,所有打印机都使用 printer.printers
命令列出。这仅列出打印机名称。选择后,它会保存在数据库中。
稍后,使用 AssignFile
函数将此打印机名称分配给文本文件。
打印是使用 Rewrite
函数完成的。
如果我在数据库中将选定的打印机保存为 \PCname\printer name
,然后将其与 Rewrite
函数一起使用,那么它就可以工作了。
但是,如果我们只在数据库中保存打印机名称,则不会进行打印。
是否需要保存\PCname\printer name
路径?或者有没有其他解决办法。
显然,您需要 PCname。可以按照你说的保存到数据库中,但是如果数据库是从多台PC使用的,就会出现问题,只能在数据库中保存打印机名称,并在使用打印机的PC上添加PCname。您可以使用 GetComputerName
获取 PCname使用 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;