Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Print & Scroll

Dato il seguente codice:
    Option Explicit
    Private Sub Form_Load( _
    )
      '
      Dim i%
      '
      Let AutoRedraw = True
      For i = 1 To 1000
        Print "Riga "; i
      Next
      '
    End Sub
quale metodo usereste per ottenere l'effetto di scroll verso
l'alto, una volta raggiunto il margine inferiore del form come
avviene, per esempio, in una finestra DOS?
--
Ciao.
Maurizio


---
Vorrei vedere le piramidi di Cheope,
ma sono miope, ma sono miope.
---




 quale metodo usereste per ottenere l'effetto di scroll verso
l'alto, una volta raggiunto il margine inferiore del form come
avviene, per esempio, in una finestra DOS?
Ringrazio cheope e Stefano Sartori per le risposte.
Preciso meglio il problema. Vorrei effettuare uno scorrimento
verso l'alto diciamo cosi... grafico. Se possibile,
ovviamente.
Non vorrei usare controlli o vettori perche' non occorre
tenere traccia di cio` che viene visualizzato, basta solo che
scorra...
Se necessario opterei per il Print su una PictureBox invece
che direttamente sul Form, ma non vorrei dover ridimensionare
la PictureBox per ottenere l'effetto scorrimento. Questa e` la
prima ipotesi che ho fatto ma non l'ho ancora implementata
perche' spererei di trovare un metodo piu` rispondente alle
mie esigenze.
Grazie.
--
Ciao.
Maurizio
--------
?SPQR(C)
 X

 > quale metodo usereste per ottenere l'effetto di scroll
verso l'alto, una volta raggiunto il margine inferiore del
form come avviene, per esempio, in una finestra DOS?
Piccolo aggiornamento.
' Metodo con PictureBox.
'
Option Explicit
Private Sub Form_Load( _
)
  '
  Dim i%, strRow$, sngTextHeight!
  '
  With Picture1
    ' DesignTimeOnly:
    ' Let .Appearance = 0
    Let .AutoRedraw = True
    Let .BorderStyle = 0
    Call .Move(0, 0, ScaleWidth, ScaleHeight)
  End With
  Call Show
  For i = 1 To 128
    Let strRow = "Riga " & i
    With Picture1
      Let sngTextHeight = .TextHeight(strRow)
      If .CurrentY + sngTextHeight > .ScaleHeight Then
        Call .Move( _
            .Left _
          , .Top - sngTextHeight _
          , .Width _
          , .Height + sngTextHeight)
      End If
    End With
    Picture1.Print strRow
  Next
  '
End Sub
' Metodo con Array
'
Option Explicit
Private Sub Form_Load( _
)
  '
  Dim strRows$(), strRow$, i%, j%
  '
  Let AutoRedraw = True
  Call Show
  ReDim strRows(0 To (ScaleHeight \ TextHeight("A")) - 1)
  For i = 1 To 128
    Cls
    Let strRow = "Riga " & i
    If (i - 1) <= UBound(strRows) Then
      Let strRows(i - 1) = strRow
    Else
      For j = LBound(strRows) To UBound(strRows) - 1
        Let strRows(j) = strRows(j + 1)
      Next
      Let strRows(UBound(strRows)) = strRow
    End If
    For j = LBound(strRows) To UBound(strRows)
      Print strRows(j)
    Next
    Refresh
  Next
  '
End Sub
Il medoto con PictureBox e` sicuramente da scartare perche' la
velocita` diminuisce con l'aumentare delle dimensioni della
PictureBox ed e` gia` improponibile con valori di i modesti.
Il metodo con Array e` sicuramente piu` rispondente alle mie
esigenze. Si puo` migliorare la velocita` di aggiornamento
dell'Array ma il Cls + Refresh rendono il tutto eccessivamente
lento.


... alla fine mi sono deciso per la soluzione che esemplifico
qui sotto. Sempre in attesa di qualcosa di meglio, pero`...
Option Explicit
Private Sub Form_Load( _
)
  '
  Const c_lngRows& = 25
  Const c_lngCols& = 80
  Const c_strText$ _
    = "Nel mezzo del cammin di nostra vita mi ritrovai per " _
    & "una selva oscura che la diritta via era smarrita."
  '
  Dim sngWidth!
  Dim sngHeight!
  Dim lngText&
  Dim lngIndex&
  Dim strPrint$
  Dim lngRow&
  Dim lngRows&
  Dim strScreen$
  '
  With Font
    Let .Name = "MS LineDraw"
    Let .Size = 10
  End With
  Let sngWidth _
    = (Width - ScaleWidth) + TextWidth("A") * c_lngCols
  Let sngHeight _
    = (Height - ScaleHeight) + TextHeight("A") * c_lngRows
  Let BackColor = vbBlack
  Let ForeColor = vbGreen
  Let AutoRedraw = True
  With Screen
    Call Move( _
        (.Width - sngWidth) / 2 _
      , (.Height - sngHeight) / 2 _
      , sngWidth _
      , sngHeight)
  End With
  Call Show
  Let lngText = Len(c_strText)
  Call Randomize
  For lngIndex = 1 To 128
    Let strPrint _
      = "Riga " & lngIndex & " - " _
      & RTrim$(Left$(c_strText, Int(lngText * Rnd + 1)))
    For lngRow = 1 To Len(strPrint) Step c_lngCols
      Let lngRows = lngRows + 1
      If lngRows > c_lngRows _
      Then _
        Let strScreen _
          = Mid$(strScreen, InStr(strScreen, vbCrLf) + 2)
      Let strScreen _
        = strScreen _
        & Mid$(strPrint, lngRow, c_lngCols) _
        & vbCrLf
      Call Cls
      Print strScreen
      Call Refresh
    Next
  Next
  '
End Sub
