Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
App. Visual Studio 6.0
Casse per testo giustificato
giovedì 04 settembre 2008 - 23.44
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
ans66
Profilo
| Junior Member
62
messaggi | Data Invio:
gio 4 set 2008 - 23:44
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
476
messaggi | Data Invio:
lun 8 set 2008 - 08:25
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
62
messaggi | Data Invio:
lun 8 set 2008 - 21:48
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
476
messaggi | Data Invio:
mer 24 set 2008 - 09:50
>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
62
messaggi | Data Invio:
gio 25 set 2008 - 22:02
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
476
messaggi | Data Invio:
sab 27 set 2008 - 11:57
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
476
messaggi | Data Invio:
sab 27 set 2008 - 13:23
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
62
messaggi | Data Invio:
sab 27 set 2008 - 13:41
770_Giust.zip
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
62
messaggi | Data Invio:
dom 12 ott 2008 - 15:57
Dainesi: Qual'e` il risultato dei test sulla routine per Giustificazione testo? Grazie
Dainesi
Profilo
| Senior Member
476
messaggi | Data Invio:
dom 12 ott 2008 - 20:49
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
62
messaggi | Data Invio:
lun 13 ott 2008 - 21:35
Grazie davvero per la risposta. non importa quando ma se avrai mai la possibilita` di testarlo fammi sapere cosa ne pensi...grazie
Torna su
Stanze Forum
Elenco Threads
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 !