Casse per testo giustificato

giovedì 04 settembre 2008 - 23.44

ans66 Profilo | Junior Member

Sto tentando di creare una classe con VB 2005. Non funziona e mi sono arenato: accetto consigli..

Public Sub Testo_Giust2(ByVal pr As System.Drawing.Printing.PrintPageEventArgs, ByVal Testo As String, ByVal Alto As Single, ByVal Font As System.Drawing.Font)

Dim LargRiga As Single = (pr.MarginBounds.Right - pr.MarginBounds.Left)
Dim ritStr() As String = Split(Testo, Space(1)), RigaDaScriv As String = vbNullString
Dim NrParola As Integer = 0, i As Integer = 0

For i = 0 To UBound(ritStr) - 1

If pr.Graphics.MeasureString(RigaDaScriv, Font).Width <= LargRiga Then
RigaDaScriv += ritStr(i) & Space(1)
Else
If i < UBound(ritStr) - 1 Then
Call CentraTesto(pr, Alto, RigaDaScriv, LargRiga, Font)
Else
pr.Graphics.DrawString(RigaDaScriv, Font, Brushes.Black, pr.MarginBounds.Left, Alto)
End If

RigaDaScriv = vbNullString
End If
Next


End Sub

Public Sub CentraTesto(ByVal e As System.Drawing.Printing.PrintPageEventArgs, ByVal Top As Single, ByVal Rg As String, ByVal LgRg As Single, ByVal Fn As System.Drawing.Font)
Dim sBrush As SolidBrush
Dim rect As New RectangleF(e.MarginBounds.Left, e.MarginBounds.Right, LgRg, e.Graphics.MeasureString(Rg, Fn).Height)
Dim sFormat As New StringFormat()
sBrush = New SolidBrush(Color.White)
sFormat.Alignment = StringAlignment.Center

e.Graphics.FillRectangle(sBrush, rect)
e.Graphics.DrawString(Rg, Fn, Brushes.Black, CType(rect, RectangleF), sFormat)

sBrush.Dispose()
End Sub

Dainesi Profilo | Senior Member

A parte il fatto che questo è il Thread dedicato a Visual Studio 6.0 (Visual Basic 6.0, C++ 6.0, InterDev, ecc..) e che quindi dovresti postare su "APP. WinForm .NET".

Comunque .... fammi capire: la tua classe cosa dovrebbe fare ? Prova ad esporre il problema a monte e la classe come sua soluzione.

ans66 Profilo | Junior Member

Hai ragione avrei dovuto postare in APP. WinForm .NET.

Ti spiego cosa dovrebbe fare la classe in questione (credo che si debbano creare almeno due classi):

a) Una classe analizza una stringaA (testo multilinea) parola per parola (funzione split) per vedere quando la stringaB supera una certa lunghezza e cioè la differenza fra margine dx - margine sx (marginbounds.right - left)
b) A questo punto deve prendere tutte le parole tranne l'ultima (con la quale supera la lunghezza): le parole vengono memorizzate in una stringaC
c) La stringaC viene passato in un'altre classe che stampa la stringaC (con formattazione "testo giustificato"): non Center, non Right o Left
d) L'ultima riga deve essere stampata senza formattazione (Left)

Non riesco in alcun modo a trovare una classe funzionante in VB.NET (VB 2005) per giustificare una riga: ho trovato vecchie ruotines WYsing (credo) che funzionavano con api per giustificare il testo (funzione sendmessage) ma non trovo nulla che possa andare bene con VB 2005

Non riesco peraltro a dividere propriamente le righe a seconda della lunghezza

La mia classe purtroppo non funziona nè come divisione nè come testo giustificato..sono distante dalla soluzione
Grazie per l'aiuto

Dainesi Profilo | Senior Member

>Hai ragione avrei dovuto postare in APP. WinForm .NET.
>
Ok! Ricordatene per la prossima !

>Ti spiego cosa dovrebbe fare la classe in questione (credo che
>si debbano creare almeno due classi):
>
>a) Una classe analizza una stringaA (testo multilinea) parola
>per parola (funzione split) per vedere quando la stringaB supera
>una certa lunghezza e cioè la differenza fra margine dx - margine
>sx (marginbounds.right - left)
>b) A questo punto deve prendere tutte le parole tranne l'ultima
>(con la quale supera la lunghezza): le parole vengono memorizzate
>in una stringaC
>c) La stringaC viene passato in un'altre classe che stampa la
>stringaC (con formattazione "testo giustificato"): non Center,
>non Right o Left
>d) L'ultima riga deve essere stampata senza formattazione (Left)
>
>Non riesco in alcun modo a trovare una classe funzionante in
>VB.NET (VB 2005) per giustificare una riga: ho trovato vecchie
>ruotines WYsing (credo)

ndr: WYSIWYG = "What You See Is What You Get", ai tempi del DOS digitavi con l'unico font del terminale ed ottenevi invece qualcosa di diverso a seconda del codice del Font. Ecco che allora naquero i primi programmi ad anteprima automatica che ti mostravano cosa avresti ottenuto in stampa. Da qui WYSIWYG!

>che funzionavano con api per giustificare
>il testo (funzione sendmessage) ma non trovo nulla che possa
>andare bene con VB 2005
>
>Non riesco peraltro a dividere propriamente le righe a seconda
>della lunghezza
>
>La mia classe purtroppo non funziona nè come divisione nè come
>testo giustificato..sono distante dalla soluzione
>Grazie per l'aiuto

Allora. Prima di tutto devi sapere che i caratteri dei vari font non occupano tutti la stessa larghezza ma sono proporzionati. Per ottenere quello che cerchi avresti bisogno di font tipo System che sono equispaziati. Quindi il tuo problema è:

1. Capire quanto è larga la tua TextBox
2. Capire quanto spazio occupano in larghezza le singole parole (compresi gli spazi) del testo inserito

solo in questo modo potrai suddividere il testo in più controlli.
Per quanto riguarda la giustificazione è sufficiente che tu conti la larghezza totale delle parole SENZA spazi, fai la differenza con la larghezza della casella di testo e con questa cifra calcoli la divisione intera per la larghezza del singolo spazio. Se fosse 2 poni due spazi ogni separazione di parola, se fosse uno con del resto distribuirai gli spazi tra le prime parole sino ad esaurimento.

ans66 Profilo | Junior Member

Vorrei avvisarti che ho trovato una soluzione con le seguenti due funzioni da me create. Dovrebbe essere in linea con quanto mi hai detto anche se ho letto solo dopo il tuo messaggio. Ben lieto di avere un tuo parere o un tuo consgilio:

Public Sub Testo_Giust2(ByVal pr As System.Drawing.Printing.PrintPageEventArgs, ByVal Testo As String, ByVal Alto As Single, ByVal Font As System.Drawing.Font)


Testo = Testo.Replace(Chr(10), "")
Testo = Testo.Replace(Chr(13), Space(1))
Testo = Testo.Replace(Space(2), Space(1))


Dim LargRiga As Single = (pr.MarginBounds.Right - pr.MarginBounds.Left)
Dim ritStr() As String = Split(Testo, Space(1))
Static RigaControllo As String = vbNullString
Static RigaDaScriv As String = vbNullString
Dim NrParola As Integer = 0, i As Integer = 0
Static LunghParola As Integer = 0

Alto = Alto + 90

For i = 0 To UBound(ritStr) - 1


If pr.Graphics.MeasureString(RigaControllo, Font).Width <= LargRiga Then
RigaControllo = RigaControllo & ritStr(i) & Space(1)
LunghParola = ritStr(i).Length + 1

Else

RigaDaScriv = Mid(RigaControllo, 1, RigaControllo.Length - LunghParola)
CentraTesto(pr, Alto, RigaDaScriv, Font, LargRiga)
' qui passi a funzione CentraTesto
Alto = Alto + 10
RigaControllo = Mid(RigaControllo, RigaDaScriv.Length + 1)
LunghParola = RigaControllo.Length
i = i - 1
End If

If i = UBound(ritStr) - 1 AndAlso pr.Graphics.MeasureString(RigaControllo, Font).Width <= LargRiga Then
RigaControllo = RigaControllo & ritStr(i + 1)
pr.Graphics.DrawString(RigaControllo, Font, Brushes.Black, pr.MarginBounds.Left, Alto)
End If


Next

RigaControllo = vbNullString
RigaDaScriv = vbNullString


End Sub

Public Sub CentraTesto(ByVal e As System.Drawing.Printing.PrintPageEventArgs, ByVal Top As Single, ByVal Rg As String, ByVal Fn As System.Drawing.Font, ByVal LargRiga As Single)

Dim LrgDascriv As Single = e.Graphics.MeasureString(Rg, Fn).Width
Dim Dif As Single = LargRiga - LrgDascriv
Dim Parole() As String = Split(Rg, Space(1))
Dim NrParole As Integer = UBound(Parole) - 1
Dim SpazioFraParole As Single = Dif / NrParole

Dim x As Single = e.MarginBounds.Left


For i As Integer = 0 To UBound(Parole) - 1
Dim LgParola As Single = e.Graphics.MeasureString(Parole(i) & Space(1), Fn).Width
e.Graphics.DrawString(Parole(i) & Space(1), Fn, Brushes.Black, x, Top)
x = x + LgParola + SpazioFraParole
Next

End Sub



End Module

Dainesi Profilo | Senior Member

Scusa ma sono un pò in tilt, prova a postarmi il codice della form che faccio prima a testare il tutto.

Dainesi Profilo | Senior Member

Ho visto il messaggio privato ma ..... vedo solo (in formato "compresso") lo stesso codice che hai postato. Quello che intendevo è se hai la possibilità di inviare il file .vb e .cls in modo da poterlo caricare nel mio IDE e testare la tua soluzione (P.S. E' in .NET 2002, 2003, 2005 o 2008 ?)

ans66 Profilo | Junior Member

Scusa non avevo capito. allego file giust.vb...non ho il file cls...le routine sono inserite in un modulo (Visual Studio 2005)

ans66 Profilo | Junior Member

Dainesi: Qual'e` il risultato dei test sulla routine per Giustificazione testo? Grazie

Dainesi Profilo | Senior Member

Scusa il ritardo nella risposta ma non sono ancora riuscito a comporre una soluzione con il tuo codice. Se però tu trovi che funziona allora va bene così. Scusa ma sono totalmente impegnato nello sviluppo di una tool di trading e ho pochissimo tempo per testare altro codice.

ans66 Profilo | Junior Member

Grazie davvero per la risposta. non importa quando ma se avrai mai la possibilita` di testarlo fammi sapere cosa ne pensi...grazie
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5