Newsgroup: it.comp.lang.delphi
Titolo: Stampante ..... continua !!!

Ciao a tutti,
        grazie al link proposto da "theFiller" ho un'idea di come ragiona 
widows (il suo spooler) con la stampante.
In sintesi tutti i documenti che si mandano in stampa vengono gestiti dallo 
spooler e si hanno informazioni sulla stampante SOLO DOPO IL PROCESSO DI 
STAMPA.
Ogni interrogazione fatta alla stampante prima della stampa da come 
risultato, sempre e comunque, READY anche se la stampante e' senza carta, 
aperta, spenta, smontata !!!
Cio' premesso, come fanno i dialogs di windows, word, adobe ecc.. a dare il 
corretto status della stampante PRIMA di lanciare la stampa ???
C'e' qualche codice strano da inviare alla stampante prima della stampa (per 
esempio un codice escape di reset) ???
Infine, argomento non trattato nel documento, com'e' possibile accedere al 
driver di stampa per leggere/settare alcuni parametri (per esempio stampa 
dalla prima all'ultima pagina / stampa dall'ultima alla prima pagina).
Grazie per chiunque abbia gia' risolto questo problema e voglia assistermi.
Ciao Daniele
PS : Ecco riproposto il link di "theFiller"
 
http://support.microsoft.com/kb/160129
Inoltre posto l'esempio in C (non lo conosco, per me e' poco conprensibile) 
nel caso si possa convertire nel nostro delhpi
BOOL GetJobs(HANDLE hPrinter,        /* Handle to the printer. */
                JOB_INFO_2 **ppJobInfo, /* Pointer to be filled.  */
                int *pcJobs,            /* Count of jobs filled.  */
                DWORD *pStatus)         /* Print Queue status.    */
   {
   DWORD               cByteNeeded,
                        nReturned,
                        cByteUsed;
    JOB_INFO_2          *pJobStorage = NULL;
    PRINTER_INFO_2       *pPrinterInfo = NULL;
   /* Get the buffer size needed. */
       if (!GetPrinter(hPrinter, 2, NULL, 0, &cByteNeeded))
       {
           if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
               return FALSE;
       }
       pPrinterInfo = (PRINTER_INFO_2 *)malloc(cByteNeeded);
       if (!(pPrinterInfo))
           /* Failure to allocate memory. */
           return FALSE;
       /* Get the printer information. */
       if (!GetPrinter(hPrinter,
               2,
               (LPSTR)pPrinterInfo,
               cByteNeeded,
               &cByteUsed))
       {
           /* Failure to access the printer. */
           free(pPrinterInfo);
           pPrinterInfo = NULL;
           return FALSE;
       }
       /* Get job storage space. */
       if (!EnumJobs(hPrinter,
               0,
               pPrinterInfo->cJobs,
               2,
               NULL,
               0,
               (LPDWORD)&cByteNeeded,
               (LPDWORD)&nReturned))
       {
           if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
           {
               free(pPrinterInfo);
               pPrinterInfo = NULL;
               return FALSE;
           }
       }
       pJobStorage = (JOB_INFO_2 *)malloc(cByteNeeded);
       if (!pJobStorage)
       {
           /* Failure to allocate Job storage space. */
           free(pPrinterInfo);
           pPrinterInfo = NULL;
           return FALSE;
       }
       ZeroMemory(pJobStorage, cByteNeeded);
       /* Get the list of jobs. */
       if (!EnumJobs(hPrinter,
               0,
               pPrinterInfo->cJobs,
               2,
               (LPBYTE)pJobStorage,
               cByteNeeded,
               (LPDWORD)&cByteUsed,
               (LPDWORD)&nReturned))
       {
           free(pPrinterInfo);
           free(pJobStorage);
           pJobStorage = NULL;
           pPrinterInfo = NULL;
           return FALSE;
       }
       /*
        *  Return the information.
        */
       *pcJobs = nReturned;
       *pStatus = pPrinterInfo->Status;
       *ppJobInfo = pJobStorage;
       free(pPrinterInfo);
       return TRUE;
   }
   BOOL IsPrinterError(HANDLE hPrinter)
   {
       JOB_INFO_2  *pJobs;
       int         cJobs,
                   i;
       DWORD       dwPrinterStatus;
       /*
        *  Get the state information for the Printer Queue and
        *  the jobs in the Printer Queue.
        */
       if (!GetJobs(hPrinter, &pJobs, &cJobs, &dwPrinterStatus))
			return FALSE;
       /*
        *  If the Printer reports an error, believe it.
        */
       if (dwPrinterStatus &
           (PRINTER_STATUS_ERROR |
           PRINTER_STATUS_PAPER_JAM |
           PRINTER_STATUS_PAPER_OUT |
           PRINTER_STATUS_PAPER_PROBLEM |
           PRINTER_STATUS_OUTPUT_BIN_FULL |
           PRINTER_STATUS_NOT_AVAILABLE |
           PRINTER_STATUS_NO_TONER |
           PRINTER_STATUS_OUT_OF_MEMORY |
           PRINTER_STATUS_OFFLINE |
           PRINTER_STATUS_DOOR_OPEN))
       {
           free( pJobs );
           return TRUE;
       }
       /*
        *  Find the Job in the Queue that is printing.
        */
       for (i=0; i < cJobs; i++)
       {
           if (pJobs[i].Status & JOB_STATUS_PRINTING)
           {
               /*
                *  If the job is in an error state,
                *  report an error for the printer.
                *  Code could be inserted here to
                *  attempt an interpretation of the
                *  pStatus member as well.
                */
               if (pJobs[i].Status &
                   (JOB_STATUS_ERROR |
                   JOB_STATUS_OFFLINE |
                   JOB_STATUS_PAPEROUT |
                   JOB_STATUS_BLOCKED_DEVQ))
               {
                   free( pJobs );
                   return TRUE;
               }
           }
       }
       /*
        *  No error condition.
        */
       free( pJobs );
       return FALSE;
   }

 dalla prima all'ultima pagina / stampa dall'ultima alla prima pagina).
http://groups.google.it/group/it.comp.lang.delphi/browse_thread/thread/f5e284fd47971769/
http://groups.google.it/group/borland.public.delphi.nativeapi/browse_thread/thread/e9c93dde1a05831e/
http://www.efg2.com/Lab/Library/UseNet/2000/0314.txt
-- 
Morde

 dalla prima all'ultima pagina / stampa dall'ultima alla prima pagina).
hai gia dato un occhio alle api dello spooler?
Ciao

 stampate sia ok ***NON*** è una garanzia che lo sia subito dopo aver eseguito il
