Newsgroup: it.comp.lang.visual-basic
Titolo: Rich Text Box - Problema di allineamento righe

Buongiorno a tutti,
avrei il seguente problema:
In un Rich Text Box multiriga, come si fa a non perdere l'allineamento
tra due righe, una sotto l'altra, se si cambia font e eventualmente
anche font.size?
Mi spiego, la riga n.1 contiene gli accordi di una canzone:
Es. "DO       LAm      REm" etc.
La riga sottostante, n.2, il testo: Es. "All'osteria del cimitero...."
(lol)
Ovviamente le due righe sono allineate, nel senso che alla parola del
testo corrisponde verticalmente l'accordo (se qualcuno si interessa di
queste cose,  conosce i formati *.crd oppure ChordPro).
Ora, se la posizione č allineata usando gli spazi per distanziare
opportunamente gli accordi, se si cambia il font, ad esempio da
Courier New a Verdana, l'allineamento salta (e credo sia normale).
A questo punto perň mi chiedo: c'č un sistema per aggirare il
problema, oppure bisogna ricalcolare ogni possibile combinazione?
Cioč occorre fare qualcosa del tipo, ad es.:
Select case Font
	Case "Courier New"
		DistanzaTraAccordi=Space(8)
	Case "Verdana"
		DistanzaTraAccordi=Space(12)
	Case "Arial"
		DistanzaTraAccordi=Space(11)
	Case "Comic"
		DistanzaTraAccordi=Space(9)
end Select
e cosě via, per ogni singolo Accordo e per ogni riga...... Pazzesco.
Grazie se qualcuno mi indica la Via Maestra.
Ciao
Filippo

 Filippo
Anziché usare gli spazi per allineare il testo potresti usare le 
tabulazioni, esattamente come in Word.
Con il seguente esempio puoi impostare la posizione delle varie colonne (è 
per un TextBox multiline, ma funziona esattamente uguale anche per il 
RichText):
http://vbnet.mvps.org/code/textapi/txboxtabs.htm
Bye
Raf 


Ti ringrazio, ma per ora non ci siamo.
Io devo cambiare a livello di codice la distanza tra un accordo e
l'altro, in modo che l'accordo si posizioni in base al testo
Mi spiego meglio:
Da un sorgente che č una sola riga, con gli accordi inseriti tra
parentesi quadre, io devo ricavare due righe, in cui quella sopra
riporta l'accordo ovviamente al punto esatto, ecco perché usavo
Space()
Es.
Da cosě:
[Am]While my gui[G]tar gently [D]weeps      [E7]
a cosě:
Am             G            D7         E7
While my guitar gently weeps     
Quindi non posso predefinire le tabulazioni
Ho provato a sostituire:
DistanzaTraAccordi=Space(8)
con
DistanzaTraAccordi=String$(8,vbTab)
ma non mi funziona perché la tabulazione mi salta di 8 spazi in 8
Dovrei fare in modo che ogni tabulazione č un solo posto, ma non ci
riesco
Ho provato con:
LarghezzaRiga=100
Redim TabStop(0 to LarghezzaRiga)
for i = 0 to LarghezzaRiga
	TabStop(i)=1
next i
Call SendMessage(rtfTesto.hwnd, EM_SETTABSTOPS, LarghezzaRiga + 1,
TabStop(0))
e poi ho inserito nel testo i vari vbTab (tanti quanti i caratteri da
saltare), ma non funziona
Magari non ho capito il problema
Che ne pensi?
Ciao
Filippo

 Magari non ho capito il problema
Forse in effetti il mio suggerimento era solo un indizio, ma non era 
chiarissimo. Anche perché il procedimento è un po' complicato.
In realtà le posizioni dei tabstop (che sono espresse in Dialog Units!) le 
devi ricavare a posteriori a partire da quelle delle parole della riga 
sottostante sopra cui devono essere posizionate.
Quindi se ci devono essere 4 accordi, avrai da definire 4 tabulazioni (o 3 
se la prima sigla coincide con l'inizio della prima parola del testo).
Nella riga relativa agli accordi ci dovrai scrivere una stringa formata 
dagli accordi inframmezzati da 1 (uno solo) carattere di tabulazione, perché 
avendo definito le posizioni, allora ogni tab farà saltare il testo alla 
posizione che gli compete, non so se mi spiego. Es:
    RichText1.SelText = "Am" & vbTab & "G" & vbTab & "D7" & vbTab & "E7"
I valori da mettere nell'array TabStop() sono da ricavare in base alle 
posizioni esatte dei caratteri della seconda riga che devono essere 
sovrastati da un accordo.
Queste le puoi ricavare con l'API SendMessage ed EM_POSFROMCHAR (cerca un 
po' in giro come usarla), e poi vanno convertite in dialog units (0.8 * 
pixelX, solitamente).
È un po' incasinato lo so...
Bye
Raf


Accidenti, è un bel casino,
vedo comunque che di musica te ne intendi perché chiami 'sigle' gli
accordi inglesi. Ok meglio così, tra musicisti ci si capisce meglio.
Adesso ci provo, mi metto al lavoro (tempo permettendo;) e poi ti
faccio sapere
Grazie tante
Ciao
Filippo

 Filippo
Ciao
Raf 


Ci sto provando ma non mi pare una via percorribile.
Infatti la posizione delle sigle varia da riga a riga, così come il
numero delle sigle stesse.
Non è come un rigo di pentagramma con un numero prefissato di misure,
così che la formattazione è quasi di tipo tabellare, ma in una certa
riga ci può essere un solo accordo e in un altra, al limite, 10.
Ora, a parte il fatto dell'enorme difficoltà di ricalcolare le
tabulazioni per ogni riga e di ridefinirle ogni volta con:
SendMessage(RichTextBox.hwnd, EM_SETTABSTOPS, NumeroDiTabulazioni,
tabstop(0))
mi pare di capire che ogni volta che uso questa chiamata reimposto
tutte le tabulazioni dell'intero controllo RichTextBox e non soltanto
della riga che mi interessa.....
Mi sto incasinando
Mi sa che rinuncio e uso soltanto un carattere 'fisso' del tipo
Courier New......
Che ne dici?
... eppure credo proprio che una diversa soluzione ci debba essere...
boh
Ciao
Filippo

 Filippo
Ciao
Raf 

 abbinamento con CurrentX e CurrentY [...]
E TextWidth/TextHeight per ricavare le posizioni, aggiungo.
Ciao
Raf 



Grazie di tutto,
penso che per ora mi limiterň a un Font, come si dice, non True Type,
come Courier New.
Magari proverň anche con la versione Picture Box (ma si puň stampare?
e come viene?)
Quello che mi fa inc. č che il programma che mi ha fatto venire la
voglia di provarci, Chord Pro Manager, non so se lo conosci ma penso
di si, dovrebbe essere stato scritto in VB, da momento che richiede la
libreria VB6STKIT.DLL.
Mannaggia, ha piů di qualche difetto, ma i Fonts li gestisce alla
grande.
Ciao
Filippo

 Filippo
Ciao
Raf 

Puoi sempre prendere ispirazione...
Caspita che velocità...... complimenti
Per quanto riguarda SPY++, non so neanche che cosa sia, un
disassembler?
Adesso lo cerco e vedo un po'...
Ne ho avute di dritte nelle ultime 24 ore eh? Grazie
Ciao
Filippo

 ... eppure credo proprio che una diversa soluzione ci debba essere...
Prova :-)
Bye, G. 

 Filippo
Ciao
Raf 

 anche font.size?
Penso che la soluzione migliore sia quella di usare solo
fonts a larghezza fissa come appunto Courier new
Ciao, Sauro