Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Allineamento su colonne in una textBox multiline

Allora... vorrei leggere tutti i file e cartelle presenti all'interno di una
qualsiasi cartella e disporli in un textBox multiline in questo modo:
SYSTEM                            <DIR>
COMMAND                       <DIR>
SYSTEM32                        <DIR>
HELP                                  <DIR>
La stringa <DIR> l'aggiungo solo agli elementi che sono cartelle.
Ho fatta una funzione che mi legge, ad esempio, tutti i file della cartella
windows e li mette all'interno di un array. Nella variabile lunghezzaMassima
ci ho messo la lunghezza del nome più lungo. Poi ho aggiunto a ciascun
elemento dell'array, tanti spazi quanti ne servivano per fare in modo che
tutte le stringhe avessero lunghezza uguale.
Il problema è che a causa della differente grandezza dei caratteri e dello
spazio, anche se tutte le stringhe sono composte dallo stesso numero di
caratteri, al video appaiono di lunghezza diversa e quindi il risultato è,
ad esempio, il seguente:
SYSTEM                            <DIR>
COMMAND                               <DIR>
SYSTEM32                                <DIR>
HELP                           <DIR>
Questa è la funzione:
Private Sub Command1_Click()
    Dim path As String
    Dim fileCorrente As String
    Dim file() As String
    Dim numeroFile As Integer
    Dim lunghezza As Integer
    Dim lunghezzaMassima As Integer
    Dim contatore As Integer
    ReDim file(1 To 1)
    path = "c:\Windows\"
    fileCorrente = Dir(path, vbDirectory)
    Do While fileCorrente <> ""
        If fileCorrente <> "." And fileCorrente <> ".." Then
            file(UBound(file)) = fileCorrente
            ReDim Preserve file(1 To UBound(file) + 1)
            lunghezza = Len(fileCorrente)
            If lunghezza > lunghezzaMassima Then
                lunghezzaMassima = lunghezza
            End If
        End If
        fileCorrente = Dir
    Loop
    numeroFile = UBound(file) - 1
    For contatore = 1 To numeroFile
       If (GetAttr(path & file(contatore)) And vbDirectory) = vbDirectory
Then
                file(contatore) = UCase(file(contatore))
                file(contatore) = file(contatore) & Space(lunghezzaMassima -
Len(file(contatore))) & vbTab & "<DIR>"
                Text1.Text = Text1.Text & file(contatore) & vbCrLf
            Else
                file(contatore) = LCase(file(contatore))
                file(contatore) = file(contatore) & Space(lunghezzaMassima -
Len(file(contatore))) & vbTab & "<FILE>"
                Text1.Text = Text1.Text & file(contatore) & vbCrLf
            End If
    Next contatore
End Sub
Qualcuno sa come si risolve il problema?
Ciao e grazie

Qualcuno sa come si risolve il problema?
E' risolvibile calcolanda la larghezza massima della stringa che aggiungi al
controllo e utilizzando il carattere chr$(9) (TAB).
In pratica mentre inserisci le stringhe ti calcoli la loro lunghezza massima
(usa il metodo textWidth su un controllo che ha lo stesso font di quello
della listbox) e lo memorizzi solo se è il più grande, se la stringa
rappresenta una directory aggiungi alla stringa stessa chr$(9) .  & "DIR"
Terminato l'inserimento ti calcoli la larghezza massima in unità di misura
del controllo dopo di che invi alla combo il messaggio LB_SETTABSTOPS.
esempio
do
    stringa = CercaInternoWindow()
    LarghezzaStrCorrente = form.TextWidth(stringa)
    if LarghezzaStrCorrente > maxLargh then maxLargh = LarghezzaStrCorrente
    if NyIsDirectory(stringa)=TRUE then stringa = stringa & chr$(9) &
"<DIR>"
    list.addItem stringa
loop
    gdbu = GetDialogBaseUnits()
    t(0) = (maxLargh * 4) /  MyGetLowOrder(gdbu)
    SendMessage List1.Hwnd, LB_SETTABSTOPS, 1, t(0)
dove MyGetLowOrder è una funzione che ti restituisce i byte di ordine
inferiore di un long
Public Function MyGetLowOrder(byval n As Long) As Integer
    Dim t As Long
    RtlMoveMemory VarPtr(t), VarPtr(n), 2
    MyGetLowOrder = t
End Function
essendo
Private Declare Sub RtlMoveMemory Lib "kernel32" (ByVal dest As Long, ByVal
source As Long, ByVal nBit As Long)
Ciao Bruno

del controllo dopo di che invi alla combo il messaggio LB_SETTABSTOPS.
[...]
Grazie, però è troppo difficile... che non ci ho capito niente è dir poco
^_^;;
Cmq le stringhe devo inserirle in un Text Box, non in una List Box (anche se
credo che sia uguale...)
Una soluzione sarebbe memorizzare la lunghezza in Twips della stringa più
lunga e riportare tutte le stringhe a quella lunghezza aggiungendo spazi
vuoti...
Ciao

Semplice! Non usare gli spazi, usa il tab.
Es:
text1.text="uno" & vbTab & "due"
text1.text= text1.text & "tre" & vbTab & "quattro"
text1.text=text1.text & "cinque" & vbTab & "sei"
risultato:
uno           due
tre             quattro
cinque      sei


Probabilmente il metodo più semplice ( anche se non ho provato il tuo
codice) è quello di utilizzare un font con un carattere proporzionale ( tipo
Courier  o Courier New) e non un un font truetype.
Altra soluzione che prenderei quantomeno in esame è l'utilizzo di un
controllo Tree view che, di fronte a una programmazione forse più complessa,
ti fornirebbe una soluzione (dipende dai gusti,naturalmente)  più elegante.
Ciao.


Magari! Siccome le stringhe sono di lunghezza differente:
ciaociaociaociao
ciao
Se faccio come dici tu viene:
ciaociaociaociao    ciao
ciao    ciao
Questo a causa della differenza di caratteri nelle strtinghe.
Il tuo metodo funziona solo se le stringhe sono di lunghezza uguale o
paragonabile.
Ciao

ti fornirebbe una soluzione (dipende dai gusti,naturalmente)  piů elegante.
Non capisco perché parlate tutti di font.... a me serve una stringa di testo
formattata in quel modo. indipendentemente dal font... comq credo di aver
risolto considerando anziche i caratteri la lunghezza della stringa in
Twips.
E' impossibile usare una treeView perché il testo cosě formattato devo prima
metterlo in una variabile stringa, poi inviarlo ad un client remoto e quindi
metterlo in una TextBox. ^_^;;;
Ciao

Prova ad usare font proporzinali tipo il courier
ciao guido


Grazie, ma avevo già risolto ^_^