Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    361

    [VB6]: Stampare le righe di una ListView

    Ciao ragazzi come dice l'oggetto devo stampare le righe di una ListView, io utilizzo il metodo EasyPrint per stampare i contenuti dei controlli, ma ho difficoltà a stampare i record di una ListView, vi posto un pezzo di codice che utlizzo per stampare:

    ...
    .PrintLeft 20, 40, "Codice:"
    .PrintLeft 50, 40, "Descrizione:"
    .PrintLeft 140, 40, "Produzione:"
    Pr.PrintRight 170, 79, "€ "
    Pr.PrintRight 197, 79, INCASSIPOS.Text
    Printer.Print
    fin qui tutto bene, ma è il codice per stampare la ListView che non è un casino:

    For i = 1 To LsVw1.ListItems.Count
    Printer.CurrentX = 50
    Printer.PaintPicture LsVw1.Picture, 26, 26
    Printer.Print LsVw1.ListItems(i).ListSubItems(1).Text
    Printer.Print LsVw1.ListItems(i).ListSubItems(2).Text
    Next i

    chiaramente le righe stampate sono tutte sfalsate...dove sbaglio??
    Grazie a tutti in anticipo
    vrclaudio

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    361

    ...

    un aiutino piccolo piccolo!!
    grazie claudio

  3. #3
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244

    Re: ...

    Originariamente inviato da vr-claudio
    un aiutino piccolo piccolo!!
    grazie claudio

    Non puoi aspettarti che chi legge debba per forza conoscere EasyPrint...

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    361

    Perfettamente daccordo...

    Hai ragione, mi scuso con tutto il forum,
    supponiamo che non esista EasyPrint, io ho trovato un esempio che vi posto che potrebbe andare bene, ma l'unico problema è che se una colonna della ListView contenesse tantissimi caratteri mi sfalsa tutte le righe di stampa, penso che possa essere d'aiuto a tanti ma purtroppo non a me perchè una di queste colonne proviene da un campo di una tabella.mdb che è stata imposta come memo, ecco il codice:

    Private Sub PrintListView(lvw As ListView)
    Const MARGIN = 10
    Const COL_MARGIN = 10
    Dim ymin As Single
    Dim ymax As Single
    Dim xmin As Single
    Dim xmax As Single
    Dim num_cols As Integer
    Dim column_header As ColumnHeader
    Dim list_item As ListItem
    Dim i As Integer
    Dim num_subitems As Integer
    Dim col_wid() As Single
    Dim x As Single
    Dim y As Single
    Dim line_hgt As Single

    xmin = Printer.CurrentX
    ymin = Printer.CurrentY

    ' ******************
    ' Get column widths.
    num_cols = lvw.ColumnHeaders.Count
    ReDim col_wid(1 To num_cols)

    ' Check the column headers.
    For i = 1 To num_cols
    col_wid(i) = Printer.TextWidth(lvw.ColumnHeaders(i).Text)
    Next i

    ' Check the items.
    num_subitems = num_cols - 1
    For Each list_item In lvw.ListItems
    ' Check the item.
    If col_wid(1) < Printer.TextWidth(list_item.Text) Then _
    col_wid(1) = Printer.TextWidth(list_item.Text)

    ' Check the subitems.
    For i = 1 To num_subitems
    If col_wid(i + 1) < Printer.TextWidth(list_item.SubItems(i)) Then _
    col_wid(i + 1) = Printer.TextWidth(list_item.SubItems(i))
    Next i
    Next list_item

    ' Add a column margin.

    For i = 1 To num_cols
    col_wid(i) = col_wid(i) + COL_MARGIN
    Next i

    ' *************************
    ' Print the column headers.
    Printer.CurrentY = ymin + MARGIN
    Printer.CurrentX = xmin + MARGIN
    x = xmin + MARGIN
    For i = 1 To num_cols
    Printer.CurrentX = x
    Printer.Print FittedText( _
    lvw.ColumnHeaders(i).Text, col_wid(i));
    x = x + col_wid(i)
    Next i
    xmax = x + MARGIN

    Printer.Print
    line_hgt = Printer.TextHeight("X")
    y = Printer.CurrentY + line_hgt / 2
    Printer.Line (xmin, y)-(xmax, y)
    y = y + line_hgt / 2

    ' Print the rows.
    num_subitems = num_cols - 1
    For Each list_item In lvw.ListItems
    x = xmin + MARGIN

    ' Print the item.
    Printer.CurrentX = x
    Printer.CurrentY = y
    Printer.Print FittedText( _
    list_item.Text, col_wid(1));
    x = x + col_wid(1)

    ' Print the subitems.
    For i = 1 To num_subitems
    Printer.CurrentX = x
    Printer.Print FittedText( _
    list_item.SubItems(i), col_wid(i + 1));
    x = x + col_wid(i + 1)
    Next i

    y = y + line_hgt * 1.5
    Next list_item
    ymax = y

    ' Draw lines around it all.
    Printer.Line (xmin, ymin)-(xmax, ymax), , B

    x = xmin + MARGIN / 2
    For i = 1 To num_cols - 1
    x = x + col_wid(i)
    Printer.Line (x, ymin)-(x, ymax)
    Next i
    End Sub

    vrclaudio

  5. #5
    allora se ho capito bene ti serve qualcosa che ti riduca la larghezza del testo (mandandolo a capo) correttamente?
    sei fortunato perchè ho fatto tale routine 2 giorni fa...

    codice:
    Public Function ChangeTextLong(Text As String, HowLong As Double) As String
        Dim s() As String, i As Integer, newS() As String, j As Integer, u As Integer, TextToCheck As String
        s = Split(Text, vbCrLf)
        ReDim newS(0)
        Printer.ScaleMode = 6
        For i = 0 To UBound(s)
            If Printer.TextWidth(s(i)) > HowLong Then
                 TextToCheck = s(i)
    startCheck:  u = UBound(newS) + 1
                 j = Len(TextToCheck)
                 Do
                     j = j - 1
                     ReDim Preserve newS(u)
                     newS(u) = Mid(TextToCheck, 1, j)
                     If Printer.TextWidth(newS(u)) <= HowLong Then Exit Do
                 Loop
                 If Printer.TextWidth(Mid(TextToCheck, j + 1, Len(TextToCheck) - j)) > HowLong Then
                     TextToCheck = Mid(TextToCheck, j + 1, Len(TextToCheck) - j)
                     GoTo startCheck
                 Else
                     u = UBound(newS) + 1
                     ReDim Preserve newS(u)
                     newS(u) = Mid(TextToCheck, j + 1, Len(TextToCheck) - j + 1)
                 End If
            Else
                u = UBound(newS) + 1
                ReDim Preserve newS(u)
                newS(u) = s(i)
            End If
        Next i
        For i = 1 To UBound(newS)
            If i = 1 Then
                ChangeTextLong = newS(i)
            Else
                ChangeTextLong = ChangeTextLong & vbCrLf & newS(i)
            End If
        Next i
    End Function
    Usa questa funzione: basta passargli il testo (che sia su una riga o piu non importa) e la lunghezza (in millimetri, ma puoi modificarlo per ottenerlo in qualunque scala).

    ATTENZIONE: questa funzione ti restituisce il testo formattato in modo che vada a capo dopo una certa lunghezza, quindi sulla stampa dovrai gestire le righe, facendo uno split dei vbcrlf.
    ad esempio:

    codice:
        Dim n As Integer, s() As String, Y As Double, sp As Double
        Y = 10
        sp = 4 'spessore delle righe
        s = Split(ChangeTextLong(text1.Text, 74), vbCrLf)
        For n = 0 To UBound(s)
            'stampo le righe
            Printer.CurrentX = 10
            Printer.CurrentY = Y + sp / 2 - Printer.TextHeight(s(n)) / 2
            Printer.Print s(n)
            Y = Y + sp
        Next n
    Spero di essere stato chiaro, ciao!

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    361

    Grandissimo...

    Ciao carissimo Antonio,
    oserei dire che è perfetto, l'ho provato e funziona alla grande!
    Ancora GRAZIE MILLE!!!
    vrclaudio

  7. #7

    Re: Grandissimo...

    Originariamente inviato da vr-claudio
    Ciao carissimo Antonio,
    oserei dire che è perfetto, l'ho provato e funziona alla grande!
    Ancora GRAZIE MILLE!!!
    vrclaudio
    Apparte il fatto che mi chiamo Andrea , prego

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    361

    ops!!!

    Scusami tanto Andrea,
    ho un collega che si chiama Antonio e probabilmente è stata una svista imperdonabile.
    Scusa ancora
    vrclaudio

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.