Newsgroup: it.comp.lang.visual-basic
Titolo: Stampa con margini - Ma mettere delle proprietà "Margin" nell'oggetto printer pareva brutto? :-)

Salve!
Poiché nelle questioni di stampa il sistema operativo, versione di VB,
marca stampante e balle varie contano un tot, ecco l'elenco :-)
1) Windows XP Pro SP3
2) VB6 SP6
3) HP LaserJet 4250(net printer)
4) Driver stampante: fornito con Windows.
Sto cercando di stampare un treeview con una classe non scritta da me
ma di cui ho i sorgenti.
Ho prima cercato di ottenere una stampa più o meno uniforme da codice,
utilizzando dei margini calcolati(quindi, dinamici ma che non si
discostassero poi molto) senza però ottenere risultati apprezzabili.
Cercando su google, ho "scoperto"(bella scoperta, direte voi...) che
si può impostare la proprietà ScaleMode per ottenere delle stampe con
margini, il problema è che - apparentemente - non funziona, in quanto
provando a
stampare ottengo solo pagine bianche.
Le impostazioni sono queste:
Printer.ScaleMode = vbCentimeters
Printer.ScaleTop = -1
Printer.ScaleHeight = -1
Come si evince, le intenzioni sarebbero di avere 1 cm di margine sopra
e sotto(il margine sinistro lo imposto
spostando la X prima di iniziare la stampa del treeview, visto che i
nodi vengono spostati a sinistra, quindi non ho il
problema).
Leggendo su Google, però, non m'è riuscito di capire come razzo fare a
rendere queste impostazioni funzionanti.
Dopo quella prima prova, leggendo qua: 
http://www.visual-basic.it/articoli/printer3.htm
,
ho provato questo:
Printer.ScaleMode = vbCentimeters
Printer.ScaleHeight = Printer.ScaleHeight - 2
Ovviamente senza successo :-)
Mi è quindi venuto in mente che FORSE se si cambia la scala cambiano
anche le coordinate, quindi l'unico modo per lasciare il codice di
stampa inalterato ed avere dei margini è quello di usare i twips come
misura di scala
(quella, cioè, utilizzata in partenza).
Allora ecco come è cambiato ancora:
Printer.ScaleMode = vbTwips
Printer.ScaleHeight = Printer.ScaleHeight - (Printer.TwipsPerPixelY *
600)
Adesso la stampa esce correttamente, ma c'è un problema: a me sembra
che il margine non cambi
affatto, sia che moltiplichi per 300 o per 600. Errori in overflow non
me ne dà quindi presumo che il risultato rientri nelle quantità
previste. Eppure non vedo cambiamenti misurabili.
Le impostazioni di scala NON vengono modificate in corso d'opera(ho
controllato tutto il modulo e non ho trovato nessun pezzo di codice
che le modifica).
Le nuove pagine vengono calcolate in automatico, vale a dire che viene
fatto un confronto tra la pagina attuale e quella conservata in
memoria. Qualora siano diverse, cambia il numero di pagina salvato e
vengono stampati footer ed il nuovo ramo.
Il codice che fa stà cosa è questo:
Private Sub RecurseTree(ByRef tvwParent As Node, iLevel As Integer,
currentX As Integer, curSiblingX As Integer, curSiblingY As Integer)
  'Codice vario...
    If lastPage <> Printer.Page Then  'Moved to the next page of
output
      Call PrintFooterText
      Call RecurseTree(tvwParent.Child, iLevel + 1, holdcurx,
holdCurXSibling, 0)
    Else
      Call RecurseTree(tvwParent.Child, iLevel + 1, holdcurx,
holdCurXSibling, holdCurYSibling)
    End If
  'Codice vario...
end sub
Non ho più idee su cosa possa andare storto, sicuramente sbaglio
qualcosa ma non saprei dire esattamente nè cosa nè dove.
Qualcuno avrebbe la pazienza di indicarmi dove sto sbagliando?
Andrea

Stampare su un oggetto Printer,
è un pò come stampare su un oggetto Form o un PictureBox.
Quindi fai le tue prove a video su questi controlli,
e quando hai risolto lo sostituisci con l'oggetto Printer.
Tieni presente che con Printer.Width/Height/Left/Top vengono calcolate le 
dimensioni fisiche del foglio impostato per la periferica di stampa; non 
disponibile in fase di progettazione. Se le proprietà vengono impostate in 
fase di esecuzione, i rispettivi valori verranno utilizzati al posto 
dell'impostazione della proprietà PaperSize.
Mentre con Printer.ScaleWidth/ScaleHeight/ScaleLeft/ScaleTop puoi in 
esecuzione avere l'effettiva area stampabile, espressa come meglio credi. La 
forma più utilizzata qui da noi è in genere quella metrica.
-- 
Ciao Fede
By Chicco Production
http://bcp.freetools.it