Newsgroup: it.comp.lang.visual-basic
Titolo: incolonnamento tramite Printer.Print

Senza utilizzare DataReport o Crystal Report ho penssato di utilizzare
Printer.Print per creare un semplicissimo report. La routine č questa:
Private Sub cmdStampa_Click()
      Printer.ScaleMode = vbCharacters
      Printer.FontName = "MS Sans Serif" ' oppure un qualsiasi altro
carattere non True Type
      Printer.FontSize = 8
      Printer.FontBold = True
      Printer.CurrentY = 1
      Printer.Print "STAMPA STATISTICHE DITTE ALLA DATA DEL: " +
Format(Date, "dd/mm/yyyy");
      Printer.Line (0, 2)-(130, 2)
      Printer.CurrentY = 3
      Printer.CurrentX = 0
      Printer.Print "Ditta";
      Printer.CurrentX = 40
      Printer.Print "Venduto";
      Printer.CurrentX = 50
      Printer.Print "Venduto a.p.";
      Printer.Line (0, 4)-(130, 4)
      Ditte.MoveFirst
      Y = 0
      TotVen = 0
      TotVex = 0
      TotPrv = 0
      TotEna = 0
      TotRit = 0
      VarVen = 0
      Do While Ditte.EOF = False
            Printer.CurrentX = 0
            Printer.CurrentY = 5 + Y
            Printer.Print Ditte!rgs
            Printer.CurrentX = 48 - (Len(Format(Trim(Str(CCur(Ditte!ven))),
"#,###")))
            Printer.CurrentY = 5 + Y
            Printer.Print Format(Trim(Str(CCur(Ditte!ven))), "#,###")
            TotVen = TotVen + CCur(Ditte!ven)
            If IsNull(Ditte!vex) = False Then
               Printer.CurrentX = 62 -
(Len(Format(Trim(Str(CCur(Ditte!vex))), "#,###")))
               Printer.CurrentY = 5 + Y
               Printer.Print Format(Trim(Str(CCur(Ditte!vex))), "#,###")
               TotVex = TotVex + Ditte!vex
            End If
            Y = Y + 1
            If Y = 61 Then Printer.NewPage: Y = 0
         End If
         Ditte.MoveNext
      Loop
      Printer.Line (0, 5 + Y + 1)-(130, 5 + Y + 1)
      Printer.CurrentX = 20
      Printer.CurrentY = 5 + Y + 2
      Printer.Print "TOTALI";
      Printer.CurrentX = 48 - (Len(Format(Trim(Str(CCur(TotVen))),
"#,###")))
      Printer.CurrentY = 5 + Y + 2
      Printer.Print Format(Trim(Str(CCur(TotVen))), "#,###")
      Printer.CurrentX = 62 - (Len(Format(Trim(Str(CCur(TotVex))),
"#,###")))
      Printer.EndDoc
End Sub
Essendo impostata la scala su 'caratteri' ed usando un carattere a larghezza
fissa, pensavo di riuscire ad incolonnare i numeri allineati a destra.
Purtroppo non ciriesco. A seconda che il campo da stampare sia di 6,7,8 o
piů caratteri cambia l'allineamento. Sembra che cambi per la dimensione di
un punto di separazione delle migliaia. Chiedo un prezioso aiuto perché non
riesco proprio a trovare la soluzione. Grazie.

Il metodo Printer.PrintWidth(<Stringa>)  restituisce la larghezza del testo
da stampare. In pratica prima definisci il font, scala e dimensioni, poi
crei la stringa quindi ricavi l'occupazione (in larghezza) della stringa e
infine calcoli le coordinate (per currentX e Y) di stampa.
Prova un po' se ho azzeccato la risposta !
Ciao



Devi usare font a grandezza fissa.
Ciao Maurizio

 ha scritto nel messaggio
news:8eml5q$33f$1...@nslave2.tin.it...


Ho fatto una stampa simile per un piccolo programma.
Utilizzando font a larghezza fissa, mi preparavo una stringa vuota con la
funzione SPACE, quindi sostituivo le informazioni nella posizione esatta
dove le volevo all'interno della stringa vuota infine stampavo l'intera riga
formattata.
Un po' come si fa con i tracciati record ascii.
Il risultato è ordinato ma sicuramente non proprio "bello" quanto un report.
ciao Mau


Tempo fa' ho scritto una routine per eseguire delle stampe allineate,
funziona circa cosi'
StampaAllineato <testo da stampare>, <posizione>, <allineamento>
dove l'allineamento puo' essere a sinistra, destra ed anche centrato.
Se ti interessa batti un colpo.

 aiuto perché non riesco proprio a trovare la soluzione.
--
Ciao.
Maurizio