Newsgroup: it.comp.lang.delphi
Titolo: Printer.canvas

Mi trovo di fronte ad un software datato (D4) con molte stampe su carta.
Dovrei poter eseguire un'anteprima di tali stampe, oppure buttare le stesse
su pdf anzichè su carta. Per fare le cose fatte benino, dovrei rielaborare
troppo codice (quello che mi ritrovo è incasinatissimo, scritto malino) e
vorrei evitarlo.
Avrei allora pensato di lasciare che il software scriva su printer.canvas,
ma prima di dare l'EndDoc, copiare il canvas dove mi serve (es una image a
video) e dare l'abort sul printer (oppure aspettare la conferma dell'utente
per la stampa, vedrò). Ho trovato molti esempi di copia del contenuto di un
canvas, ma purtroppo riesco a fare tutto tranne quello che mi serve: copia
DAL canvas della printer A un altro canvas. Operazioni come copia da una
image ad un'altra, da una image alla printer ecc mi funzionano, quella che
mi serve no. Mi potete indicare degli esempi?
Oppure avete altre idee? Ci sono molte altre soluzioni, ma ripeto che il mio
desiderio è di non intervenire in largo e in lungo su un codice abbastanza
mal scritto e caotico: ho bisogno di una soluzione rapida da realizzare.
Gianni

 
Se ho capito.. potresti:
Copiare dal canvas di una bmp al canvas del printer, modificando il 
codice in modo che scriva sul canvas di un oggetto TBitMap e nel caso di 
stampa istanzi l'oggetto TPrinter altrimenti mostri a video la tua 
bitmap creata.
^_Goblin_^
-- 
Ibis et redibis non morieris in bello
http://goblinland.myminicity.com/

istanzi l'oggetto TPrinter altrimenti mostri a video la tua bitmap creata.
Esattamente il contrario. Ti spiego. La perversione di chi ha costruito 
questo software ha fatto si che l'oggetto Printer utilizzato non sia quello 
di delphi, ma un alter ego riscritto da zero con varie 
proprietà/impostazioni aggiuntive, che in un bitmap non avrei. Tale oggetto 
nel software compare scritto qualcosa come 2600 volte (ovviamente non tutte 
le ricorrenze sono istruzioni di disegno di un testo o di una grafica...). 
Seguire la stada che mi suggerisci vorrebbe dire passare i giorni a 
sostituire pezzi di codice e verificare cosa perdo con la bitmap rispetto a 
questo TPrinter personalizzato. Se volessi fare questo, un'alternativa 
potrebbe essere quello che già fa una sola (purtroppo) stampa del software: 
questa stampa usa un metafile e disegna lì la stampa, quindi alla file copia 
su printer o su un pdf a seconda della richiesta.
Usare un bitmap poi non è così semplice, credo, perchè andrebbe ben 
proporzionata in funzione di un foglio A4, cioè dovrei preoccuparmi (me ne 
preoccupo perchè non sono pratico) della corretta rimappatura tra la metrica 
del bitmap e quella del canvas della stampante (non so se mi sono espresso 
correttamente).
Quello che speravo di fare velocemente era il contrario, lasciare al 
software esistente fare la sua benedetta stampa, ma alla fine prendere il 
risultato, che va bene e che mi ritrovo sul printer.canvas, e copiarlo dove 
mi serve, verificando eventualmente se avrò dei problemi di strech o 
altro....
Quello che non riesco a fare è questo:
se scrivo un codice tipo:
Printer.BeginDoc;
Printer.Canvas.CopyRect( R, Image1.Picture.Bitmap.Canvas, R );
Printer.EndDoc;
dove Image1 ha un'immagine, la stampante stampa il rettangolo R richiesto.
Se faccio l'opposto:
Printer.BeginDoc;
....
Image1.Canvas.CopyRect( R, Printer.Canvas, R );
...
Printer.EndDoc;
il risultato è un rettangolo bianco, quando invece qualcosa come
Image2.Canvas.CopyRect( R, Image1.Canvas, R );
funziona correttamente.
In pratica non so "prelevare" il contenuto del canvas della stampante e non 
so se si debba fare qualcosa che con le normali bitmap o image, cioè con i 
loro canavs, non occorre fare.
Gianni