+ Rispondi al Thread
Pagina 1 di 4 123 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 39

Discussione: [VB.Net]Gestione delle stampe senza Crystal Report

  1. #1
    L'avatar di alextyx
    alextyx ora è in linea Moderatore Globale
    Luogo
    Prato
    Post
    2,585

    [VB.Net]Gestione delle stampe senza Crystal Report

    Devo ringraziare Massimo (cippalippa) per l'avermi solleticato la fantasia con il suo tutorial per la stampa.
    Quando lo ha presentato ho vagheggiato l'idea di usare il suo lavoro per creare dei report di un certo tipo.
    Poi mi sono accorto che non avrei potuto adattarlo, ma ormai i neuroni (quei pochi rimasti ) erano in moto!
    Mi sono messo al lavoro ed ho partorito una classe per la gestione delle stampe, della quale sono piuttosto soddisfatto.
    Se lo sarete anche voi, oltre a mettermi in lista per la strenna natalizia, ricordatevi che esiste il pulsantino per la reputazione!
    Quella che presento, è una classe cui ci si può collegare da codice, riempiendone colonne e righe (una riga di una certa colonna identifica una cella) con i dati che si vogliono stampare. Fondamentalmente, la sua struttura è molto simile a quella di un controllo tipo listview, tanto che il progetto di esempio che allego, mostra come collegare un listview alla classe di stampa, con poche righe di codice (da copiaincollare).
    La classe ne riprende tutte le caratteristiche (font, colore, ecc..), cella per cella.
    Non solo, ma se si espandono o si restringono col mouse le colonne del controllo, la stampa ne terrà conto, proporzionandosi di conseguenza.
    Propongo qui il mio lavoro per due motivi.
    Il primo, perchè il progetto può essere usato così com'è, da chi vuole risolvere il problema di stampa di un listview, o di un controllo griglia, o dei dati estratti con una query, semplicemente apportando pochi cambiamenti al codice che propongo.
    Il secondo, perchè potrebbe aprire la strada a sviluppi ad opera di terzi (volenterosi). Ad esempio, il codice che presento potrebbe tranquillamente e facilmente essere inglobato all'interno di listview personalizzati, o di altri controlli. Oppure potrebbero essere fornite procedure per collegarsi ad oggetti di ADO.net.
    Uno sviluppo ulteriore, potrebbe essere quello di scatenare alcuni eventi in zone di codice utili, due delle quali ho già contrassegnato e che permetterebbero un più raffinato controllo della stampa.
    Volendo esagerare....no, per adesso mi fermo qui!
    Se qualcuno vuole partecipare allo sviluppo, è ben accetto.
    Sarebbe utile coordinarsi un minimo per non lavorare in due, o più, sulle stesse cose.
    Appena avrò ripreso fiato, varerò la versione comprensiva di eventi.
    Poi, se non sarà stato fatto da altri, penso di postare un listview personalizzato che incorpori la classe per la stampa (quindi 'autostampante') e altre chicche classiche, come l'ordinamento per colonne, ecc...
    Rimango in attesa delle segnalazioni (inevitabili) di bugs e delle osservazioni e proposte di tutti i colleghi.
    Per capire le potenzialità del progetto, quando lanciandolo vi apparirà un listview scarsamente leggibile, chiedete un'anteprima di stampa e osservate cosa viene fuori. Poi divertitevi ad allargare le colonne e variatene le proporzioni e controllate i risultati con le anteprime. Ah, non dimenticate di provare anche l'anteprima delle configurazioni di stampa orizzontali.
    Poi, potete anche stampare....volendo!
    Il progetto è in VB2005.
    .....siate indulgenti!

    P.S. l'allegato è stato rimosso in quanto relativo ad una versione (1.0) ormai superata.
    Fare riferimento alla versione 2.0, sotto riportata.
    Ultima modifica di Master85; 06-01-2008 15:59 

  2. #2
    L'avatar di elisab
    elisab non è in linea Very Important Person
    Post
    1,750
    Ciao alextyx
    ho provato la tua classe e ti faccio due segnalazioni:
    Poi divertitevi ad allargare le colonne e variatene le proporzioni e controllate i risultati con le anteprime.
    Le modifiche delle dimensioni delle colonne fatte a run-time non si riflettono sull'anteprima, le proporzioni delle colonne dell'anteprima sono sempre quelle impostate all'avvio del form.

    C'è qualcosa di strano sull'impostazione della pagina in particolare per i margini. Cerco di spiegarmi. Imposto la pagina tenendo come margini i valori presenti (margini 10mm) premo OK, subito dopo imposto ancora la pagina e come valore proposto non c'è l'ultima impostazione ma 3,9. Ogni volta che si fa OK la volta successiva vengono proposti dei margini sempre minori.
    A occhio direi che se imposto 10mm come margini l'anteprima ha dei margini di 3,9.

    Complimenti per il bel lavoro

    Ciao
    Il Crossposting è vietato dalla Netiquette.

    Tutti gli utenti sono invitatati ad indicare nel titolo la versione di VB, Visual Studio o il Framework di compilazione.

    NB: In presenza del SyntaxHighlighter (codice colorato con numeri di riga a lato) prima di copiare il codice eseguire doppio click sulla finestra di codice, altrimenti mancheranno tutti i ritorno a capo.

  3. #3
    L'avatar di alextyx
    alextyx ora è in linea Moderatore Globale
    Luogo
    Prato
    Post
    2,585
    Grazie per i complimenti!
    Il mancato ridimensionamento a runtime, l'ho notato anch'io appena ho smesso di rilanciare il programma tutte le volte!
    L'ho già corretto. Tra l'altro non è un problema della classe, ma una dimenticanza nel codice di gestione della stessa, cioè nella Form1.

    Il secondo problema....l'ho notato anche da prima, tanto che volevo mandare al gas l'impostazione pagina!
    Devo dire che quella parte per adesso mi presenta delle zone oscure, che vanno anche oltre quello che tu stessa hai già notato. Spero di riuscire a capirci qualcosa di più. L'avevo già schedulato sull'agenda delle cose da fare (come Shrek quando gli chiedono di uccidere il drago! ).

    Nel frattempo, ho trovato qualche altro bug e ho inserito un evento di inizio stampa pagina e un precalcolo delle pagine necessarie alla stampa. Questo, come sarà mostrato dal progetto di esempio, consente, tra le altre cose, di utilizzare la famosa notazione 'Pagina x di y'. Prima non avevo la y, nè l'evento di stampa per poterla inserire nel fondo pagina (o nell'intestazione).

    Ho attivato anche la possibilità di gestire l'allineamento colonna per colonna o addirittura cella per cella. Come sarà mostrato dall'esempio, in cui le celle numeriche saranno allineate a dx mentre le testuali a sx. Nell'esempio, le numeriche non sono incolonnate, ma queste serve a mostrare ancora meglio che l'allineamento non è necessariamente legato alla colonna (di default sì, però).

    Diciamo che conto a breve di spedire una nuova versione in cui, FORSE, potrei mostrare anche come utilizzare, oltre ad un listview, una tabella di access, o meglio un datareader. Però, non prometto nulla, è solo un'ideuzza.

    Poi, una volta ucciso anche il drago, forse cercherò di capire la logica dell'imposta pagina, ma premetto che ci siamo subito trovati antipatici lui ed io!

    Approfitto per scusarmi di non aver previsto una documentazione.
    Ho affidato il tutto ai commenti del codice e alla autodescrittività e verbosità dei nomi. Chi darà un'occhiata alla mole del lavoro, capirà quanta fatica sarebbe occorsa per fare una descrizione accurata dello stesso. Diciamo che già quanto si vede nel progetto d'esempio, dovrebbe consentire un minimo utilizzo della classe. Lo scorrere le proprietà, sue e delle classi che essa contiene (Colonna e Cella), dovrebbe fornire indicazioni abbastanza fruibili.
    Poi, di fronte ad un dubbio, possiamo sempre confrontarci qui, a beneficio di tutti!
    Ultima modifica di alextyx; 10-12-2007 15:25 

  4. #4
    L'avatar di alextyx
    alextyx ora è in linea Moderatore Globale
    Luogo
    Prato
    Post
    2,585
    Aggiornamento:

    Mi sembra che l'imposta pagina abbia un baco bello e buono.
    Ho provato anche sul progetto di Massimo (cippalippa) ed ha lo stesso comportamento, pur essendo un codice diverso.
    Da quello che mi è sembrato di capire, il controllo si incasina da solo confondendo il sistema metrico con quello in pollici.
    Ogni volta che lo si riapre, senza fargli fare niente altro, i valori vengono divisi per 2,54. Guarda caso un pollice è 2,54 cm!
    Tenendo sempre presente e non scartando affatto la possibilità di mandare l'imposta pagina a quel paese, continuerò ad indagare ancora un po' ed eventualmente a cercare un 'barbatrucco' per correggergli il problema. Se qualcuno fosse pratico di quel componente e avesse qualche suggerimento, escludendo regalie e contante, sarà comunque oggetto dela mia imperitura (10 minuti ad andare bene ) gratitudine!

    P.S.
    Peccato per chi non è arrivato in tempo!
    La soluzione a quel problema di riduzione progressiva delle misure è:

    PageSetup.EnableMetric = True

    Ora rimane qualche altro dettaglio, ma siamo già un passo avanti.
    Ultima modifica di alextyx; 10-12-2007 15:54 

  5. #5
    L'avatar di alextyx
    alextyx ora è in linea Moderatore Globale
    Luogo
    Prato
    Post
    2,585

    E' arrivata la 2.0 !

    Ce l'ho fatta, adesso funziona anche l'impostazione di pagina!
    Inoltre ho fornito un minimo esempio di utilizzo caricando i dati da un DB.
    E ci sono tutte quelle cosettine che avevo preannunciato nella mia risposta ad elisab.
    Fatemi sapere cosa ne pensate!

    Ah....se ne pensate bene e vi risolve qualche problema, oltre al valutare un riconoscimento all'esimio autore , mediante il pulsante del 'Commenta Intervento', prendete anche in considerazione l'opportunità di sostenere la comunità con una donazione....anche piccina...tutto fa!
    Ultima modifica di alextyx; 01-01-2008 16:17  Motivo: Rimosso allegato della versione 2.0, già superata!

  6. #6
    L'avatar di alextyx
    alextyx ora è in linea Moderatore Globale
    Luogo
    Prato
    Post
    2,585
    Posto l'ultima versione (2.1) che contiene un piccolo aggiornamento per la correzione di un bug nell'impostazione dell'area di stampa della pagina.
    L'offset dalla parte superiore della pagina, veniva calcolato due volte, in quanto veniva riportato anche nella parte inferiore.
    Ultima modifica di alextyx; 06-01-2008 17:20  Motivo: Rimosso allegato della versione 2.1, ormai superata dalla 2.2

  7. #7
    L'avatar di elisab
    elisab non è in linea Very Important Person
    Post
    1,750
    Ciao alex
    ti segnalo un altro bug. Prelevo i dati dalla Lista con i Colori Liberi e chiedo l'anteprima, poi prelevo ancora i dati dalla lista (ma il problema si verifica anche se a questo punto uso la Tabella) e chiedo la Colorazione righe alterne. La prima riga delle pagine successive alla prima hanno mantenuto l'impostazione della stampa precedente.

    Volevo inoltre ringraziarti perchè dopo aver visto come usi i Generic per memorizzare i dati di colonne e righe sono riuscita a creare anch'io una mini-classe di stampa.
    Quote Originariamente inviato da alextyx
    oltre a mettermi in lista per la strenna natalizia
    ...magari l'anno prossimo

    Ho trovato una proprietà utile del PrintDocument: OriginAtMargins che trasla le coordinate X=0 e Y=0 ai margini Top Left in modo da non doversi più preoccupare del margine sinistro e di quello superiore.

    DrawString ha questo overload
    codice:
    Public Sub DrawString ( _
    	s As String, _
    	font As Font, _
    	brush As Brush, _
    	layoutRectangle As RectangleF, _
    	format As StringFormat _)
    Impostando correttamente il format (es format.FormatFlags = StringFormatFlags.LineLimit) stampa le righe che si vedono per intero nel rettangolo specificato (layoutRectangle).

    Usandolo insieme ad un altro overload di MeasureString e specificando le dimensioni del rettangolo dove si deve stampare
    codice:
    Public Function MeasureString ( _
    	text As String, _
    	font As Font, _
    	layoutArea As SizeF, _
    	stringFormat As StringFormat, _
    	<OutAttribute> ByRef charactersFitted As Integer, _
    	<OutAttribute> ByRef linesFilled As Integer _
    ) As SizeF
    Si può sapre oltre alle dimensioni del rettangolo reale di stampa (impostando format.FormatFlags = StringFormatFlags.LineLimit è riferito solo alle righe interamente visibili), anche il numero di caratteri che si è riusciti effettivamente a stampare (charactersFitted) e le linee riempite (linesFilled).

    Usati insieme ho avuto un risultato abbastanza soddisfacenti e sono riuscita a riportare il residuo delle stringhe non stampate nella pagina successiva, a volte ci sono problemi se risulta tagliata anche la prima riga (sulla stessa riga con lo stesso font mi stampava in una cella due numeri tagliati e nelle successive si comportava correttamente e non stampa niente), non so indagherò.

    Ciao
    Il Crossposting è vietato dalla Netiquette.

    Tutti gli utenti sono invitatati ad indicare nel titolo la versione di VB, Visual Studio o il Framework di compilazione.

    NB: In presenza del SyntaxHighlighter (codice colorato con numeri di riga a lato) prima di copiare il codice eseguire doppio click sulla finestra di codice, altrimenti mancheranno tutti i ritorno a capo.

  8. #8
    L'avatar di alextyx
    alextyx ora è in linea Moderatore Globale
    Luogo
    Prato
    Post
    2,585
    Elisab, intanto grazie di cuore delle tue segnalazioni e del tuo interesse. Grazie a te non mi sembra di aver fatto una cosa completamente ignorata!
    Ho provato a riprodurre il bug e in effetti ottengo un errore di colorazione in una sola cella (quella centrale) a pagina 3. Indagherò!
    Ti informo che sono già alla versione 4.0.
    La 3.0, sdoppia la classe in una classe master e più classi slave ognuna delle quali ha in carico, ad esempio un listview, o quello che gli abbiamo messo dentro da codice, come nel caso del caricamento da tabelle.
    La classe master provvede a stampare le varie slaves una di seguito all'altra, permettendo di far seguire, ad esempio, ad un report con 5 colonne, un commento testuale e di seguito un report a 3 colonne, ecc...
    La 4.0, tuttora in 'rifinitura', prevede l'inserimento di immagini nelle celle. Qualcosa tipo, stampa di catalogo, con l'articolo disegnato in una colonna, la descrizione e il prezzo in altre colonne.
    Tuttavia la gestione di queste versioni è un po' più complicata e se mai deciderò di postare il tutto, dovrò cercare di rimettere il più a pulito possibile il codice.
    Intanto cerchiamo di debuggare quello che abbiamo qui!
    Grazie anche per le segnalazioni sui vari metodi utilizzabili.
    Se ci mettiamo in combutta, Crystal Report lo prendiamo di tacco!

  9. #9
    L'avatar di alextyx
    alextyx ora è in linea Moderatore Globale
    Luogo
    Prato
    Post
    2,585
    Credo di aver trovato il bug, nella procedura:
    SbrApplicaColoriAlterni
    Allego la versione 2.2 con la correzione effettuata.
    Ora dovrebbe essere a posto, fammi sapere se i tuoi test lo confermano.
    File allegati File allegati

  10. #10
    L'avatar di elisab
    elisab non è in linea Very Important Person
    Post
    1,750
    Ora dovrebbe essere a posto, fammi sapere se i tuoi test lo confermano.
    Si, mi sembra che il problema sia risolto

    Se ci mettiamo in combutta, Crystal Report lo prendiamo di tacco!
    Dopo questa dichiarazione di intententi stanno già tremando

    Le nuove funzionalità sono molto interessanti

    Ciao
    Il Crossposting è vietato dalla Netiquette.

    Tutti gli utenti sono invitatati ad indicare nel titolo la versione di VB, Visual Studio o il Framework di compilazione.

    NB: In presenza del SyntaxHighlighter (codice colorato con numeri di riga a lato) prima di copiare il codice eseguire doppio click sulla finestra di codice, altrimenti mancheranno tutti i ritorno a capo.

+ Rispondi al Thread
Pagina 1 di 4 123 ... ultimoultimo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi