Italian Ottimizzazione routine

Sabotto

Well-Known Member
Licensed User
Un quesito puramente didattico.
Devo assegnare un'immagine diversa a 5 SwiftButton
Ho scritto la routine e funziona, ma penso che potrebbe essere meglio ottimizzata, (visto che ci sono delle ripetizioni nel codice )
Qualche suggerimento?
B4X:
Public Sub SetSwiftButton
  
    Dim i as int
    Dim imgName() As String = Array As String("parola.png","pulsantone.png","passo.png","esatto.png","errore.png")
    Dim txtButton() As String = Array As String ("Nuova parola","Stop tempo","Passo","Risp esatta","Errore")
    Dim xImage As B4XBitmap
  
    For i = 0 To 4
        Dim cs As CSBuilder
        cs.Initialize
        xImage = xui.LoadBitmap(File.DirAssets, imgName(i))
        cs.Image(xImage, 70dip, 70dip, False)
        cs.Append(CRLF)
        cs.TypeFace(Typeface.DEFAULT)
        cs.Size(14)
        cs.Color(xui.Color_Black)
        cs.Bold
        cs.VerticalAlign(3dip)
        cs.Append(txtButton(i))
        cs.PopAll

        Select Case i
            Case 0
                sbtnNuovaParola.SetColors(xui.Color_Cyan, xui.Color_Black)
                sbtnNuovaParola.SideHeight = 10dip
                sbtnNuovaParola.xLBL.Text = cs
            Case 1
                sbtnStop.SetColors(xui.Color_Blue, xui.Color_Black)
                sbtnStop.SideHeight = 10dip
                sbtnStop.xLBL.Text = cs
            Case 2
                sbtnPasso.SetColors(xui.Color_Magenta, xui.Color_Black)
                sbtnPasso.SideHeight = 10dip
                sbtnPasso.xLBL.Text = cs
            Case 3
                sbtnEsatto.SetColors(xui.Color_Green, xui.Color_Black)
                sbtnEsatto.SideHeight = 10dip
                sbtnEsatto.xLBL.Text = cs
            Case 4
                sbtnErrore.SetColors(xui.Color_red, xui.Color_Black)
                sbtnErrore.SideHeight = 10dip
                sbtnErrore.xLBL.Text = cs
        End Select

    Next
      
End Sub
 

LucaMs

Expert
Licensed User
Longtime User
Non vedo possibili ottimizzazioni.

Potresti costruire la CSBulder in un'unica riga, ma molto meglio come hai fatto.

Una cosa utile è creare dei tipi personalizzati (custom type), per associare parti di un elemento.
Esempio non eccelso, anzi, visto che le bitmap le caricherai una sola volta, i testi una volta sola (traduzioni a parte); ho anche messo roba a caso, per dare l'idea.
B4X:
Type tCheNeSo(imgName As String, txtButton As String, CS As CSBuilder, QuelloCheTePare As String, Altro As Int, Pnl As B4xView)
Poi potrai avere Array, List o Map contenenti oggetti di quel tipo (stessa cosa delle classi, praticamente, solo che nelle classi hai anche eventi e puoi creare delle Sub-proprietà per impedire che vengano passati valori sballati = validazione dati) da gestire "ciclicamente".
 

Sabotto

Well-Known Member
Licensed User
Ero convinto che si potesse fare di meglio perchè la maggior parte delle assegnazioni fatte per il "cs" sono sempre le stesse.
Ma non sono riuscito a non ripeterle nelle 5 iterazioni.
 

Sagenut

Expert
Licensed User
Longtime User
Prova così
B4X:
Public Sub SetSwiftButton
 
    Dim i As Int
    Dim imgName() As String = Array As String("parola.png","pulsantone.png","passo.png","esatto.png","errore.png")
    Dim txtButton() As String = Array As String ("Nuova parola","Stop tempo","Passo","Risp esatta","Errore")
    Dim sbtn() As SwiftButton = Array As SwiftButton (sbtnNuovaParola, sbtnStop, sbtnPasso, sbtnEsatto, sbtnErrore)
    Dim xImage As B4XBitmap
 
    For i = 0 To 4
        Dim cs As CSBuilder
        cs.Initialize
        xImage = xui.LoadBitmap(File.DirAssets, imgName(i))
        cs.Image(xImage, 70dip, 70dip, False)
        cs.Append(CRLF)
        cs.TypeFace(Typeface.DEFAULT)
        cs.Size(14)
        cs.Color(xui.Color_Black)
        cs.Bold
        cs.VerticalAlign(3dip)
        cs.Append(txtButton(i))
        cs.PopAll
        sbtn(i).SetColors(xui.Color_Cyan, xui.Color_Black)
        sbtn(i).SideHeight = 10dip
        sbtn(i).xLBL.Text = cs
    Next
      
End Sub
 

Sagenut

Expert
Licensed User
Longtime User
Mi sono accorto di essermi dormito i vari colori.
Fai un Array anche per quelli.
 

LucaMs

Expert
Licensed User
Longtime User
Mi sono accorto di essermi dormito i vari colori.
Fai un Array anche per quelli.
Quattro array da mantenere allineati; è proprio in questi casi che conviene creare un custom type.
B4X:
Type tMyButton(imgName As String, TxtButton As String, SButton As SwiftButton, Color As Int)

Dim lstMyButtons As List
lstMyButtons.Initialize

lstMyButtons.Add(CreatetMyButton(....))
lstMyButtons.Add(CreatetMyButton(....))
lstMyButtons.Add(CreatetMyButton(....))
lstMyButtons.Add(CreatetMyButton(....))
lstMyButtons.Add(CreatetMyButton(....))



Public Sub CreatetMyButton (imgName As String, TxtButton As String, SButton As SwiftButton, Color As Int) As tMyButton
    Dim t1 As tMyButton
    t1.Initialize
    t1.imgName = imgName
    t1.TxtButton = TxtButton
    t1.SButton = SButton
    t1.Color = Color
    Return t1
End Sub
 

Sagenut

Expert
Licensed User
Longtime User
Non credo che dovrà aggiungere troppi altri elementi.
In quel caso sarebbe valida la tua soluzione.
 

Sagenut

Expert
Licensed User
Longtime User
Scrivere qualche riga in meno non significa necessariamente che sia meglio.
A livello di mantenimento probabilmente è migliore la soluzione di @LucaMs perché eviti (anche se magari non succederà) che la riga degli Array vada a finire chissà dove.
Se il tuo caso si ferma lì sono praticamente equivalenti.
 

LucaMs

Expert
Licensed User
Longtime User
La mia non era tanto una soluzione quanto il volere invogliarvi a creare custom type ? (utili, anche se le classi sono nettamente migliori. L'utilizzo è praticamente lo stesso: devi creare una variabile-oggetto (istanza) di quel <custom type> proprio come devi di una tua <classe>).
 
Top