Word Wrap

Allora non so da dove cominciare…
ho due campi di una tabella ‘righe’ che rispettivamente sono chiamati descrizione e note
descrizione e note possono contenere testo anche lungo e il campo note pu contenere i caratteri CR e CR+LF rispettivamente CHR(10) e CHR(13)

per impedire casini nella stampa di documenti come fatture, ddt, ordini e preventivi ho costituito un database virtuale che risiede in memoria che contiene appunto le righe
codice, descrizione, unitdimisura, quantita, prezzo, sconti, importo, iva
Questo per evitare casini in fase di stampa per la gestione delle pagine.
Infatti diviene molto complicato calcolare l’altezza di una riga di descrizione quando il testo lungo e viene stampato sulle ultime righe del documento.

a questo punto l’accrocchio semplice.
La stampa delle righe deve avvenire con un carattere MONOSPACED come courier etc. in modo che tutti i caratteri occupino sempre la stessa larghezza, e la tabella virtuale delle righe dovr contenere tante righe quante sono quelle da stampare es:

rigo codice descrizione                         um prezzo ..
1    PROVA  Attrezzatura per il ripristino di   Nr 400.00
            calcestruzzi danneggiati compresi
            tutti i prodotti per il ripristino

Diventa

1    PROVA  Attrezzatura per il ripristino di   Nr 400.00
2           calcestruzzi danneggiati compresi
3           tutti i prodotti per il ripristino
 

E la domandona finale la seguente :
Come posso dividere un testo lungo in un array formato da testi non pi lunghi di X caratteri rispettando anche il ritorno a capo CR o CR+LF ???

Ho postato l’intera spiegazione perch potrebbe servire a qualcuno questa tecnica per la stampa.

Mi rispondo da solo …

  • divido il testo in un array usando split
    split(testo, endofline)

implemento la funzione instrrev che non esiste :

Function instrRev(s as string, t as string) As integer
  dim last as integer
  dim x as Integer
  last=0
  do
    x=instr(last+1,s,t)
    if x>0 then
      last=x
    else
      exit do
    end if
  loop
  return last
End Function

e la funzione che effettua il word wrap per creare un testo limitato a x caratteri per rigo

Private Function FormatString(testo As String, lunghezza As Integer) As String
  dim testofomattato as String
  Dim stringatemp As String
  Dim Posizione As integer
  
  testofomattato = ""
  Posizione = 1
  While testo <> ""
    If Len(testo) <= lunghezza Then
      stringatemp = Trim(testo)
    Else
      stringatemp = Mid(testo, Posizione, lunghezza + 1)
      stringatemp = Trim(Left(stringatemp, InStrRev(stringatemp, " ")))
    End If
    
    testofomattato = testofomattato + stringatemp + EndOfLine
    testo = LTrim(Right(testo, Len(testo) - Len(stringatemp)))
  Wend
  
  return testofomattato
End Function

ho omesso nella funzione formatstring la possibilit di restituire un array con le righe gi divise …

ecco la funzione che ritorna l’array di stringhe

Private Function FormatString(testo As String, lunghezza As Integer) As String()
  dim testofomattato() as String
  Dim stringatemp As String
  Dim Posizione As integer
  dim vuoto() as string
  
  testofomattato() = vuoto()
  Posizione = 1
  While testo <> ""
    If Len(testo) <= lunghezza Then
      stringatemp = Trim(testo)
    Else
      stringatemp = Mid(testo, Posizione, lunghezza + 1)
      stringatemp = Trim(Left(stringatemp, InStrRev(stringatemp, " ")))
    End If
    
    testofomattato.Append stringatemp + EndOfLine
    stringatemp + EndOfLine
    testo = LTrim(Right(testo, Len(testo) - Len(stringatemp)))
  Wend
  
  return testofomattato()
End Function