2010-06-07 4 views
3

Mon programme est écrit en Delphi (pascal orienté objet). Lorsque j'essaie d'imprimer quoi que ce soit, je reçois le message "Il n'y a pas d'imprimante par défaut actuellement sélectionnée". sur des ordinateurs sans imprimante installés.Comment trouver si des imprimantes sont installées (en utilisant Delphi)

Pour éviter cela, je veux vérifier si des imprimantes sont installées. Est-il possible de vérifier si des imprimantes sont installées?

Répondre

6
use Printers; 

Printer.Printers.Count vous donne le nombre d'imprimantes installées

Les commentaires forment l'unité Imprimantes à 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. } 
1

Voici un extrait de code qui alimente une zone de liste déroulante d'image avec toutes les imprimantes actuellement installé:

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; 
Questions connexes