3
我的程序是用Delphi(面向對象的pascal)編寫的。當我嘗試打印任何東西時,我會收到消息「沒有當前選定的默認打印機。」在沒有安裝打印機的計算機上。如何查找是否安裝了打印機(使用Delphi)
爲了防止這種情況,我想檢查是否安裝了任何打印機。有沒有辦法檢查是否安裝了打印機?
我的程序是用Delphi(面向對象的pascal)編寫的。當我嘗試打印任何東西時,我會收到消息「沒有當前選定的默認打印機。」在沒有安裝打印機的計算機上。如何查找是否安裝了打印機(使用Delphi)
爲了防止這種情況,我想檢查是否安裝了任何打印機。有沒有辦法檢查是否安裝了打印機?
use Printers;
Printer.Printers.Count
給你的打印機安裝
的意見形成打印機單元在D2007數量:
{ TPrinter }
{ The printer object encapsulates the printer interface of Windows. A print
job is started whenever any redering is done either through a Text variable
or the printers canvas. This job will stay open until EndDoc is called or
the Text variable is closed. The title displayed in the Print Manager (and
on network header pages) is determined by the Title property.
EndDoc - Terminates the print job (and closes the currently open Text).
The print job will being printing on the printer after a call to EndDoc.
NewPage - Starts a new page and increments the PageNumber property. The
pen position of the Canvas is put back at (0, 0).
Canvas - Represents the surface of the currently printing page. Note that
some printer do not support drawing pictures and the Draw, StretchDraw,
and CopyRect methods might fail.
Fonts - The list of fonts supported by the printer. Note that TrueType
fonts appear in this list even if the font is not supported natively on
the printer since GDI can render them accurately for the printer.
PageHeight - The height, in pixels, of the page.
PageWidth - The width, in pixels, of the page.
PageNumber - The current page number being printed. This is incremented
when ever the NewPage method is called. (Note: This property can also be
incremented when a Text variable is written, a CR is encounted on the
last line of the page).
PrinterIndex - Specifies which printer in the TPrinters list that is
currently selected for printing. Setting this property to -1 will cause
the default printer to be selected. If this value is changed EndDoc is
called automatically.
Printers - A list of the printers installed in Windows.
Title - The title used by Windows in the Print Manager and for network
title pages. }
下面是一個代碼片段,填充一個圖像組合框的所有打印機目前安裝:
procedure TMyForm.RefreshPrinterList;
var
I: Integer;
NewItem: TComboExItem;
PPrinterEnumArray, PLocator: PPrinterInfo2;
ArraySize, BufferSize: cardinal;
strBuffer: string;
const
idx_Default_Net_printer = 0;
idx_Net_printer = 1;
idx_Default_Local_printer = 2;
idx_Local_printer = 3;
begin
DefaultPrinterName := getDefaultPrinterName;
cbPrinterList.ItemsEx.Clear;
// S.G. 4/4/2008: list all other printers
// S.G. 4/4/2008: Get the necessary buffer size
ArraySize := 0;
BufferSize := 0;
PPrinterEnumArray := nil;
EnumPrinters(PRINTER_ENUM_LOCAL or PRINTER_ENUM_CONNECTIONS, nil, 2, nil, 0, BufferSize, ArraySize);
PPrinterEnumArray := AllocMem(BufferSize);
try
if EnumPrinters(PRINTER_ENUM_LOCAL or PRINTER_ENUM_CONNECTIONS, nil, 2, PPrinterEnumArray, BufferSize, BufferSize, ArraySize) then
begin
PLocator := PPrinterEnumArray;
if ArraySize > 0 then
begin
for I := 0 to ArraySize - 1 do // Iterate
begin
NewItem := cbPrinterList.ItemsEx.Add;
strBuffer := StrPas(PLocator^.pPrinterName);
UniqueString(strBuffer); // make sure we have a unique string instance and not a pointer
NewItem.Caption := strBuffer;
if AnsiSameText(DefaultPrinterName, strBuffer) then
begin
// default printer
if (PRINTER_ATTRIBUTE_LOCAL AND PLocator^.Attributes) <> 0 then
begin
// Local, default printer
NewItem.ImageIndex := idx_Default_Local_printer;
end
else
begin
// Network default printer
NewItem.ImageIndex := idx_Default_Net_printer;
end;
cbPrinterList.ItemIndex := NewItem.Index;
end
else
begin
// default printer
if (PRINTER_ATTRIBUTE_LOCAL AND PLocator^.Attributes) <> 0 then
begin
// Local, default printer
NewItem.ImageIndex := idx_Local_printer;
end
else
begin
// Network default printer
NewItem.ImageIndex := idx_Net_printer;
end;
end;
Inc(PLocator);
end; // for
end;
end;
finally // wrap up
FreeMem(PPrinterEnumArray);
end; // try/finally
end;