Italian [Risolto by LucaMs]XCLV Rimuovere item ma....anche da un'altra lista

LucaMs

Expert
Licensed User
Longtime User
Interessante...grazie prof:)
Non esageriamo, che sa un po' di presa per il c i fondelli 😁

Poi, pensa che ti ripensa, anziché mettermi a fare un semplice disegnino... mi sono messo a sviluppare un progetto d'esempio (e di studio; l'idea sarebbe di creare un sw con B4J che generi una base per la gestione di una tabella (meglio ancora se più tabelle correlate), visualizzando "record" in una CLV.

Inizialmente con un simulazione di db ma, come sempre, si inizia una cosa pensando di fare il minimo, senza dettagli e poi... e poi temo che tra poco creerò proprio un db d'esempio!

Magari prima... pranzo, perché mi sembra "quasi" ora 😁
 

XorAndOr

Active Member
Licensed User
Longtime User
secondo me la cosa migliore è un custom type).
Spesso faccio uso di xui.CreatePanel("") nelle mie app, ma mi tocca ogni volta inserire le variabili associate alle label o button
e se questa sub la volessi mettere da un'altra parte devo modificare tutto
B4X:
Private Sub PanelItem(ItemWidth As Int, ItemHeight As Int) As B4XView
    Dim xPnlItem As B4XView = xui.CreatePanel("")
    xPnlItem.SetLayoutAnimated(0, 0, 0, ItemWidth, ItemHeight)
    xPnlItem.LoadLayout("Item")   
    Label1.Text = s   
    Return xPnlItem
End Sub
vuoi dire che con una custom type questa sub può rimanere la stessa anche se la uso su più parti nell'app?
oppure non ho capito na maz..
 

LucaMs

Expert
Licensed User
Longtime User
oppure non ho capito na maz..
Chi non capisce più una mazza sono io, perché sto facendo 12 cose contemporanemente, nessuna ben fatta, quindi 😁 :confused:

Parlavo di una cosa che credo tu non usi: il valore associato agli item.

Il pannello - ovvero l'item - devi crearlo in quel modo, fai benissimo. Poi, però, vai ad inserirlo nella CLV, no?!

Quindi scriverai qualcosa tipo:
B4X:
MiaClv.Add(PanelItem(....), MaQuiUnValoreAssociato)

Nel progetto che avevi allegato, a quel MaQuiUnValoreAssociato non davi importanza, mettevi un semplice zero.

Un'idea, non eccezionale, sarebbe invece di metterci una variabile-oggetto, come valore (ci puoi mettere una variabile o anche direttamente un valore di qualunque tipo, eh).


Nel prossimo post, scriverò un esempio, non intelligentissimo, molto probabilmente.
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Metti che tu voglia visualizzare una CLV in cui ogni item rappresenti un articolo da vendere.

Metti che come dati dell'articolo tu abbia:

Nome
Marca
Prezzo

Potresti fare così:
B4X:
Type tArticolo(Nome As String, Marca As String, Prezzo As Double)
B4X:
Dim NuovoArticolo As tArticolo
'(NOTA l'IDE può scriverti direttamente la Sub per la creazione di un nuovo tArticolo *)
NuovoArticolo.Initialize
NuovoArticolo.Nome = "Scarpone"
NuovoArticolo.Marca = "Mike"
NuovoArticolo.Prezzo = 125

'Il 2° NuovoArticolo sarà il valore associato a quell'item,
'che ti verrà passato alla Sub-Evento Click.
MiaClv.Add(CreaItem(NuovoArticolo, 200dip, 100dip), NuovoArticolo)

B4X:
Private Sub CreaItem(Articolo As tArticolo, ItemWidth As Int, ItemHeight As Int) As B4XView
    Dim xPnlItem As B4XView = xui.CreatePanel("")
    xPnlItem.SetLayoutAnimated(0, 0, 0, ItemWidth, ItemHeight)
    xPnlItem.LoadLayout("layItem")  ' <--- layItem mi piace di più  ^__^

    lblNome.Text = Articolo.Nome
    lblMarca.Text = Articolo.Marca
    lblPrezzo.Text = NumberFormat2(Articolo.Prezzo, ... ... ....)

    Return xPnlItem
End Sub
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
non uso quasi mai il valore dell'oggetto
Eh, proprio a quello mi riferivo; invece è molto utile, ad esempio per non dover fare salti mortali per prendere il valore da una view che faccia parte dell'item.

Ma non solo per questo; ad esempio, potresti metterci l'ID (o cmq la chiave primaria) di una eventuale tabella di DB il cui contenuto mostri nella CLV.
 
Last edited:

XorAndOr

Active Member
Licensed User
Longtime User
Non ho resistito nel provare custom type
@LucaMs potresti gent. controllare se ho capito bene
cosa intentevi con la custom type?
funziona ma non sono sicuro se corretto
grazie
B4X:
XCLV1.Clear
dbSQL.InitializeSQLite(File.DirApp,"giocatori.db",True)
Dim Giocatore As tGiocatori
Giocatore.Initialize
dbCursor = dbSQL.ExecQuery("SELECT rowid,* FROM TbGiocatori")
Dim ItemWidth As Int = XCLV1.AsView.Width
Dim ItemHeight As Int = 140dip
Do While dbCursor.NextRow
    Giocatore.Id = dbCursor.GetString("id")
    Giocatore.Nome = dbCursor.GetString("nome")
    Giocatore.Cognome = dbCursor.GetString("cognome")       
    Giocatore.Eta = dbCursor.GetString("eta")
    Giocatore.Altezza = dbCursor.GetString("altezza")
    Giocatore.Sport = dbCursor.GetString("sport")       
    XCLV1.Add(CreaItem(Giocatore, ItemWidth, ItemHeight),Giocatore)
Loop   
dbCursor.Close
'PanelItem
Private Sub CreaItem(Giocatore As tGiocatori, ItemWidth As Int, ItemHeight As Int) As B4XView
    Dim xPnlItem As B4XView = xui.CreatePanel("")
    xPnlItem.SetLayoutAnimated(0, 0, 0, ItemWidth, ItemHeight)
    xPnlItem.LoadLayout("layItem")
    LBId.Text = Giocatore.Id   
    LBNome.Text = Giocatore.Nome
    LBCognome.Text = Giocatore.Cognome
    LBEta.Text = Giocatore.Eta
    LBAltezza.Text = Giocatore.Altezza
    LBSport.Text = Giocatore.Sport       
    Return xPnlItem
End Sub
 

LucaMs

Expert
Licensed User
Longtime User
Non ho resistito nel provare custom type
@LucaMs potresti gent. controllare se ho capito bene
cosa intentevi con la custom type?
funziona ma non sono sicuro se corretto
grazie
Sì, è ciò che intendevo.

C'è però un errore che... non ti spiego subito, perché sono... cattivo 🤣
Scrivi questo:
B4X:
Private Sub XCLV1_ItemClick (Index As Int, Value As Object)
    Log(Value.As(tGiocatori).Cognome)
End Sub
E' la routine che avevi già scritto ma vuota.
Nota il "casting", conversione di tipo, "inline", nella riga, fatta con .As (giusto una "curiosità", si può fare quasi ovunque).
Avrei potuto (forse dovuto) scrivere:
B4X:
Private Sub XCLV1_ItemClick (Index As Int, Value As Object)
    Dim Giocatore As tGiocatori = Value
    Log(Giocatore.Cognome)
End Sub

Quando lo avrai fatto e provato, se non lo avrai trovato ti dirò dove sia l'errore (e ti darò un paio di suggerimenti utili)
 

LucaMs

Expert
Licensed User
Longtime User
(e ti darò un paio di suggerimenti utili)
Beh, i suggerimenti te li scrivo subito. L'errore più tardi, se vedrò che non avrai risposto.

1 - Riguardo il custom type.
B4X:
Type tGiocatori(Id As String, _
       Nome As String, Cognome As String, _
       Eta As String, Altezza As String, _
       Sport As String)
1a - Allineare in quel modo (usando Tab, qui non viene bene) favorisce la leggibilità e perfino eventuali modifiche.

1b - Ma, più "importante", quelli sono dati di un giocatore, no? Quindi meglio chiamare il tipo: tGiocatore, al singolare

1c - Passando il cursore sul nome del tipo:

1681136845246.png


ti basterà clickare su quel "link" e l'editor scriverà la routine-funzione per la creazione di un oggetto di quel tipo, cosa molto utile:
B4X:
Public Sub CreatetGiocatori (Id As String, Nome As String, Cognome As String, Eta As String, Altezza As String, Sport As String) As tGiocatori
    Dim t1 As tGiocatori
    t1.Initialize
    t1.Id = Id
    t1.Nome = Nome
    t1.Cognome = Cognome
    t1.Eta = Eta
    t1.Altezza = Altezza
    t1.Sport = Sport
    Return t1
End Sub


2 - Lo saprai già e quello è solo un esempio, ma non è il caso di mostrare l'ID.
 

XorAndOr

Active Member
Licensed User
Longtime User
B4X:
Public Sub CreatetGiocatori (Id As String, Nome As String, Cognome As String, Eta As String, Altezza As String, Sport As String) As tGiocatori
    Dim t1 As tGiocatori
    t1.Initialize
    t1.Id = Id
    t1.Nome = Nome
    t1.Cognome = Cognome
    t1.Eta = Eta
    t1.Altezza = Altezza
    t1.Sport = Sport
    Return t1
End Sub
questa è un'altra cosa interessante
ma andiamo con calma, che già sono confuso
 

LucaMs

Expert
Licensed User
Longtime User
Hai sofferto abbastanza 😁 , ti rivelo l'errore.

B4X:
    Dim Giocatore As tGiocatori
    Giocatore.Initialize
    
    dbCursor = dbSQL.ExecQuery("SELECT rowid,* FROM TbGiocatori")
    Dim ItemWidth As Int = XCLV1.AsView.Width
    Dim ItemHeight As Int = 140dip
    Do While dbCursor.NextRow
        Giocatore.Id = dbCursor.GetString("id")
        Giocatore.Nome = dbCursor.GetString("nome")
        Giocatore.Cognome = dbCursor.GetString("cognome")       
        Giocatore.Eta = dbCursor.GetString("eta")
        Giocatore.Altezza = dbCursor.GetString("altezza")
        Giocatore.Sport = dbCursor.GetString("sport")       
        XCLV1.Add(CreaItem(Giocatore, ItemWidth, ItemHeight),Giocatore)
    Loop   
    dbCursor.Close

Se dichiari e inizializzi Giocatore PRIMA del ciclo (Do While), hai creato UN oggetto Giocatore e sempre e solo quello aggiungerai alla XCLV1.
Devi creare un oggetto Giocatore per ogni record, quindi dichiarazione e inizializzazione devono stare all'interno del ciclo, subito dopo la riga
Do While.
 
Top