Newsgroup: it.comp.lang.delphi
Titolo: Stampante ..... ancora lei !!!

Ciao a tutti,
       scusate se ritorno su questo argomento un po ostico ..... ma ci sono 
ancora dei problemi irrisolti !!!!
Ho 3 stampanti installate sul pc, di cui due sono dei convertitori per pdf 
(esempio pdf creator ecc...) e la terza e' una stampante vera in rete (per 
esempio \\server\stampante1)
Premetto che la stampa viene eseguita, e che sto cercando di perfezionare la 
procedura di stampa inserendo la possibilita' di fare alcune scelte che, 
secondo me, servono.
Una di queste riguarda la partenza della stampa, se dalla prima o 
dall'ultima pagina. Al momento la stampa viene eseguita coni settaggi 
trovati nella stampante, a volte parte dalla prima pagina, a volte 
dall'ultima. Sembra un problema da niente ma non e' cosi', infatti se la 
stampa riguarda una serie di etichette e queste etichette sono state scelte 
su quattro fogli diversi e la loro disposizione e' casuale su questi fogli 
(e' il caso di un foglio a cui sono state tolte 6 etichette centrali) e si 
sono selezionate le etichette su cui stampare, partire dal primo folgio o 
dall'ultimo non e' lo stesso. Dato che nel driver di stampa c'e' un checkbox 
che indica se si parte dalla prima pagina o dall'ultima, pensavo di 
riproporre il criterio di partrnza della stampa nella finestra della preview 
di stmapa e di scegliere il modo di stampa da li (come word o altri 
programmi commerciali) ma....... non so come fare !!!! anche perche' non ho 
visto questo flag nei var printerinfo.
Il secondo problema e' che non riesco a gestire i vari stati della 
stampante, se e' aperta, in pausa, senza fogli. Queste informazioni sono 
contenute nella struttura PrinterInfo2, ma anche qui (per la stmapante in 
rete) non riesco ad ottenre risultati. Infatti ogni volta che interrogo la 
stampante, con il codice sotto riportato, ottengo sempre e solo READY 
(niente nome stampante e tutto il resto) anche se :
- la stampante e' spenta, aperta, senza fogli, senza cartucce ecc...
- Il pc dove si trova la stampante e' spento !!!!
- Seleziono un convertiore di pdf locale (installato sul pc da cui compilo)
Ecco il codice premesso che :
- Uso dlephi 6
- Windows XP SP3
- Nella form c'e' solo un TMemo
procedure TForm1.FormCreate(Sender: TObject);
Var S : String;
begin
  S:=Printer.Printers[Printer.PrinterIndex];
  ShowPrinterStatus(S);
end;
Procedure TForm1.ShowPrinterStatus( const PrinterName : String );
Var PrinterInfo: PPrinterInfo2;
    PrinterHandle : THandle;
    Stat : LongBool;
    requiredSize : Cardinal;
Begin
  Try
    Stat := OpenPrinter( PChar(PrinterName), PrinterHandle, NIL );
    If ( Stat ) Then
    Begin
      Try
        GetMem( PrinterInfo, 1024 );
        Stat := GetPrinter(PrinterHandle, 2, PrinterInfo, 
1024,@requiredSize );
        Memo1.Lines.Add('Printer Name Is: ' +PrinterInfo^.pPrinterName); // 
qui e' sempre vuoto !!!!!
        Case PrinterInfo^.Status of
          0 : Memo1.Lines.Add('Printer Ready!'); // Viene sempre restituito 
questo valore anche se la stampante e' aperta, spenta ecc....
          PRINTER_STATUS_DOOR_OPEN : Memo1.Lines.Add('Door Open');
          PRINTER_STATUS_POWER_SAVE : Memo1.Lines.Add('Power Save Mode');
          PRINTER_STATUS_WARMING_UP : Memo1.Lines.Add('Warming Up');
          PRINTER_STATUS_PAPER_OUT : Memo1.Lines.Add('Out of Paper');
        End;
       Finally
       FreeMem( PrinterInfo, 1024 );
       End;
     End
     Else
     Begin
       Memo1.Lines.Add('NA');
       Memo1.Lines.Add('Cannot Open Printer: ' + PrinterName);
     End;
   Finally
   ClosePrinter( PrinterHandle );
   End;
End;
Qualche idea su come far funzionare il tutto ???? se ci sono riusciti quelli 
della microsoft, adobe ecc possiamo farcela anche noi (e' vero che loro 
usano il visual c o c++ ma anche il buon delphi non e' da buttare !!!).
Grazie a tutti
Ciao, Daniele

http://support.microsoft.com/kb/160129