Newsgroup: it.comp.lang.visual-basic
Titolo: [STAMPA] come stampare un testo di una richtextbox senza ritorno carrello

1234567890123456789012345678901234567890123456789012345678901234567890123456
7890123456789012345678901234567890123456789012345678901234567890123456789012
3456789012345678901234567890123456789012345678901234567890123456789012345678
9012345678901234567890123456789012345678901234567890123456789012345678901234
5678901234567890123456789012345678901234567890123456789012345678901234567890
1234567890123456789012345678901234567890123456789012345678901234567890123456
78901234567890123456789012345678901234567890
se si fà il copia e incolla della stringa sopra e la si mette su word lui la
fà vedere in più righe e se la stampo la stampo su più righe
se la si incolla in una richtextbox la si vede su più righe ma giustamente
se faccio printer.print rtb.text ma la stampa lunga ed esce fuori dal foglio
come faccio per stamparla in stile like word?
grazie


ops...il client di posta mi ci ha aggiunto in automatico il ritorno carrello
quindi per provarla bisogna prima farne una stringa unica


Hai provato con la proprieta' Multiline ed il metodo SelPrint (invece di 
printer.print)?
ciao
	maxx
-- 
NOSPAM: Rimuovere i trattini dallo username!
Cut hyphens from my username!


la proprietà multiline è già a true e infatti il testo lo vedo su più righe
in quanto va a capo da solo
ho provato con selprint e devo dire che stampa il testo
formattato.........ho solo un piccolo problema poichè prima e dopo devo
stampare altre cose oltre al contenuto del richtextbox e se uso l'oggetto
printer quando faccio printer.enddoc mi restituisce errore della stampante
482 eppoi facendo le prove con la stampante di adobewriter mi genera due
documenti come se facesse due stampe separate per l'oggetto printer e per il
richtextbox
come mai?
Printer.FontName = "Courier New"
Printer.FontSize = 9
Printer.Print txtTitolo.Text
Printer.Print
txtDescrizione.SelPrint Printer.hDC
Printer.EndDoc

"Huntercity" <spag...@NOSPAMfreemail.it> wrote in message
news:Afa4a.258933$AA2.10...@news2.tin.it...

Dim Rows() as String, i as Long
Rows = Split(textbox.text, vbcrlf)
For i = 0 to ubound(Ar)
    Printer.Print Rows(i)
Next i
Saluti


forse non hai capito cosa volevo fare, io nella mia richtextbox non ho
ritorno carrello quindi niente vbcrlf e quindi la split mi restituisce la
richtextbox e mi stampa a cavolo

"Huntercity" ha scritto nel messaggio

Gugla per "cesare rizzi api", sul suo sito c'č un esempio
di come leggere il testo di una (rich)textbox riga per riga
proprio come č visualizzata.
Bye, G.

 Printer.Print
Prova,come consiglia la guida, con:
Printer.print ""


 come faccio per stamparla in stile like word?
devi "misurare" lo spazio occupato dai caratteri, ovvero di parte della
stringa, sino a "saturare" lo spazio disponibile di ogni riga.
Vedi (in relazione a Printer) ScaleWidth e TextWidth


proverò a estrarre dalla richtextbox k caratteri alla volta e stamparli dove
k è la lunghezza della mia riga di stampa
ho dimensionato la richtextbox a 104 caratteri courier new fontsize 9,
quanti ce ne entrano in foglio di stampa sempre dimensionato uguale
vediamo cosa riesco a combinare


già provato ma non capisco perchè alla fine mi dà errore.....bho


trovato il sito di rizzi ma sono riuscito a scovare solo il codice che mi
restituisce il numero di righe di una textbox e niente riguardo a come
estrarre le righe come sono visualizzate
grazie ugualmente

 estrarre le righe come sono visualizzate
Ok, lo ripasso. E' scritta coi piedi, ma funziona (di solito ;-) ).
Per prima cosa, devi ottenere il numero di righe come hai
gią visto, poi inserisci questa roba.
In un modulo:
_____________________________
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
            (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
            ByRef lParam As Byte) As Long
Public Const EM_GETLINE = &HC4
Public Const EM_GETLINECOUNT = &HBA
Public Buffer As String
Public Const MaxCaratteri = 256      ' Questo puņ essere scalato alla misura della TextBox
Public buff(MaxCaratteri) As Byte
Public Function fGetLine(Scatola As Control, NumeroDiRiga As Long) As String
' Questa funzione riempie Il buffer con la linea di testo
' presa dalla TextBox Scatola e alla linea specificata
' La prima linea č zero.
      Dim byteBasso As Integer
      Dim byteAlto As Integer
      Dim x As Integer
      Dim k As Integer
      byteBasso = MaxCaratteri And (255)
      byteAlto = Int(MaxCaratteri / 256)
      Buffer$ = Chr$(byteBasso) + Chr$(byteAlto) + Space(MaxCaratteri - 2)
      For k = 0 To 100
            buff(k) = 255
      Next k
      x% = SendMessage(Scatola.hwnd, EM_GETLINE, NumeroDiRiga, buff(0))
      fGetLine = ""
      For k = 0 To 100
            If buff(k) = 255 Then Exit For
            fGetLine = fGetLine & Chr$(buff(k))
      Next k
End Function
_____________________________
A questo punto, con:
    Debug.Print fGetLine(RichTextBox1, NumeroDellaRigaCheTiInteressa)
ottieni il testo contenuto nella RTBox, riga per riga.
Bye, G.

 ha scritto

aggiungo al tuo codice, se riesco a rimettere tutto, quello che avevo
trovato in rete.
codice brutto, molto vecchio, ma quando lo usavo funzionava.
spero di mettere tutte le dich necessarie.
ciao
BAS
' PRINT RTF
Type Rect
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type
Type CharRange
    cpMin As Long     ' First character of range (0 for start of doc)
    cpMax As Long     ' Last character of range (-1 for end of doc)
End Type
Type FormatRange
    hdc As Long       ' Actual DC to draw on
    hdcTarget As Long ' Target DC for determining text formatting
    rc As Rect        ' Region of the DC to draw to (in twips)
    rcPage As Rect    ' Region of the entire DC (page size) (in twips)
    chrg As CharRange ' Range of text to draw (see above declaration)
End Type
'Global Const WM_USER As Long = &H400
Global Const EM_FORMATRANGE As Long = WM_USER + 57
Global Const EM_SETTARGETDEVICE As Long = WM_USER + 72
Global Const PHYSICALOFFSETX As Long = 112
Global Const PHYSICALOFFSETY As Long = 113
Declare Function GetDeviceCaps _
Lib "gdi32" (ByVal hdc As Long, _
ByVal nIndex As Long) As Long
Declare Function SendMessage _
Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal Msg As Long, _
ByVal WP As Long, lp As Any) As Long
Declare Function CreateDC _
Lib "gdi32" Alias "CreateDCA" _
(ByVal lpDriverName As String, ByVal lpDeviceName As String, _
ByVal lpOutput As Long, ByVal lpInitData As Long) As Long
Public Sub PrintRTF(RTF As RichTextBox, LeftMarginWidth As Long, _
        TopMarginHeight, RightMarginWidth, BottomMarginHeight)
    On Error GoTo errman
    Dim LeftOffset As Long, TopOffset As Long
    Dim LeftMargin As Long, TopMargin As Long
    Dim RightMargin As Long, BottomMargin As Long
    Dim fr As FormatRange
    Dim rcDrawTo As Rect
    Dim rcPage As Rect
    Dim TextLength As Long
    Dim r As Long
    Dim J
    For J = 1 To Val(frmStampa.txtCopies) ' aggiunto io => # copie
        frmStampa.lblPrintingPage = 1
        frmStampa.lblPrintingCopy = Val(frmStampa.lblPrintingCopy) + 1
        DoEvents
            Dim NextCharPosition As Long
            Printer.Print Space(1) ' Start a print job to get a valid
Printer.hDC
            Printer.ScaleMode = vbTwips
            ' Get the offsett to the printable area on the page in twips
            LeftOffset = Printer.ScaleX(GetDeviceCaps(Printer.hdc, _
                PHYSICALOFFSETX), vbPixels, vbTwips)
            TopOffset = Printer.ScaleY(GetDeviceCaps(Printer.hdc, _
                PHYSICALOFFSETY), vbPixels, vbTwips)
            ' Calculate the Left, Top, Right, and Bottom margins
            LeftMargin = LeftMarginWidth - LeftOffset
            TopMargin = TopMarginHeight - TopOffset
            RightMargin = (Printer.Width - RightMarginWidth) - LeftOffset
            BottomMargin = (Printer.Height - BottomMarginHeight) - TopOffset
            ' Set printable area rect
            rcPage.Left = 0
            rcPage.Top = 0
            rcPage.Right = Printer.ScaleWidth
            rcPage.Bottom = Printer.ScaleHeight
            ' Set rect in which to print (relative to printable area)
            rcDrawTo.Left = LeftMargin
            rcDrawTo.Top = TopMargin
            rcDrawTo.Right = RightMargin
            rcDrawTo.Bottom = BottomMargin
            ' Set up the print instructions
            fr.hdc = Printer.hdc   ' Use the same DC for measuring and
rendering
            fr.hdcTarget = Printer.hdc  ' Point at printer hDC
            fr.rc = rcDrawTo            ' Indicate the area on page to draw
to
            fr.rcPage = rcPage          ' Indicate entire size of page
            fr.chrg.cpMin = 0           ' Indicate start of text through
            fr.chrg.cpMax = -1          ' end of the text
            ' Get length of text in RTF
            TextLength = Len(frmStampa.RTFPrint.Text)
            Do  ' Loop printing each page until done
                ' Print the page by sending EM_FORMATRANGE message
                NextCharPosition = SendMessage(frmStampa.RTFPrint.hwnd,
EM_FORMATRANGE, True, fr)
                If NextCharPosition >= TextLength Then Exit Do  'If done
then exit
                fr.chrg.cpMin = NextCharPosition ' Starting position for
next page
                Printer.NewPage                  ' Move on to next page
                frmStampa.lblPrintingPage = Val(frmStampa.lblPrintingPage) +
1
                DoEvents
                Printer.Print Space(1) ' Re-initialize hDC         fr.hDC =
Printer.hDC
                fr.hdcTarget = Printer.hdc
            Loop
            ' Commit the print job
        Printer.EndDoc      ' Allow the RTF to free up memory
    Next J
    r = SendMessage(frmStampa.RTFPrint.hwnd, EM_FORMATRANGE, False, ByVal
CLng(0))
    Exit Sub
errman:
    MsgBox Error
    Exit Sub
End Sub
FORM
Private Sub cmdOK_Click()
    ' 1 CM = 567 TWIPS
    On Error GoTo errman
framePrinting.Enabled = True
lblPC.Enabled = True
lblPrintingCopy.Enabled = True
lblPP.Enabled = True
lblPrintingPage.Enabled = True
    Dim LM As Long, TM As Long, RM As Long, BM As Long
    LM = Val(txtLM) * 567
    TM = Val(txtTM) * 567
    RM = Val(txtRM) * 567
    BM = Val(txtBM) * 567
    With frmMain.ActiveForm.RTF
        'RTFPrint .Left = .Left
        'RTFPrint .Top = .Top
        RTFprint.Width = Width
        RTFprint.Height = Height
        RTFprint.RightMargin = .RightMargin
        RTFprint.SelFontName = .SelFontName
        RTFprint.SelFontSize = .SelFontSize
        RTFprint.SelBold = .SelBold
        RTFprint.SelItalic = .SelItalic
        If optPrintAll Then
            RTFprint.Text = .Text
        ElseIf optPrintSel Then
            RTFprint.Text = .SelText
        End If
    End With
    RTFprint.SelLength = 0
    PrintRTF RTFprint, LM, TM, RM, BM
framePrinting.Enabled = False
lblPC.Enabled = False
lblPrintingCopy.Enabled = False
lblPP.Enabled = False
lblPrintingPage.Enabled = False
txtCopies = 1
'    Unload Me
    Exit Sub
errman:
    MsgBox Error
framePrinting.Enabled = False
lblPC.Enabled = False
lblPrintingCopy.Enabled = False
lblPP.Enabled = False
lblPrintingPage.Enabled = False
txtCopies = 1
    Exit Sub
End Sub

[Huntercity] scrisse:
(snip)
é lungo parecchio, però cerca di leggere il post di a.p, lì c'è la soluzione,
fidati.
Se vuoi, quella funzione ti restituisce anche lo "spazio" occupato dalla stampa
del testo rtf.
--
Salutoni
Sergio

 Ok, lo ripasso. E' scritta coi piedi, ma funziona (di solito ;-) ).
grazie oggi la provo e vi faccio sapere


grazie anche a te proverò anche la tua soluzione

 ha scritto nel messaggio
news:b2rve5$1fqb1t$1@ID-> Ok, lo ripasso. E' scritta coi piedi, ma funziona
(di solito ;-) ).
[cut] e di brutto...... :-)
funziona o meglio ho fatto una prova con il debug.print e mi tira fuori le
righe della richtextbox, poi il passo da li a stampare tutta la richtextbox
è breve basta usare il grande oggetto printer
grazie

 spero di mettere tutte le dich necessarie.
....sinceramente ho gettato la spugna (anche perchč quella di Paperino č piů
corta e funziona)
ho provato a seguire un pň la logica del codice ma mi mancano alcune FORM e
altre cosucce.....quando avrň piů tempo di darň un'occhiata


non dire gatto se non ce l'hai nel sacco
come volevasi dimostare non mi funziona o meglio ho lo spiacevole risultato
che quando faccio
Dim numRighe as Long
Dim i as Long
Dim strPrn as String
Printer.Print " "
numRighe = SendMessage(txtDescrizione.hwnd, EM_GETLINECOUNT, 0&, 0&)
For i = 0 To numRighe - 1
    Printer.Print fGetLine(frmPreview.txtDescrizione, i)
Next i
Printer.EndDocPrinter.EndDoc
mi viene fuori un doppio ritorno carrello tranne nelle righe che vanno a
capo automaticamente senza aver battuto enter dopo la loro scrittura
altra cosa ci sono pezzi di codice che non comprendo tipo questo
Public Buffer As String    ' a cosa serve??? non viene mai usata
o meglio viene usata nella funzione in questo modo
Buffer$ = Chr$(byteBasso) + Chr$(byteAlto) + Space(MaxCaratteri - 2)
ma non è poi usata da nessuno e quindi non ne capisco l'utilità
altra cosa
For k = 0 To 100
            buff(k) = 255
      Next k
      x% = SendMessage(Scatola.hwnd, EM_GETLINE, NumeroDiRiga, buff(0))
      fGetLine = ""
      For k = 0 To 100
            If buff(k) = 255 Then Exit For
            fGetLine = fGetLine & Chr$(buff(k))
      Next k
perchè cicli fino a 100 e non fino a maxcaratteri?
grazie

 perchè cicli fino a 100 e non fino a maxcaratteri?
Beh, qui la spiegazione è un tantino più complicata... non è
facile da spiegare ma ci provo. Dunque, da dove comincio ?
.....................
La funzione non restituisce una normale stringa, ma riempie
un buffer di caratteri che corrisponde più o meno a quella
che in C viene chiamata una stringa Null-terminated che cioè
ha alla fine dei caratteri Null, cioè ASCII 255 che però il VB
presenta con delle tipiche caratteristiche tipo scaglie, quelle
verdi che, insomma, c'hai presente quando vai a pescare (io
non vado da anni a pescare e poi preferisco sciare, ma anche
quello sono anni che non ci vado più, da quando mi sono
sposato) che ti si appiccicano addosso e poi tarapia tapioca
come foss'antani, con scappellamento verso destra, capisci ?
Un Paperino "Non si preoccupi, è _solo_ un BUG !" =:-(

 ha alla fine dei caratteri Null, cioè ASCII 255 che però il VB...
si ma tu prima allochi un array di byte di Maxcaratteri poi però ne
inizializzi solo i primi 100 elementi nel ciclo for e in fine per crearti la
stringa ne utilizzi sempre i primi 100 o fino a che non trovi un carattere
255.....il che implica che la lunghezza massima della riga della textbox è
impostata su 100 caratteri o sbaglio??
io me la sono dimensionata sulla grandezza della mia richtextbox

 si ma tu prima allochi un array di byte di Maxcaratteri poi però ne
Non hai letto fino _in fondo_ quel post, vero ? :-))) Riprova,
poi torna qui :-)))
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
Facciamo così, ricominciamo da capo, quel codice era una ciofeca
fin dall'inizio, e non è mai piaciuto neanche a me. Usa questo:
**********************
Public Declare Function SendMessage2 Lib "user32" Alias "SendMessageA" _
(ByVal hWnd As Long, ByVal msg As Long, ByVal wp As Long, _
lp As Any) As Long
Public Const EM_LINEINDEX = &HBB
Public Const EM_LINELENGTH = &HC1
Public Const EM_GETLINE = &HC4
Public Function GetLine(hWnd As Long, Line As Long) As String
  Dim sBuf As String, nLen As Long, nIndex As Long
  nIndex = SendMessage2(hWnd, EM_LINEINDEX, Line - 1, ByVal 0&)
  If nIndex < 0 Or Line <= 0 Then Exit Function
  nLen = SendMessage2(hWnd, EM_LINELENGTH, nIndex, ByVal 0&)
  sBuf = Space(nLen + 1)
  Mid$(sBuf, 1, 1) = Chr$(nLen And &HFF) ' First byte is the low 8 bits
  Mid$(sBuf, 2, 1) = Chr$(nLen \ 256)    ' Second byte is the high 8 bits
  SendMessage2 hWnd, EM_GETLINE, Line - 1, ByVal sBuf
  GetLine = Left$(sBuf, nLen)
End Function
**********************
Richiamando la funzione ad esempio con
Debug.Print GetLine(Text1.hWnd, NumeroRiga)
Mi raccomando, non _sostituire_, ma _aggiungi_ questa
dichiarazione della SendMessage al tuo codice, in questa
l'ultimo parametro è dichiarato in maniera diversa; in effetti
la chiamata è con un nome diverso, SendMessage2. L'altra
ti serve ancora per trovare il numero di linee... e io a quest'ora
sono troppo "rinco" per ricontrollare tutto :-)
Bye, G.

 **********************
funziona alla perfezione ma questo codice non ci provo neanche a capirlo,
l'altro era più comprensibile anche se non capisco perchè non funzionava
grazie
PS:e pensare che il programma che sto facendo è per un amico che ha come
nick 'paperino' quando parliamo sui CB