Newsgroup: it.comp.lang.delphi
Titolo: Verifica se stampante pronta

Scelgo la stampante da PrintDialog,
1 - seleziono la stampante PdfCreator che e' sempre presente
testa   if not OpenPrinter(PtrName, Result, nil) then
2 - seleziono una stampante di rete (spenta la stampante ed anche il Pc di 
rete)
testa   if not OpenPrinter(PtrName, Result, nil) then
mi aspetterei che eseguisse  RaiseLastOSError , invece esegue 
ClosePrinter(Result)
esattamente come fa con PdfCreator
il documento va in coda di stampa.
3 - seleziono una stampante di rete (accesi  stampante ed il Pc di rete)
testa   if not OpenPrinter(PtrName, Result, nil) then
esegue  ClosePrinter(Result)
var hEsito: THandle;
.......
  PrintDialog := TPrintDialog.Create(nil);
  try
    if PrintDialog.Execute then
      begin
        ....
        //verifica stampante.
        hEsito := 
PrinterHandleByName(Printer.Printers[Printer.PrinterIndex]);
       .....
  finally
    FreeAndNil(PrintDialog);
  end;
function Tfrm_RptPreventivo.PrinterHandleByName(PrinterName: string): 
THandle;
var PtrName : PChar;
begin
   Result:=0;
   PtrName := PChar(PrinterName) ;
   if not OpenPrinter(PtrName, Result, nil) then
     RaiseLastOSError
   else
     ClosePrinter(Result) ;
end; 

 Scelgo la stampante da PrintDialog,
non ho capito: ti serve sapere se la stampante č online? cioč se č
accesa e non č in "out of paper"?
Se cosě fosse, quale č la ragione per cui te ne devi occupare tu,
dall'applicazione, di queste situazioni? perchč non lasciare, come
sarebbe giusto, che se ne occupasse il sistema operativo e lo spooler?
Ale

> Ale
una richiesta anomala, mi chiedono di non rendere piu' modificabile
un OrdineCliente dopo la stampa.
se pero' non si riesce a capire se il documento puo' essere stampato,
diventa inutile, e al momento non saprei che alternative proporre.
Maurizio 

 diventa inutile, e al momento non saprei che alternative proporre.
nel momento in cui invii la stampa allo spooler, questa si può
considerare fatta (se non è online la stampante, prima o poi verrà
fatta.. alla riaccensione della stampante, all'inserimento della carta,
al cambio del toner o delle cartucce, ecc.). A quel punto blocchi
l'ordine, rendendolo non più modificabile, e amen.
Ale

> Ale
Vero, non fa una piega e vedo altra possibilita'.
Ma sai bene quanto certe persone sia ottuse.... e commenti del
tipo
- mi blocchi il documento che ancora non e' su carta ??
- ho acceso la stampante ed e' partita da sola la stampa.
sono la regola.
Maurizio 

 Maurizio
Una volta si poteva interrogare un interrupt. Però secondo me l'unico 
modo assoluto per assicurarsi che sia stato stampato effettivamente è 
richiedere conferma all'utente della stampa effettuata. In questo modo 
diventa responsabilità dell'utente e non del sistema certificare 
l'effettiva stampa del documento. Oppure pensa ad uno scenario di questo 
tipo:
	l'utente stampa l'ordine sul quale viene riportato un codice a
	barre
	il sistema richiede all'utente di confermare l'avvenuta stampa
	attraverso la lettura del codice a barre riportato sopra la
	stessa
	se viene letto il codice il sistema certifica l'avvenuta stampa
	altrimenti non convalida l'ordine e lo annulla immediatamente.
 
-- 
Il silenzio ti fa vedere ciò che il rumore non ti fa cogliere ..

 immediatamente.
non ti salva dal fatto che l'utente non "certifichi" leggendo il codice
a barre, quindi usi l'ordine dandolo al cliente di turno, poi lo
modifichi, e lo ristampi, e così via, senza mai "certificare" la
stampa..
Ale

 - mi blocchi il documento che ancora non e' su carta ??
una soluzione alternativa, ma macchinosa, sarebbe quella di creare un
job sullo spooler con un certo nome, quindi interrogare lo spooler
finchč il job in questione non sia sparito.. a quel punto la stampa
dovrebbe essere stata fatta.. sempre che l'utente non abbia cancellato
manualmente il job.. :DDD
Come vedi non c'č una soluzione.
Spiega al tuo intelligentone di cliente che questo genere di controlli
potevano essere fatti ai tempi del dos, quando le stampanti erano
gestite direttamente dal software.. oggi ci sono i sistemi operativi, e
si occupano di tutto loro, il programma non ha un controllo totale
sulle periferiche.
Ale

 - mi blocchi il documento che ancora non e' su carta ??
ci vorrebbe una stampante che restituisse una sorta di "ricevuta di
ritorno" all'host (o magari una mail ad un indirizzo specifico) una
volta completata una stampa, ma non credo che esistano, quantomeno non
per pc.
Ale

"Alessandra R."  ha scritto nel messaggio

Ho messo una finestra di avviso con messaggio del tipo
"Accertatevi che la stampante sia accesa
Il Documento sara' inviato alla stampante, se confermate il
documento non sara' piu' modificabile;
Anche in caso di stampante spenta o non pronta
Stampare Si - No"
Cosi' non possono obiettare che cisiano operazioni nascoste.
Anche se credo esista il modo per testare
Se prendo un pdf e cerco di stamparlo con AdobeReader su una
stampante spenta, mi avvisa
"Il documento non puo' essere stampato", Nessuna pagina selezionata
per la stampa.
Maurizio 

 per la stampa.
mah, non so fino a che punto sia affidabile un controllo del genere.
Immagina una stampante di rete, condivisa tra 5 utenti, con una lunga
coda di stampa in corso.. dalla tua applicazione la stampante è online
al momento della stampa, salvo che.. quando è il tuo turno, o poco
prima.. ta dah.. finisce la carta.. a quel punto come gestisci la cosa?
Risposta: non puoi, se non come hai fatto tu, cioè con una messagebox
che informa l'utente che se prosegue sono cacchi suoi :)
Ale

per interrogare la coda di stampa qui trovi un semplice esempio
http://www.swissdelphicenter.ch/torry/showcode.php?id=764
ciao Brunello

 per interrogare la coda di stampa qui trovi un semplice esempio
serve a poco, considerando che esiste anche la memoria (il buffer)
della stampante. Se una stampa si interrompe a metà, il foglio si
inceppa, la stampante si spegne perchè manca corrente o perchè l'utente
la spegne.. il job è concluso, ma su carta potresti avere solo una
parte della stampa, o addirittura nulla.
Tornando al discorso già fatto: l'unica che possa sapere se la stampa è
stata completata o meno è la stampante.. lato applicazione non c'è modo
di essere sicuri di nulla. Ci vorrebbe una stampante che mandasse una
notifica di stampa avvenuta indietro al pc. E, che io sappia, non
esiste.
Ale

il mio era un semplice suggerimento, infatti anche con una vecchia
stampante dos ad aghi senza alcun inceppamento con un semplice nastro
esaurito o assente il sistema mi avrebbe dato un ok mentre il foglio
sarebbe rimasto bianco. il problema e' che l'operatore e' l'unico che
puo' verificare lo stato dell'operazione, altrimenti dovresti avere
una stampante che sul vassoio di uscita scannerizza l'output per
verificare la corrispondenza con i dati inviati. non riesco ad
immaginare una esigenza cosi' avanzata

 Ale
Questo lavoro lo fa il driver fornito assieme alla stampante e non 
tutti. Per esempio se prendi una epson tm-88iv e usi le sue api, da 
delphi, attraverso di loro sai vita morte e miracoli del processo di 
stampa, ti dice anche se la carta è esaurita o in via di esaurimento, se 
la stampante è on-line o off-line, in pratica non c'è margine di errore 
nel verificare l'avvenuta stampa. Però la tm-88iv è una posprinter da 
80mm. Temo ti devi orientare su stampanti professionali per avere il 
giusto supporto dal driver di stampa. Contino a propendere sull metodo 
che già ti ho suggerito.


 diventa inutile, e al momento non saprei che alternative proporre.
Secondo me la strada di controllare la stampante e' sbagliata : restera'  
sempre un caso in cui tu bloccherai l'ordine e quello avra' in mano una  
stampa illeggibile o simili.
Io ho diverse di queste situazioni, e richiedo sempre all'operatore "la  
stampa eseguita e' definitiva ? Attenzione, confermando, il documento  
verra' bloccato".
-- 
=============================================================
Alberto Rubinelli - Fondazione "Museo del computer"
Via Costantino Perazzi 22 - 28100 NOVARA - ITALY
Tel 0321 1856032   Fax 0321 391769   BBS 0321 392320
Mail: 
alb...@oldcomputers.de
Sito internet : 
http://www.museodelcomputer.org
=============================================================

 un OrdineCliente dopo la stampa.
Non gestire le stampe a posteriori.. non ti devi neanche preoccupare del 
loro esito, perchè la soluzione corretta è quella di flaggare nella tua 
base dati quel documento come stampato, e di conseguenza il tuo 
programma ne permetterà solamente la ristampa.
Tutte le altre strade portano a complicazioni e alla troppa dipendenza 
dal cliente.
 > se pero' non si riesce a capire se il documento puo' essere stampato,
 > diventa inutile, e al momento non saprei che alternative proporre.
Devi fa capire il presupposto che un ordine, una volta stampato, non può 
essere modificato. Puoi solo cancellarlo (e quindi potrai gestire gli 
storni) e crearne uno nuovo che potrà essere modificato fino alla 
stampa, e così via..
-- 
morde
D5,D6,D7
QT 4.7.0 - MingW- QT Creator 2.1

 un OrdineCliente dopo la stampa.
Tutti i gestionali che si occupano di contabilità durante le stampe sui 
bollati, alla fine della stampa chiedono all'operatore se la stampa può 
considerarsi definitiva, se la risposta è Si vengono aggiornati i 
contatori ed amen, le registrazioni non si possono modificare più.
Non è applicabile al tuo caso?
Ciao.

"Luigi Siciliano"  ha scritto nel messaggio

Si , ed ho lasciato perdere la verifica della stampante, optando,
viste anche le altre opinioni, per il messaggio che avvisa che
confermando il documento non sara' piu' modifcabile, lasciando
la sola poossibilta' di stampare.
ciao. 

 immaginare una esigenza cosi' avanzata
non c'è bisogno di nessuno scanner. La stampante sa se c'è stato
qualche problema (inceppamento, fine carta, ecc.) rispetto ad un job
che le è stato inviato e che può avere ancora parzialmente o del tutto
nella sua memoria interna, appunto per sopravvenuti problemi. Il fatto
è che non comunica all'indietro l'esito dell'operazione, quindi il pc,
e di conseguenza l'applicazione, "non sa".
Ale

 nella sua memoria interna, appunto per sopravvenuti problemi. Il fatto
Be, lasciamene dubitare, ho visto piů volte fogli bianchi uscire da 
stampanti laser dopo un processo di stampa che prima e dopo (i fogli 
bianchi) stampa regolarmente.
E non parlo dell'eventuale foglio vuoto lasciato per distinguere piů 
lavori di stampa.
Ciao.

 lavori di stampa.
fogli bianchi derivanti da che? errore della stampante che carica male
la carta? o errore nel job?
Ale


Metti che voglia stampare questa email da thunderbird, premo Ctrl+p + 
invio e la stampante produce una pagina vuota (nel senso che viene 
trascinato un foglio come se la stampante stesse effettivamente 
stampando un documento ma il foglio che esce è bianco), ripremo Ctrl+p + 
invio et voilà la stampa stavolta è stata corretta ma, anche un minuto 
prima avevo stampato altri documenti correttamente.
E' una cosa che mi è successa due volte in 12 anni e non so spiegarmene 
la ragione. La stampante continua a funzionare regolarmente.
Ciaio

 la ragione. La stampante continua a funzionare regolarmente.
Due volte in dodici anni con la stessa stampante?
Ad ogni modo, questa casistica riduce di molto il problema che hai 
ipotizzato tu. E' piů un raro caso anomalo che un errore sistematico.
Ciao



Si era solo per ribadire l'inaffidabilità di interrogare la stampante.

 la sola poossibilta' di stampare.
E cosi' sia :)
Io sono quasi 20 anni che faccio cosi', ed i clienti non hanno mai posto  
particolari problemi :)
