Newsgroup: it.comp.lang.visual-basic
Titolo: Fare le stampe usando solo VB

Ciao ragazzi.
Scusate il post che sarà un  po' lungo.
Ma ho comunque deciso di scriverlo prima di andare a dormire; domani voglio
leggere i commenti di chi vorrà rispondermi.
Per le seguenti ragioni:
- come programmatore sono vecchiotto sia di età che di mentalità.
- stò replicando un programma già fatto precedentemente in clipper e vorrei
sfruttare l'analisi che conosco a memoria cambiando quasi solo la parte di
input
- l'apprendimento di VB richiede già gran parte delle mie risorse mentali
- sono abituato a lavorare coi file ASCII
.... avrei deciso di fare tutte le stampe del mio pacchetto usando solo VB e
non con altri Reports.
Per esempio due mie routine tipiche potrebbero essere (non letteralmente) le
seguenti:
Private Sub StampaUno
    Private Testo as String
    FissaIlRecordSet
    For R = 1 to TuttiIRecrodsSelezionati
        Testo = Testo & Campo1 & Campo2
        Testo = Testo & UnaFunzione (CampoN)
        Testo = Testo & VbCrLf
    Next R
    Call StampaEffettiva ("Titolo della stampa" , Testo )
End Sub
Public Sub StampaEffettiva ( Titolo as String , Testo as String)
    ' Questa funzione apre un Form
    ' Permette di cambiare i font e quant'altro
    ' Permette di selezionare la stampante
    ' Usa l'oggetto printer
    ' Stampa
End Sub
Aggiungo che per quanto riguarda la modilistica (bolle, fatture, ordini
ecc.) vorrei utilizzare i caratteri box
del font SystemPC.
Dopo la lunga premessa giungo alle domande:
1) Pensate che la mia sia una scelta stupida ?
2) Potete suggerirmi qualcosa di molto meglio e sufficentemente semplice?
3) Per chi avesse scelto una strada simile alla mia, gradirei un
approfondimento.
4) altri eventuali commenti
Ciao, Sauro

 4) altri eventuali commenti
Vuoi un consiglio per l'anteprima di stampa?
Scarichi da internet uno di quei programmi che ti installano una stampante
virtuale che in realtà crea un file pdf, tipo pdfMachine, ma ce ne sono
molti anche free.
A questo punto basta che quando vuoi l'anteprima lanci la stampa nella
stampante virtuale, la stampante tri creerà un file pdf e lo aprirà con
acrobat (free anche esso)
Ciao

 acrobat (free anche esso)
Basta direzionare la stampa su una PictureBox...


susami sai come si chiama questo programmino o cosa potrei scrivere nei
motori di ricerca?
Scusami ma sto impazzendo con il crystal report quindi se mi date
indicazioni maggiori  mi liberate il cervello da questo tarlo  :)

 indicazioni maggiori  mi liberate il cervello da questo tarlo  :)
Io ho risolto alla radice..
comunque, benvenuto nel club...
lo trovi su 
www.volftp.mondadori.com
prova a cercare pdfmahcine
è shareware e la memoria mi ingannava, nel senso che gli altri free che
avevo visto erano per mac.
Però non costa molto, 85 Euro, secondo me ne vale la pena.

 ha scritto nel messaggio
news:b0oatk$r4c06$1...@ID-174464.news.dfncis.de...

Aspetta...
a quanto ne so io,  non è così semplice, occorre ridimensionare tutto quanto
perchè lo schermo o un picturebox non corrisponde ad un foglio A4, inoltre
funzioni di zoom o simili vanno  implementate da zero.

 inoltre funzioni di zoom o simili vanno  implementate da zero.
Le funzioni di zoom??? Dici che se uno legge la stampa non riesce a leggere
la stessa cosa sul video? ;-)
Si puň sempre giocare sulle dimensioni della picture...

 Basta direzionare la stampa su una PictureBox...
Scusa, mi puoi fare un esempio di come, con l'oggetto printer, si puň
indirizzare la stampa ad un PictureBox?
Comunque, questa problematica dell'anteprima di stampa, non mi sembra il
punto chiave rispetto alla mia serie di domande.
Gradirei qualche tuo commento piů generale.
Un'altra cosina:
Tempo fa abbiamo discusso in merito al margine sinistro dell'oggetto
printer.
Volevo poter impostare il margine per tutte le righe di un testo.
Ho risolto cosě:
Public Function MargineSx(ByVal Stringa As String, _
             Optional Margine As Integer = 0) As String
    Dim Sinistra As String
    MargineSx = Stringa
    If Margine > 0 Then
        Sinistra = String(Margine, " ")
        MargineSx = Sinistra & Replace(Stringa, vbCrLf, vbCrLf & Sinistra)
    End If
End Function
Ciao e grazie, Sauro

Grazie per le tue risposte.
Ciao, Sauro

Scusate di nuovo ma come faccio per la stampa di immagini (picturebox) ?
Ovviamente sempre utilizzando il metodo printer.
un saluto di pace

 ecc.) vorrei utilizzare i caratteri box del font SystemPC.
Non te lo consiglio; se usi l'oggetto Printer, puoi molto più comodamente
lavorare di .Line, per ottenere dei riquadri. Tutto ciò che ti serve è l'help
su Line ed eventualmente su TextHeight e TextWidth. Oltretutto
su stampanti umane, quei font sono davvero orribili :-)
Secondo: sul Sito Comune (link nella firma) ci sono due o tre procedure
per l'anteprima di stampa, provale e magari studiane il codice.
Terzo, se vuoi ottenere dei PDF, alla fine, puoi farlo "aggratise", con
GhostScript. Ne ho parlato altre volte, dovresti trovare le info qui:
http://groups.google.com/groups?&scoring=d&q=ghostscript+pdf+eps+author%3Apaperino
Bye, G.
--
Le risposte alle tue domande sono sul Sito Comune
di questo NewsGroup: 
http://it-lang-vb.net/
... e nell'help in linea !

 Ovviamente sempre utilizzando il metodo printer.
PaintPicture :-)
Bye, G.

[cut]
Grarie, Sauro

 Ovviamente sempre utilizzando il metodo printer.
metti una picturebox dentro laltra e stampi la prima

Io vi ringrazio tantissimo per i suggerimenti, ma....
....se mi scrivete anche una riga di codice evito di stare mezza giornata a
fare le prove :)
Questa è la prima volta che devo usare la stampante quindi sto imbranato ad
alti livelli.

 Si può sempre giocare sulle dimensioni della picture...
Non lo so... a me sembra incasinato, è davvero così semplice?
Attendo fiducioso conferma.
PS: Eventualmente verrò a cremona a fare un corso di stampa... :-)

 End Function
No, forse ottieni la stessa cosa, ma, di fatto, stampi degli spazi prima
(immagino che a un certo punto farai Printer.Print MargineSx..., no?!) E'
concettualmente diverso, anche perchč se hai font diversi per righe diverse
sei fregato.
Printer.CurrentX=punto orizzontale fisico! del foglio
Printer.CurrentY=punto verticale fisico! del foglio
E' facile!

 E' facile!
Dal mio punto di vista questo metodo ha un problema perchè io vorrei
completamente slegare i due problemi:
1) La formazione del testo (con tante routines, una per ogni funzione di
stampa) che magari si memorizza su un file ascii se si presume che il testo
possa essere più lungo dei famosi 64k
2) Un unico form di stampa per tutte le routine di cui sopra.
Questo form dovrebbe prendere, come argomenti di una funzione,  sia il testo
da stampare che eventuali parametri di stampa.
Se ho ben capito, tu devi invece, per ogni singola stampa intervenire
sull'oggetto printer.
E' cosi?
Un'ultima cosa.
Suppongo che tu abbia fatto diverse prove.
Per i famosi currentX e currentY hai forse una lista di valori
corrispondenti alla larghezza di un carattere o all'altezza di una riga.
Che ne so', per esempio:
Public Sub SaltaUnaRiga()
    Printer.CurrentY = Current.CurrentY + NonLoSo
End Sub
Bisogna ricalcolarli ad ogni cambio di dimensione del carattere?
L'argomento mi interessa molto.
Grazie, Sauro

 L'argomento mi interessa molto.
Anche a me , ma non voglio dare soddisfazioni a Lupo ^_-

Gigio2k [work] ha scritto:

BleahhhhHTML ;-)

 Bisogna ricalcolarli ad ogni cambio di dimensione del carattere?
Non ho ben capito, ma quello a cui mi fai pensare è determinare
l'occupazione orizzontale (ma anche verticale) di una certa scritta, con un
certo font, senza alcun limite alla fantasia. Per questo basta l'uso
adeguato di TextWidth e TextHeight. Pensa a una fattura, dove la colonna
descrizione ha una certa ampiezza. Se la tua descrizione (quella complessiva
da stampare) ci sta sempre, sei a cavallo, se no dovrai andare a capo,
ovvero continuare la stampa della descrizione (a partire da un certo
carattere della descrizione complessiva) alla riga successiva. Bene, dopo
aver determinato quanta roba hai già stampato, devi determinare quanta ce ne
può stare sulla nuova riga (parte di stringa, ovviamente per un numero
intero di caratteri e a partire da un certo carattere). Fai un Printer(o
Picture1).CurrentX=MargineSX+Inizio_Colonna_Descrizione e stampi ;-)
Ovviamente MargineSX, per quella specifica stampa e sessione di lavoro, è
fisso per tutte le righe, altrettanto ovviamente devi sapere il valore di
Inizio_Colonna_Descrizione che srà invece specifico del tipo di modulo che
ti sei preventivamente "disegnato", anche e solo "virtualmente".

[cut]
Abituato a ragionare con le vecchie stampanti ad aghi, dove bisognava
avanzare riga per riga, stavo facendo un errore madornale.
Ho fatto un po' di prove oggi ed ho finalmente capito che posso, per
esempio, stampare tutto il testo, che so' fino alla 55esima riga, e poi
disegnarci sopra, ripartendo dall'inizio della pagina tutti i rettangoli che
voglio.
O viceversa.
Ti sembrerà stupido, ma non l'avevo capito prima.
Le idee cominciano ad essere un po' più chiare.
Ciao, Sauro

 voglio.
Già. ;-)
Con l'oggetto Printer (anche, bada bene, con stampanti ad aghi che abbiano
un minimo di capacità grafica) puoi andare avanti e indietro, scrivere di
traverso e sghimbescio.
Qual è il segreto? Semplice: La pagina viene virtualmente composta in
memoria e fisicamente stampata (la stampante lo farà nel senso classico,
dall'alto al basso, da sinistra a destra o bidirezionale) solo quando fai
Printer.NewPage o Printer.EndDoc. Fino a quel momento può essere disegnata
come si vuole.