Newsgroup: it.lavoro.informatica
Titolo: Ancora sulle classi .NET (VB e C#)

Forse sarò sfigato, che ormai sono alla terza settimana i cui mi rompo 
le corna tentando di 'splittare' delle stringhe in VB e C#, perchè devo 
fare un certo lavoro.
Alla fine della storia mi faró tuto a mano. Ma dato che per ora tutto il 
mio software è ancora in VB .NET devo arrangiarmi
Si parlava qualche tempo fa di classi che non sono uguali tra VB e C# in 
.NET.
Ebbene, avevo cominciato a farmi una lista delle incongruenze, ma poi mi 
sono stufato perchè le cose erano troppe.
Ho due libri, ciascuno di oltre 1200 pagin, uno sul VB NET 2008 ed uno 
(della Microsoft Press) sul C#. Il secondo è meglio del primo.
Però invito a chi ne Ha voglia e tempo ad andarsi a testare la parte di
trattamento delle stringhe.
Particolarmente la Split(s,x). NON FUNZIONA come scritto sul manuale.
Se uno come carattere 'separatore' prende il VbCrLf a runtime si pianta 
tutto. Eppure dovrebbe essere una cosa naturale 'splittare' un testo 
quando si trova un carattere vbCrLf.
Per il 'lettore' di Stringhe la stessa cosa.
In Visual Basic si chiama 'StringReader' e 'StringWriter'.
In Visual C# TextReader e textWriter, ma ovviamente sul libro all'indice 
si trova solo il TextWriter. IL reader se lo sono dimenticati.
Vabbé, uno va sul Write e trova anche il reader.
E' frustrante scoprire che la classe Print.Document puo' sì stampare.
Ma solo una pagina. Se un documento è più lungo di una pagina, bisogna 
scriversi una subroutine ad-hoc, (magari con esibizionismi di  'Handles' 
e 'Adresseof' e di contarsi le righe che entrano in una pagina con la 
formuletta che tinee conto del FontHeight.
Roba da pazzi !!!
E gli esempi che si trovano sui forums molto spesso e volentieri
non funzionano, se copiati integralmente. Eppure sono anch'essi in 
VB.NET
 (almeno dicono gli autori).
Non so se prendermela con Microsoft, col Visual Basic compiler o sono 
solamenete io che sono sfigato.Bisognerebbe avere una biblioteca intera 
di libri diversi sull'argomento,  per poter estrarre almeno il 'concetto 
generale'.
In questo momento, visto come vannno le cose, mi servirebbe un Inline 
Assembler.
Ma non oso nemmeno provarlo. Sicuramente dai miei tempi è cambiato 
tutto. L'ultima volta che ho scritto una routine in Assembler 8088  era 
il 1988.
Vabbe', è tutta esperienza comunque.
Buona giornata a tutti.

 quando si trova un carattere vbCrLf.
domanda reale (non ricordo): ma in 
VB.NET
 si chiama ancora VbCrLf? un nome
un po' più intelligente non gliel'hanno trovato? se usi i due caratteri
ascii?
-- 
________________________________
Dan (34, MI)
34 years uninterrupted breathing
________________________________

 Particolarmente la Split(s,x). NON FUNZIONA come scritto sul manuale.
Mi stranizza, perché negli ultimi 10 anni la avrò pessimisticamente
usato Split 1 miliardo di volte (perlopiù da c#, ma anche da linguaggi
meno comuni come boo o brail), e non ricordo di avere avuto alcun
problema.
Magari non qui su ILI (c/p e f/u su ICLVB), ma puoi postare un unit
test per mostrare il problema che vuoi risolvere (magari qualcuno ti
mostrerà che in realtà puoi anche usare strumenti di più alto o anche
basso livello)?
--
ale
http://ale.riolo.co.uk

 
con questo post rispondo a te e a Alessandro Riolo.
Guarda, in queste tre settimane ho fatto tutti i test possibili e 
immaginabili.  Se fai un 'dump' trovi che
LF Line Feed  = chr(10)
FF  Form feed = chr(12)
CR  carraiage return = chr(13)
VbCrLf =  Chr(13 + chr(10)   laddove se li fai stampare convertendoli in
  str(asc(carattere)) ti accorgerai che solamente il chr(10) è visibile.
Il chr(13) carriag return, è visibile solo tramite il line feed seguente 
(chr(10). Il 'trapping' del chr(13) non é possibile.
Questo rende molto scomodo 'slittare' una stringa a mano.
MI riferisco unicamente alla stringa di tipo RichTextBox.Text
volendo separare le linee per costruire un array Linee(numero_di_linee).
Perchè l'Istruzione   rtb.text.Split(VbCrLf) non funziona.
Allora bisogna prima 'sostituire' il vbCrLf in un altro carattere
(ad esempio solo chr(10) )
Il tutto è motivate dal fatto che il PrintDocument stampa solamente la 
prima pagina di un rtb.text.
Se esso ha per esempio 400 linee, stampa solo le prime 50 (o il 
parametro vigente LinesPerPage)
Quindi mi devo preoccupare di farmi un array di linee A MANO, anche 
perch`e nel lettore interno   StringReader.Readiline  non è documentato 
da nessuna parte come fare il trapping dell'end-of-file.
Un casino solenne. Nonostante tutti i manuali e tutti gli esempi sui 
vari forum non sono ancora riuscito a trovare un metodo 'limpido, 
chiaro, efficiente, semplice'
per stampare tutte le pagine di un documento proveniente da una RichTextBox.
Sembra una barzelletta.

 Sembra una barzelletta.
Il framework .Net è enorme, e cresce sempre di più, il tuo potrebbe
essere un problema architetturale più che implementativo (magari
esiste un'altra libreria che fa quello che vorresti in 1 riga di
codice).
--
ale
http://ale.riolo.co.uk


Anche io non ho mai avuto problemi, bho?
Ah, guarda che vbcrlf non è un carattere, è di fatto una stinga, perché è la 
concatenazione dei due caratteri char(13) e char(10).
E' impossibile che non ti funzioni.


Sarebbe bello. In questo caso dove posso trovare un elenco di 'tutte' le 
classi esistenti in .NET ???

 
prova a mettere in un 'button' il codice seguente e dimmi cosa ti viene 
fuori
dim lines(10) as string
lines = RTB.Text.Split(vbCrLf)
e poi stampa su una richtextbox LOG le linee che ti vengono fuori.
Nel mio esempio ne stampo solo 3, dando gli indici a mano  Line(1) 
line(2) line(3) per non incorrere un indice che va fuori campo.
Mi si pianta lo stesso.
Da notare : sul manuale del VB Net questa sintassi NON È quella 
rappresentata.
Infatti c'è solo l'esempio Xstring = Split(s1,'x')
cioé usata come 'funzione'.  Ma non funziona.
L'ho intuito io che si deve usare come 'metodo' alla stessa stregua di 
xxx.ToString.
(Puo' darsi che io, essendo a Genova, ho la 'nuvoletta di Fantozzi' 
sulla capoccia....non si sa mai...)


Ok, se il tuo problema reale č questo, guarda qui:
http://msdn.microsoft.com/en-us/library/ms996492.aspx
Effettivamente la cosa non č cosě diretta...



msdn online
cia'
d.
-- 
________________________________
Dan (33, MI)
33 years uninterrupted breathing
________________________________

Dim instance As String
Dim returnValue As String()
instance = "Uno" & vbLf & "Due" & vbLf & "Tre"
returnValue = instance.Split(New [Char]() {})
 
for each s as string in returnValue
  Console.Writeline(s)
next s
' stampa
' uno
' due
' tre

AleTV schrieb:

Grazie. Ho qualcosa di nuovo da leggere. Speriamo che ci sia quello che 
cerco.

 volendo separare le linee per costruire un array Linee(numero_di_linee).
guarda che nel RichTextBox l'"a-capo" � solo il carattere 10. quindi
splitta con VbLf e vedrai che funziona
cia'
d.

beccoblu schrieb:

s�, l'avevo notato anch'io ieri sul dump. Ma ti sembra logico che in una 
RichTextBox (sempre di Microsoft Visual Basic baby si tratta) il 
Carriage Return & Line feed debba essere rappresentato solo da un line 
feed semplicemente ?
Adesso vedo se solo col Line Feed nello Split riesca a fare quello che 
voglio.
Grazie.

 
ma a parte che potresti usare la proprietą rtf:
RichTextBox.Rtf
e poi guardarti le specifiche dell'rtf.
ad esempio l'inizio linea č \par
per dire...

 FF  Form feed = chr(12)
ma scusa perche' non splitti per stringa formata da chr(13)+chr(10) 
invece che per carattere?
-- 
http://www.evilripper.net
http://www.flickr.com/photos/evilripper/

 feed semplicemente ?
ma anche si. ci sono fior di sistemi operativi in cui il CR/LF non esiste,
dopotutto :-)


ma non c'� una propriet� lines che restituisce un array con le linee di
testo? si c'� perch� eredita da textboxbase

 
a me lo Split accetta solo un carattere non una stringa.
E poi non è necessario splittare per stringa, visto che basta splittare 
per chr(10).
Splittando per chr(10) funziona.

 per chr(10).
mmm prova cosi', pero' il testo lo devi avere dentro una stringa:
pero' questo e' c# se e' questo che ti serviva:
string[] mySplit= mystr.Split(new string[] { "||"  }, 
StringSplitOptions.None);
era una delle cose che mi dimenticavo sempre e me l'ero segnata: :-D
http://www.evilripper.net/en/2008/09/30/c-split-con-una-string-e-non-con-un-char/
ps
ma te che framework usi il 2 o il 3.5 --> perche' mi sa che nel 3.5 e' 
ok qs cosa!
ciao

 testo? si c'è perché eredita da textboxbase
Porca Puipazza,
ho sostituito
lines = RTB1.Text.Split(chr(10)
con
lines = RTB1.Lines
E FUNZIONA !!!
ovviamente con
dim lines(200) as string
porcacciamaledettasozza !! Ma perchè in 1200 pagine di libro non esiste 
una nota sola su questa proprietà ?
Nemmeno un commento !!!
E per di più : sul VB 2008 tutte queste cose riguardant le string sono 
nella parte WPF, che uno normalmente salta se vuole solo fare i Windows 
Form.
Mi mancano senzaltro ancora molti llibri nella biblioteca.
Comunque il problema del PrintDocument rimane ed è la vera vergogna di 
tutto il sistema.
Che si devano fare salti mortali (basta vedere tutte le 'soluzioni' 
proposte, anche su msdn online per renderseene conto) per stampare un 
documento come si deve, non lo accetto !!! O ca§§o !

> splittare per chr(10).
ah cakkio non avevo letto! :-D
cmq il framework e' pieno di ste robe pian piano ti ci abitui! :-D

 cmq il framework e' pieno di ste robe pian piano ti ci abitui! :-D
ecco...visto che a me manca la vostra esperienza (non mi � bastato farmi 
il culo con Assembler, Fortran, PL/I, C, Visual Basic durante gli anni. 
No, ora devo farmi altri dieci anni di esperienza con .NET per arrivare 
al punto di esperienza in cui ero con Visual Basic l'anno scorso, 
mannaggia... )
qualche anima pia sa se esiste anche una propriet� 'Linecount' nel 
RichTextBox, senza dove andare a contarmi le linee a mano ??
Sarebbe una figata !  :-))
Io non la trovo da nessuna parte.

 Io non la trovo da nessuna parte.
dentro lines hai provato a vedere se c'e' Length?
.Lines.Length.ToString()

 Nemmeno un commento !!!
Si però ciccio, te lo dico con simpatia.. i libri nel 2010 li devi
bruciare. C'è l'help online, c'è google ci sono un miliardo di righe
di codice di esempio, c'è codeplex.
Poi non puoi scrivere che Split(s,x) non funziona, è OVVIO che la usi
male. Qui non siamo in vb6, qui le cose funzionano e nel 99.99999% dei
casi il problema è nel manico.

in C# c'è Environment.NewLine, credo anche in vb
On Mar 17, 12:34 pm, beccoblu


4r4g0rn At Work schrieb:

Meraviglioso. Ma me ne mette una in più del mio counter che avevo fatto 
a mano !!
Comunque ottimo !!!
Ma perchè queste cose bisogna andarle a scoprire sempre 'per caso' ??
Mica ci si puo' studiare a memoria tutte le classi, i metodi, gli 
attributi di ogni classe !!! Ekkekakkio !!!
Alcune cose 'intuitive' le ho anche scoperte da solo (sempre col metodo 
di scrivere un punto dietro la classe ed attendere il 'suggerimento' 
dell'IDE), ma una Lines.Length mi fa pensare più alla lunghezza della 
linea (string) che al numero di linee.

 casi il problema è nel manico.
oddio si e' vero vb6 aveva dei buggoni uno in particolare sulle liste 
adesso non mi ricordo bene... imho il rischio piu' grande dei framework 
immensi, e' usare strumenti sbagliati in determinate situazioni.
per es. xmldocument va bene per documenti piccolissimi! :-D
ps
i bug e le vulnerabilita' ci sono e ci saranno sempre in qualsiasi software
http://www.aitcnet.org/isai/

 linea (string) che al numero di linee.
e' solo questione di abitudine cmq si la strada e' quella! :-D pigia il 
punto e vedi cosa c'e' di solito le robe che contano in una lista sono 
la propieta' pubblica length o il metodo Count() poi alla fine la roba e 
le necessita' son sempre le stesse e le classi simili hanno sempre le 
stesse cose! :-D
cya

 
ti dico la mia... io programmo in java/c++/php al 95% del tempo, però mi
sono andato su msdn a vedere i metodi suoi e delle classi da cui deriva
tutto qua; ok i libri per la sintassi, esempi, casi di studio, ma un
occhiata alle refernece è d'obbligo per altro msdn è a mio parere è
veramente fatto bene, anzi benissimo.

 
Be', io ingenuamente seguivo gli esempi 'alla lettera'. Copia incollando
gli esempi sui forum e sui libri. (pochi giorni fa ho copiaincollato un 
esempio , sedicente VB. NET in cui alcune istruzioni mi davano giá 
errori di compiler perchè la sintassi era sbagliata. E non erano erori 
di ortografia, ma proprio perchè era la sintassi che era sbagliata).
Però nel mondo dell'object oriented questo ovviamente non serve più . 
Oggi si va tutto a 'intuito'...
Vabbe' mi adeguerò alla maggioranza.

> ascii?
sě certo. Ormai anch'io mi sono modernizzato in quel senso. Le avevo 
provate tutte, ma cosě, tanto per essere 'completo' volevo provare anhce 
i nominativi 'vecchi' del VB6

 veramente fatto bene, anzi benissimo.
si msdn ha fatto passi da giganti e ha raggiunto una qualità quasi 
decente, una volta era peggio! :-D
php.net
 e' una figata! :-D
per java che c'e' online?(l'ho usato solo un po' all'uni tipo 9 anni fa 
  e prima o poi mi piacerebbe riprenderlo :-D )

 veramente fatto bene, anzi benissimo.
sarà fatto pure bene (è il minimo che possano fare viste le difficoltà 
che hanno 'creato' i developers di Visual Stusio sbattendosene altamente 
delle difficoltá che avrebbero ncontrato i developers di applicazioni 
<hahahahah>)
Ti sei letto il link a msdn che è stato suggerito da AleTV oggi  ?
Ti sembra una cosa seria dover fare quei salti mortali per far
stampare 'normalmente' una RichTextBox su una stampante col metodo 
PrintDocument ??
Che è scritto su tutti i libri che vanno per la maggiore ?
A me no.
Con tutte le ore che hanno speso a scrivere classi che fanno tutto 
comodamente (come Split che ho scoperto oggi) perchè non hanno fatto 
anche quella ?
Ma forse mi viene un dubbio. Vuoi vedere che su libri di autori italiani 
queste cose ci sono ?  Io sto seguendo solo libri tedeschi....
(Ma con quello che costano, chi va a comprarsi un libro in ogni lingua ??

 sì certo. Ormai anch'io mi sono modernizzato in quel senso.
nel senso che mi sono dichiarato io stesso la costante,
con
dim LF as char = chr(10)
e vado tranquillo... :-)))
chemmefrega del VbCrLf  ???


no guarda su 
php.net
 non mi trovi d'accordo, la documentazione varia
(per esempio per le spl non c'è quasi una mazza) e si basa troppo sui
commenti, per java ci sono le api: puntuali, precise e sintetiche, più i
vari tutorial.
http://java.sun.com/
:-)

 
no ho cercato su google=> richtextbox msdn

 code che ???
http://www.codeplex.com
 migliaia di applicazioni open source
funzionanti e scaricabili, che ti serve ? Wordpad ? Eccolo :
http://wpad.codeplex.com/
Stampa pure, credo tutte le pagine...
Lo vuoi più complesso ? Ecolo : 
http://wpfricheditorlibrary.codeplex.com/
Vai su 
http://www.codeplex.com
 , cerchi rtf e scarichi e copi ed
impari come si scrive, forse il codice che trovi è troppo complesso
per uno alle prime armi ma puoi cercare ed estrarre il codcie che ti
serve.
PS: VB.net e c# sono intercambiabili e ci sono diversi tool online e
non che ti convertono il codice tra i due linguaggi automaticamente.

 
Una volta esisteva il BCX che faceva la stessa cosa da MS Basic7  a C.

 formuletta che tinee conto del FontHeight.
Non ho capito, io stampo benissimo su più pagine, basta sapere a che punto
dare la rottura di pagina (quindi devi gestirti la posizione verticale con
una ipotetica variabile py che aumenti riga dopo riga).
In pratica nell'evento PrintPage se poni e.HasMorePages() = True
ed esci dalla Sub (riportanto la tua variabile ipotetica py a zero) 
sei a posto.
Io utilizzo la classe PrintDocument, che ho inglobato in una mia classe per
gestire comodamente i comandi da codice.
In questro modo ho anche "gratis" l'anteprima a video, oltre che la stampa
normale.
PaF

 Splittando per chr(10) funziona.
Se s è la tua stringa usa (vado a memoria)
s.Replace(vbCrLf, vbTab).Split(vbTab)
PaF

 
Ah be, una volta risolto quello hai risolto anche la questione del 
Printview.

 
Sě, ma 'replace' č un espediente.
E quale carattere usi per rimpiazzare un end-of-line ?
IMHO č meglio rimanere con chr(10).

 PRIMA PAGINA.
Poiché a me non succede è evidente che c'è qualcosa di diverso
nell'approccio, spero che il suggerimento ti sia utile.
Qui uno stralcio del codice, prendilo come semplice spunto perchè
chiaramente ti troverai variabili non dichiarate etc etc:
Public Class Report
      'Definizioni per l'array dei comandi di stampa
      Private Enum ComandType
         PrintString = 2
         NewLine = 3
         NewPage = 5
         Line = 6
         Font = 7
         Color = 8
         MoveY = 9
      End Enum
      Private Structure PrintComand
         Public Type As ComandType
         Public PosX As Integer
         Public PosY As Integer
         Public EndX As Integer
         Public EndY As Integer
         Public Value As String
         Public Style As FontStyle
         Public Align As HorizontalAlignment
         Public ForeColor As Color
      End Structure
      Public Enum DocOrientation
         Vertical = 0
         Horizontal = 1
      End Enum
      'Variabili
      Public CurrentX As Integer
      Public CurrentY As Integer
      Public Orientation As DocOrientation
      Public PaperType As PaperKind
      Private CurrentHeight As Integer 'Altezza del foglio in pollici
      Private CurrentWidth As Integer  'Larghezza del foglio in pollici
      Private LineHeight As Integer
      Private WithEvents doc As PrintDocument
      Private fnt As Font
      Private Comands As ArrayList
      Private FontName As String
      Private FontSize As Integer
      Private ForeBrush As Brush
      'Qualche metodo estratto dalla classe
      Public Sub Font(ByVal Name As String, ByVal Size As Integer)
         Dim p As PrintComand
         p.Type = ComandType.Font
         p.Value = Name
         p.PosX = Size
         Comands.Add(p)
      End Sub
      Public Function Init(ByVal Frm As Form) As Boolean
         Dim pd As PrintDialog
         doc = New PrintDocument
         If Orientation = DocOrientation.Horizontal Then
doc.DefaultPageSettings.Landscape = True
         pd = New PrintDialog
         pd.Document = doc
         pd.PrinterSettings = New PrinterSettings
         If pd.ShowDialog() = DialogResult.OK Then
            Init = True
            doc.PrinterSettings.PrinterName =
pd.PrinterSettings.PrinterName
            CurrentHeight = doc.DefaultPageSettings.PaperSize.Height
            CurrentWidth = doc.DefaultPageSettings.PaperSize.Width
            PaperType = doc.DefaultPageSettings.PaperSize.Kind
            Comands = New ArrayList
            fnt = New Font("Arial", 12)
            doc.DocumentName = Frm.Text
         End If
      End Function
      Public Sub NewLine()
         Dim p As New PrintComand
         p.Type = ComandType.NewLine
         Comands.Add(p)
      End Sub
      Public Sub NewPage()
         Dim p As New PrintComand
         p.Type = ComandType.NewPage
         Comands.Add(p)
      End Sub
      Public Sub Preview()
         Try
            Dim dlg As New PrintPreviewDialog
            dlg.Document = doc
            dlg.AutoScale = False
            dlg.ShowDialog()
         Catch e As Exception
            '...
         End Try
      End Sub
      Public Sub PrintLine(ByVal StartX As Integer, ByVal StartY As
Integer, ByVal EndX As Integer, ByVal EndY As Integer)
         'Linea Generica, coordinate in mm trasformate in pollici
         Dim p As New PrintComand
         p.Type = ComandType.Line
         p.PosX = CDbl(StartX) * CDbl(100) / 25.4
         p.PosY = CDbl(StartY) * CDbl(100) / 25.4
         p.EndX = CDbl(EndX) * CDbl(100) / 25.4
         p.EndY = CDbl(EndY) * CDbl(100) / 25.4
         Comands.Add(p)
      End Sub
      Private Sub PrintPage(ByVal sender As Object, ByVal e As
System.Drawing.Printing.PrintPageEventArgs) Handles doc.PrintPage
         Dim i As Integer, w As Integer
         Dim p As PrintComand
         Dim fntl As Font
         Dim s As String
         Dim width As Integer    'Larghezza pagina che può essere l'altezza
nel caso di stampe orizzontali
         Dim height As Integer   'Altezza pagina che può essere la
larghezza nel caso di stampe orizzontali
         While Count < Comands.Count
            p = Comands(Count)
            Count += 1
            If Orientation = DocOrientation.Vertical Then
               width = CurrentWidth
               height = CurrentHeight
            Else
               width = CurrentHeight
               height = CurrentWidth
            End If
            Select Case p.Type
               Case ComandType.PrintString
                  fntl = New Font(FontName, FontSize, p.Style)
                  s = p.Value
                  If p.PosY > 0 Then
                     If p.Value.Length > p.PosY Then
                        s = p.Value.Substring(0, p.PosY) & "..."
                     End If
                  End If
                  If p.PosX = -1 Then
                     w = e.Graphics.MeasureString(s, fntl).Width
                     p.PosX = (width - w) / 2
                     p.PosX *= 25.4 / 100
                  End If
                  Select Case p.Align
                     Case HorizontalAlignment.Left
                        e.Graphics.DrawString(s, fntl, ForeBrush,
Conv(p.PosX), CurrentY)
                     Case HorizontalAlignment.Right
                        w = e.Graphics.MeasureString(s, fnt).Width
                        e.Graphics.DrawString(s, fntl, ForeBrush,
Conv(p.PosX) - w, CurrentY)
                     Case HorizontalAlignment.Center
                        w = e.Graphics.MeasureString(s, fnt).Width
                        e.Graphics.DrawString(s, fntl, ForeBrush,
(Conv(p.PosX) - w) / 2, CurrentY)
                  End Select
                  fntl.Dispose()
               Case ComandType.Line
                  Dim pn As Pen
                  pn = New Pen(System.Drawing.Color.Black, 1)
                  If p.PosY = -1 And p.EndY = -1 Then
                     'Linea Orizzontale alla posizione corrente
                     e.Graphics.DrawLine(pn, p.PosX, CurrentY, p.EndX,
CurrentY)
                  Else
                     'Linea Generica
                     e.Graphics.DrawLine(pn, p.PosX, p.PosY, p.EndX,
p.EndY)
                  End If
                  pn.Dispose()
               Case ComandType.NewLine
                  CurrentY += LineHeight
                  If CurrentY > height - 6 * LineHeight Then
                     DrawBottom(width, height, e)
                     e.HasMorePages = True
                     CurrentX = 0
                     CurrentY = MarginTop
                     For i = 0 To HeaderComands.Count - 1
                        Comands.Insert(Count + i, HeaderComands(i))
                     Next
                     Exit Sub
                  End If
               Case ComandType.Font
                  FontName = p.Value
                  FontSize = p.PosX
               Case ComandType.Color
                  ForeBrush = New SolidBrush(p.ForeColor)
               Case ComandType.BottomPage
                  DrawBottom(width, height, e)
               Case ComandType.NewPage
                  e.HasMorePages() = True
                  CurrentX = 0
                  CurrentY = MarginTop
                  Exit Sub
               Case ComandType.MoveY
                  CurrentY += CDbl(p.PosY) * CDbl(100) / 25.4
            End Select
         End While
      End Sub
      Public Sub PrintString(ByVal X As Integer, ByVal Value As String,
Optional ByVal Style As FontStyle = FontStyle.Regular, Optional ByVal Align
As HorizontalAlignment = HorizontalAlignment.Left, Optional ByVal MaxLength
As Integer = 0)
         Dim p As PrintComand
         p.Type = ComandType.PrintString
         p.PosX = X
         p.PosY = MaxLength
         p.Align = Align
         p.Value = Value
         p.Style = Style
         Comands.Add(p)
         If Header Then HeaderComands.Add(p)
      End Sub
      Public Sub Start()
         doc.Print()
      End Sub
Da altre parti del programma usi la classe in un modo simile a questo:
Dim o as new Report
o.PrintString(...)
o.NewLine
o.PrintLine(...)
bla bla bla
o.Start
Mi dirai se ti è stato utile.
PaF

 IMHO è meglio rimanere con chr(10).
Si ma se nella tua stringa hai un vbCrLf perché magari il contenuto è stato
letto da file, che alternative hai ?
PaF

 
<cut>
WOW !!! grazie infinite per il code !!!
Me l'ho copiaincollato. Domani lo testo e ti so dire !
(ora vado a letto, dopo aver visto 'Il socio' su R4. Bellisismo film !!!)
Buonanotte. A domani.


Hai bisogno di una alternativa ? Nel caso di VbCrLf l'analisi della 
stringa incontrer� prima un chr(13) e poi un chr(10). Questo dovrebbe 
bastare per 'splittare' il testo, no ?
Dai miei test � risultato che il chr(13) (appositamente scritto a 
programma) l'ha totalmente ignorato (cio� � invisibile) mentre invece il 
seguente chr(10) � stato riportato nel dump correttamente.


Buongiorno.
Ancora grazie pe ril code di ieri sera.
L'ho guardato attentamente. Ovviamente la tua è una classe completa pe 
ril 'report'.
Per me è sufficiente solo una parte, per cui 'estraggo' solo il 
concetto, e lo adatto ai miei bisogni.
Avrei un paio di domande :
- tu fai  il 'try' sul Preview, quando chiami la e.Graphics....
   Ma ha senso farlo solo lì ? perchè non farlo anche quando stampi ?
   Cioè più avanti , quando la chiami dentro il 'select' ?
- Nel mio caso il metodo e.Graphics.Drawstrings.... non mi dà una 
exception : stampa tranquillamente le cose sbagliate (cioè ripete sempre 
la stessa pagina). Questo 'errore' elude senzaltro un catch. O sbaglio ?

>> comandi.
Non mi riesce di capire quale a quale classe tu ri rifai per il 'New 
Page'.  Vedo solo che il ComandType è un tipo che hai creato tu.
Come faccio a 'provocare' un salto di pagina dopo un evento 
ev.Drawstring.... ?

 ev.Drawstring.... ?
Per il salto pagina chiamo il metodo NewPage della mia classe, che aggiunge
un comando di tipo NewPage nella lista interni dei comandi.
Quando poi all'interno dell'evento PrintPage ciclo tutti i comandi, quando
incontro il NewPage eseguo questo codice:
Case ComandType.NewPage
e.HasMorePages() = True
CurrentX = 0
CurrentY = MarginTop	'E' il margine che gestisco come parametro
Exit Sub
Poich� dopo scatta di nuovo il PrintPage, avendo il mio indice Count
dichiarato a livello di classe, posso continuare a elaborare i comandi
rimanenti.
Ciao
PaF