Italian Sub SetLabelSize(lbl As Label, txt As String) Spiegazione

GIS

Well-Known Member
Licensed User
B4X:
Sub SetLabelSize(lbl As Label, txt As String)
    Dim dt As Float
    Dim limit = 0.1 As Float
    Dim h As Int
 
    lbl.Text = txt
    lbl.TextSize = 72
    dt = lbl.TextSize
    h = stu.MeasureMultilineTextHeight(lbl, txt)
    Do While dt > limit Or h > lbl.Height
        dt = dt / 2
        h = stu.MeasureMultilineTextHeight(lbl, txt)
        If h > lbl.Height Then
            lbl.TextSize = lbl.TextSize - dt
            lbl.TextSize = lbl.TextSize - 1 'ho aggiunto questo meno 1 se no a volte la scritta era grande e non si leggeva
        Else
            lbl.TextSize = lbl.TextSize + dt
            lbl.TextSize = lbl.TextSize - 1 'ho aggiunto questo meno 1 se no a volte la scritta era grande e non si leggeva
        End If
    Loop

Ciao è da molto che uso questa sub insieme alla gemella per centrare le parole nei vari button o label. Ma ha volte non fa quello che mi aspetterei. Vorrei modificarla ma non capisco bene il valore delle variabili. es.
lbl.Height misura dell'altezza che su una riga è 87. Ma 87 di cosa, pixel?
lbl.TextSize = 72 qui viene assegnato la grandezza del carattere, credo
h calcola l'altezza nel caso ci siamo più linee

Ho dove posso trovare il manuale di questa libreria che non riesco a trovare? O ferse c'è un modo migliore per fare questa operazione. Dimenticavo la libreria StingUtils. Ho provato a guardare la libreria ma io non ci ho trovato niente che mi dava spiegazioni. Il problema io l'ho sulla lunghezza forse questa sub non serve al mio scopo o sbaglio?
 

GIS

Well-Known Member
Licensed User
Se vuoi diminuire la grandezza del carattere non è corretto sottrarre 1, ma ridurre l'altezza di calcolo:
Si con RAP funziona decisamente meglio. Ma il mio problema era sulla lunghezza non tanto sull'altezza.
 

Star-Dust

Expert
Licensed User
Longtime User
Si con RAP funziona decisamente meglio. Ma il mio problema era sulla lunghezza non tanto sull'altezza.
Esce fuori?
 

LucaMs

Expert
Licensed User
Longtime User
Sub SetLabelSize(lbl As Label, txt As String)
Sbaglio o serve a ridimensionare una Label a runtime? Ed a che servirebbe, se non a incasinarti la vita, visto che poi dovresti ridimensionare anche tutte le altre view del layout? Dovresti usare il Designer, con gli ancoraggi o, al limite, sempre nel Designer, gli script (ad esempio impostare la larghezza (visto il tuo ultimo post appena arrivato) su un valore percentuale.



lbl.Height misura dell'altezza che su una riga è 87. Ma 87 di cosa, pixel?
Sarò cieco (e in effetti non è che ci veda benissimo) ma in quel codice non vedo lbl.Height 87.
 

Star-Dust

Expert
Licensed User
Longtime User
me lo restituisce
Questo codice non cambia l'altezza della Label, piuttosto diminuisce la dimensione del carattere fine non entra nella Label in altrzza.

87 è il valore di pixel.xhe hai stabilito nel design che probabilmente sarà 50 (ovviamente dip)
 

Star-Dust

Expert
Licensed User
Longtime User
Allora il testo è troppo lungo, va modificato il.codice. Se il testo è troppo lungo rischio che il carattere sia molto piccolo
 

GIS

Well-Known Member
Licensed User
Allora il testo è troppo lungo, va modificato il.codice. Se il testo è troppo lungo rischio che il carattere sia molto piccolo
Si, ho fatto la costruzione di un link. E' molto lungo siamo sopra i 150 caratteri. Risolvo in un altro modo. Grazie
 

Star-Dust

Expert
Licensed User
Longtime User
Se vuoi te lo modifico per testi lungi. Però il risultato può essere quello che ti accennavo
 

Star-Dust

Expert
Licensed User
Longtime User

GIS

Well-Known Member
Licensed User
Si lo so. Ma è un link per la ricerca di prodotti su Amazon e preferisco vedere quello che copio e incollo. E cmq lo uso solo io. cmq per adesso ho risolto mettendo il link in un edit.text tanto viene copiato all'istante negli appunti e poi lo incollo nel browser.. era solo per che lo avevo pensato in un modo e volevo che funzionasse anche per app future dove posse verificarsi lo stesso problema. E qualcuno che ha voglia di scriverlo in B4J si tratta di una pochissime righe di codice.....

non so se si è notato il mio intercalare, quando rileggo me ne accorgo sempre lo stesso. 😭 😭 😭 :eek: :eek:
 

Star-Dust

Expert
Licensed User
Longtime User
Si lo so. Ma è un link per la ricerca di prodotti su Amazon e preferisco vedere quello che copio e incollo. E cmq lo uso solo io. cmq per adesso ho risolto mettendo il link in un edit.text tanto viene copiato all'istante negli appunti e poi lo incollo nel browser.. era solo per che lo avevo pensato in un modo e volevo che funzionasse anche per app future dove posse verificarsi lo stesso problema. E qualcuno che ha voglia di scriverlo in B4J si tratta di una pochissime righe di codice.....

non so se si è notato il mio intercalare, quando rileggo me ne accorgo sempre lo stesso. 😭 😭 😭 :eek: :eek:
..... Pensavo che parlassi di B4A che esiste Canvas.MeasureStringWidth ....
Multipiattaforma allora devi usare XUI
 
Last edited:

GIS

Well-Known Member
Licensed User
l'hai provato? mi da errore in due linee
B4X:
Sub SetLabelSize(lbl As Label, txt As String)
    Dim dt=72, RapX = 0.9, limit = 0.1 As Float
    Dim Can As B4XCanvas
   
    Dim Rec As B4XRect = Can.MeasureText(txt,dt)    ' da errore sono due elementi diversi

    lbl.Text = txt
    lbl.TextSize = dt
    Do While (dt > limit) Or (Rec.Height > lbl.Height *RapX) Or (Rec.Width>lbl.Width)
        dt = dt / 2
       
        Rec = Can.MeasureText(txt,dt)     ' qui da errore
       
       
        If (Rec.Height > lbl.Height * RapX) Or (Rec.Width>lbl.Width) Then
            lbl.TextSize = lbl.TextSize - dt
        Else
            lbl.TextSize = lbl.TextSize + dt
        End If
    Loop
End Sub
 

Star-Dust

Expert
Licensed User
Longtime User
Piccolo errore
B4X:
Sub SetLabelSize(lbl As Label, txt As String)
    Dim dt=72, RapX = 0.9, limit = 0.1 As Float
    Dim Can As B4XCanvas
    Dim Rec As B4XRect = Can.MeasureText(txt,xui.CreateDefaultFont(dt))

    lbl.Text = txt
    lbl.TextSize = dt
    Do While (dt > limit) Or (Rec.Height > lbl.Height *RapX) Or (Rec.Width>lbl.Width)
        dt = dt / 2
        Dim Rec As B4XRect = Can.MeasureText(txt,xui.CreateDefaultFont(dt))
        If (Rec.Height > lbl.Height * RapX) Or (Rec.Width>lbl.Width) Then
            lbl.TextSize = lbl.TextSize - dt
        Else
            lbl.TextSize = lbl.TextSize + dt
        End If
    Loop
End Sub
 

GIS

Well-Known Member
Licensed User
Io sto facendo copia e incolla come se fosse arabo. Come la dichiaro xui, ho ci vogliono delle librerie a parte UXI?
B4X:
Sub SetLabelSize(lbl As Label, txt As String)
    Dim dt=72, RapX = 0.9, limit = 0.1 As Float
    Dim Can As B4XCanvas
    Dim xui As XUI
    Dim Rec As B4XRect = Can.MeasureText(txt,xui.CreateDefaultFont(dt))

    lbl.Text = txt
    lbl.TextSize = dt
    Do While (dt > limit) Or (Rec.Height > lbl.Height *RapX) Or (Rec.Width>lbl.Width)
        dt = dt / 2
        Dim Rec As B4XRect = Can.MeasureText(txt,xui.CreateDefaultFont(dt))
        If (Rec.Height > lbl.Height * RapX) Or (Rec.Width>lbl.Width) Then
            lbl.TextSize = lbl.TextSize - dt
        Else
            lbl.TextSize = lbl.TextSize + dt
        End If
    Loop
End Sub

credevo di aver risolto visto che non mi dave errore. Invece errore in compilazione
1.png
 
Last edited:

Star-Dust

Expert
Licensed User
Longtime User
Io sto facendo copia e incolla come se fosse arabo. Come la dichiaro xui, ho ci vogliono delle librerie a parte UXI?
In global dichiara
B4X:
Dom xui as XUI
Come in qualunque app multipiattaforma.

Studiati il codice è semplice anche se un po' contorto. Fa una specie di ricorsione o una specie di bubble sort
 
Top