Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Printer e KillDoc per stampe ... virtuali

No, non ho ancora bevuto, ma avrei la necessità di fare una ... stampa
virtuale, ovvero, eseguire un numero indefinito di Printer.Print "eccetera"
e (senza alcun Printer.EndDoc), fare poi un Printer.KillDoc e ... non
sporcare nemmeno una riga sulla carta della stampante.
Ho provato così:
For n=1 to 10000
    Printer.Print String(n,"A")
Next n
Printer.KillDoc
e, con spooler normalmente attivato, funziona, ovvero la stampante
canticchia e resetta un po', ma non stampa un bel niente.
Il dubbio è: Posso star sicuro che (sempre con spooler normalmente attivato)
sarà sempre così, quali che siano le dimensioni del job di stampa? Grazie.

 sarŕ sempre cosě, quali che siano le dimensioni del job di stampa? Grazie.
cito da  MSDN
Metodo EndDoc
Termina un'operazione di stampa inviata all'oggetto Printer inviando il
documento alla periferica o allo spooler di stampa.
quindi se non lo usi la stampante non dovrebbe nemmeno canticchiare, stando
ad MSDN
non capisco dov'č il dubbio.
Illuminami, so che puoi farlo, essendo tu enormemente piů esperto di me
sull'argomento.
--
David Ruscelli
Oh...My dog!

 me sull'argomento.
Se posso inserirmi a tradimento...
Credo che lupo abbia questo timore: se io riempio il buffer di stampa, non è
che sto pirla comincia a stampare per "svuotarsi"?
Nella mia limitata esperienza, piuttosto che cominciare a stampare senza un
enddoc o un newpage, windows si suicida, ma credo che quello di lupo sia un
timore non completamente infondato (bel giro di negazioni, vero ;-) )
Salutoni
Sergio

 sarà sempre così, quali che siano le dimensioni del job di stampa? Grazie.
Finora a me ha sempre funzionato, ma non ci metterei la mano
nemmeno su un accendino spento che continui così in futuro.
D'altra parte (è la giornata delle coincidenze) è la stessa cosa
che consiglia la MS (per altri motivi) in Q146022.
Bye, G.

 stampa? Grazie.
Dubbio fondato... posso affermare con certezza che molte stampanti una volta
riempito il buffer, e superato un timeout (ad esempio 300secondi) senza
ricevere più dati, stampano il contenuto dello stesso... ora probabilmente
se lo spooler è impostato per non aspettare tutti i dati prima di stampare
probabilmente ti ritroverai con un lancio di carta dalla stampante...
Domanda: non puoi stampare su file invece di simulare una stampa su carta
per poi annullarla? :-?

 timore non completamente infondato (bel giro di negazioni, vero ;-) )
Infatti, temo che quando lo spooler ha raggiunto qualcuno dei suoi limiti
(ne avrà pure, no? che non sia lo spazio del disco) si metta a stampare per
svuotarsi un po'. Un po' quel che dovrebbe accadere se lo stesso non fosse
attivo, come cita l'ultimo paragrafo dlla guida.

 nemmeno su un accendino spento che continui così in futuro.
Andrei volentieri su una PictureBox invisibile (un po' come si fa con
l'anteprima), ma questa non è sempre esattamente identica alla stampante,
pur se regolarmente dimensionata e scalata. Io dovrei invece riprodurre
esattamente quel che avverrebbe stampando.
In poche parole, devo scoprire quando il "foglio virtuale" è pieno per fare
un "salto pagina" (ovvero una ripetizione di testata) su un file di testo
che "emula" la stampa reale.

 per poi annullarla? :-?
Leggi quanto ho risposto al Pap. e capirai che ... devo fare esattamente il
contrario: Simulare la stampa per "riprodurne le pagine" su un file di
testo.

 pagine" su un file di testo.
Esatto... invece di stamapre su LPT, stampa selezionando stampa su file...
viene ricreato un file di output che se inviato alla lpt di un qualsiasi
computer dotato della stessa stampante ti stampa il contenuto su carta... di
fatto č uno spooling solo che non tocca in alcun modo la stampante vera,
genera solo i dati che normalmente andrebbero inviati alla porta lpt.
Prova da word per fartene un'idea.
Io il metodo lo utilizzo per ottenere codice postscript dal quale derivare
files PDF.
hth

 *Lord Rayden* ha scritto:

Credo intendesse "stampa su file", e potrebbe essere una soluzione
furba. Onestamente non so se lo gestiscono tutti i driver, perň.
Ad occhio dovrebbe dipendere dallo spooler, quindi dovrebbe
funzionare. Quanto al _come_ farlo, mi pare se ne sia parlato
tempo fa, cambiando la porta di stampa con una chiave di registro...
http://groups.google.it/groups?hl=it&ie=ISO-8859-1&q=stampante+su+file+vb&sa=N&tab=wg&lr=
Ma questo prevede di usare una stampante configurata apposta,
magari copiando una stampante esistente. Non so come si possa
cambiare l'impostazione della stampante corrente facendo in modo
che stampi alternativamente su file o sulla normale coda.
Un'alternativa potrebbe essere quella di fare un KillDoc ogni pagina,
in modo che le dimensioni del file nello spooler non crescano piů
di tanto, ma 1) non so come hai strutturato il tuo programma, 2) se
il driver che usi invia davvero un reset ogni KillDoc, non č certo un
sistema pulito...
Bye, G.

 computer dotato della stessa stampante
Limitazione troppo stretta!
Poi, mi spiego meglio, il file che genero è un normale file di testo (ASCII,
TXT) che deve riprodurre i contenuti della stampa in termini di pagine
utilizzate.
Per cui faccio
Print #canale_file, stringa_riga
ma vorrei poter capire quando saltare pagina (e ristampare, ad esempio, la
testata), ovvero quando (se stampassi su Printer) i controlli di
CurrentY+TextHeight(stringa_riga) mi indicano che vado oltre la ScaleHeight
della Printer.
Da qui l'idea di dire: Stampo sulla Printer, ne rilevo le conseguenze
"virtuali" e mi comporto di conseguenza sulla reale produzione del file
ASCII. Alla fine cancello la stampa/job virtuale con KillDoc e il mio file
ASCII sarà "ad immagine e somiglianza" di una stampa reale fatta sulla
Printer per gli stessi contenuti. Quando mi serve? Stampo un bilancio
contabile riclassificato, magari l'operatore deve pastrocchiarci sopra (con
WordPad), aggiungere info e così via, mantenendo però l'impostazione
"grafica" per le parti non toccate. Quando ha fatto stamperà il file ASCII e
questo dovrebbe saltare pagina regolarmente, come se fosse stato stampato
direttamente sulla printer. Con quanto consigli tu, come potrei
"pastrocchiarci dentro"? ;-)

 di tanto
'azz, "perchè non c'ho pensato prima"???
Proverò, mi sembra un'ottima idea per pararsi il posteriore, grazie!
Che poi la stampante "canti", poco m'importa. Se si scassa, pure meno... ;-)

 Printer per gli stessi contenuti.
Tira un respiro profondo, e leggi con calma, ché io ho scritto di fretta
:-).
OK, l'idea di L.R. era questa: al posto di stampare sulla stampante,
che invia allo spooler, e poi fare KillDoc per evitare la stampa, con
gli eventuali effetti collaterali, potresti reindirizzare la stampante su
file così da evitare del tutto KillDoc, anzi usi un bel EndDoc e poi
ti limiti a cancellare il file .PRN creato. Oh, se vuoi usare lo stesso
KillDoc, non credo ci sarebbero problemi... voglio proprio vedere
come farebbe a resettare un file ;-).
Il "file di stampa ASCII" di testo che fai tu è un altro discorso, lo
faresti
esattamente come adesso.
L'unica controindicazione, come dicevo, è che quando poi tu
volessi stampare realmente, dovresti indirizzare di nuovo la
stampante sulla reale coda di stampa. Per questo io suggerivo
un metodo *grezzissimo*, almeno per testare il funzionamento della
cosa: creare una _seconda_ stampante, identica alla precedente,
ma indirizzata su file, da usare, come tu dici, come "stampante
virtuale". Poi immagino che un modo per cambiare la coda di
stampa sulla stampante, via API, ci sia :-). Suppongo una SetPrinter
con l'adeguata struttura INFO_comesichiama, oppure interagendo
con lo spooler... una rapidissima guglata mi ha portato a questo:
http://groups.google.com/groups?selm=978vu5%24m3s%241%40plutonium.btinternet.com
o forse meglio questo:
http://groups.google.com/groups?selm=3NcKyNp7AHA.181%40cppssbbsa01.microsoft.com
ma non ho tempo di fare delle prove, mi aspettano per la pappa :-).
Bye, G.

Per quello che ti può essere utile, quando mi sono fatto una
dll che gli passi qualsiasi cosa e lei stampa, se non gli mandi
almeno un carattere con la print... non esce fuori un tubo e
comunque si riempe quel "buffer" di cui parli che se non
ricordo male erano tanti bei file .tmp.
-- 
Saluti
Andrea Moro
Sito Comune : 
http://www.it-lang-vb.net

 ma non ho tempo di fare delle prove, mi aspettano per la pappa :-).
Hai fatto tantissimo. Grazie.
Buon appetito e ... un bacetto alle signore.

 Buon appetito e ... un bacetto alle signore.
Fatto, grazie, ricambiano :-).
Bye, G.