French problème sur rowcol

logemag

Member
Licensed User
Bonjour, après un événement click, je crée une nouvelle ligne sur un scrollview, (je me suis servi du tutoriel de Klaus, très pratique d'ailleurs) mais j'ai fait quelques modifications car mes labels-cellules ne font pas toutes la même taille. après un click sur bouton j'actionne un addROw et exécute l'action suivante :

B4X:
Sub addRow(values() As String)
Dim lastROW As Int ' retourne le numero de ligne
Dim lastCOL As Int ' retourne le numero de colonne
   lastCOL = 0
   lastROW = nbrROW
   Dim rc As rowcol 
   rc.Initialize 
   rc.col = lastcol
   rc.row = lastrow
table.addView(module1.lblCreatorTag("cell",rc, values(0), 16, blanc),00*Px,celH * lastROW, 20*Px -1dip, celH)
   lastCOL = lastCOL +1 ' augmente la valeur de colonne de 1
   rc.col = lastCOL
table.addView(module1.lblCreatorTag("cell",rc, values(1), 16, blanc),20*Px, celH * lastROW, 40*Px -1dip, celH)
   lastCOL = lastCOL +1 ' augmente la valeur de colonne de 1
   rc.col = lastCOL
table.addView(module1.lblCreatorTag("cell",rc, values(2), 16, blanc),60*Px, celH * lastROW, 20*Px -1dip, celH)
   lastCOL = lastCOL +1 ' augmente la valeur de colonne de 1
   rc.col = lastCOL
table.addView(module1.lblCreatorTag("cell",rc,values(3), 16, rouge),80*Px, celH * lastROW, 20*Px -1dip, celH)
table.Height = nbrROW * celH
End Sub

Sub cell_Click
   Dim rc As rowcol 
   Dim l As Label
   l = Sender
   rc = l.Tag 
   selectedRow(rc.row) 'sert a afficher la ligne en surbrillance
   activity.Title = "cellule clickée = ("&rc.row&","&rc.col&")"
End Sub

mais si je sélectionne une ligne (cell_click), la valeur de colonne est toujours la même, (3 en l’occurrence) alors que j'incrémente de 1 à chaque nouvelle ligne dans le tag du label.

pour info, j'ai crée un dans un module1, lblcréatortag pour mettre en forme le label, code ici :
B4X:
Sub lblCreatorTag (event As String, tag As rowcol,Text As String, taille As Float, couleur As Int) As Label 
  Dim b As Label
     'tag.row = tag.row +1
     b.Initialize(event)
   b.Text = Text
   b.Tag = tag
   b.Color = couleur
   b.TextColor  = Colors.Black
   b.Gravity  = Gravity.CENTER
   b.TextSize  = taille
  Return b
End Sub

la valeur de ligne est bonne, je comprends pas pourquoi dans le tag cette valeur de colonne reste inchangée à 3... ça me bloque pour la suite, si je veux changer la valeur d'un seul label, il ne me le reconnais pas. Merci d'avance
 

klaus

Expert
Licensed User
Il faut ajouter avant l'ajout d'un nouveau Label
B4X:
Dim rc As RowCol
rc.Initialize
rc.col = lastcol
rc.row = lastrow
Sinon le compilateur admet la variable 'rc' la même pour les quatre Labels, donc la dernière définie, donc col = 3.

Meilleures salutations.
 

logemag

Member
Licensed User
Merci Klaus, effectivement ça fonctionne, par contre j'ai quand même du mal à comprendre ça !

B4X:
Dim lastROW As Int ' retourne le numero de ligne
Dim lastCOL As Int ' retourne le numero de colonne
   lastCOL = 0
   lastROW = nbrROW
   Dim rc As rowcol 
   rc.Initialize 
   rc.col = lastcol
   rc.row = lastrow
table.addView(module1.lblCreatorTag("cell",rc, values(0), 16, blanc),00*Px,celH * lastROW, 20*Px -1dip, celH)
   lastCOL = lastCOL +1 ' augmente la valeur de colonne de 1
   Dim rc As rowcol 
   rc.Initialize 
   rc.col = lastcol
   rc.row = lastrow
table.addView(module1.lblCreatorTag("cell",rc, values(1), 16, blanc),20*Px, celH * lastROW, 40*Px -1dip, celH)
   lastCOL = lastCOL +1 ' augmente la valeur de colonne de 1
   Dim rc As rowcol 
   rc.Initialize 
   rc.col = lastcol
   rc.row = lastrow
table.addView(module1.lblCreatorTag("cell",rc, values(2), 16, blanc),60*Px, celH * lastROW, 20*Px -1dip, celH)
   lastCOL = lastCOL +1 ' augmente la valeur de colonne de 1
   Dim rc As rowcol 
   rc.Initialize 
   rc.col = lastcol
   rc.row = lastrow
table.addView(module1.lblCreatorTag("cell",rc,values(3), 16, rouge),80*Px, celH * lastROW, 20*Px -1dip, celH)
table.Height = nbrROW * celH
End Sub

J'avoue que je reste perplexe quand à initialiser identiquement plusieurs fois la même variable dans la même sub ! En tout cas ça fonctionne c'est l'essentiel, merci encore, j'y aurais jamais pensé, je me disais qu'en incrémentant une variable row-col dans chaque tag, indépendamment, la valeur se figeait dans chaque tag et ne rendait pas seulement la dernière !!! bizarre quand même pour moi, j'ai encore beaucoup à apprendre... merci encore ! Je butais dessus depuis hier soir et ça me bloquait pour la suite du projet...
 

klaus

Expert
Licensed User
Il faut considérer rc non pas comme une variable mais comme un objet.
Donc le fait de ne définir qu'un objet par ligne, les quatre Label.Tag font référence au même objet. Donc pour les différencier il faut quatre objets indépendants!

Meilleures salutations.
 

logemag

Member
Licensed User
effectivement dit comme ça, c'est bien plus logique, effectivement. J'imaginais plus le rowcol comme une variable à deux dimensions, c'est compris. Merci encore pour ces précieux renseignements, c'était la première fois que j'utilisais cet élément... Pendant mon insomnie, je viens de m'apercevoir d'un autre problème : sur un action click bouton, je dois passer 3 variables : (en fait 4, mais la dernière n'est qu'une unité 1 avec incrémentation)
- une variable index (int) pour retrouver et incrémenter l'élément sélectionné.
- une variable désignation (string) pour l'affichage du libellé.
- une variable (double) pour une valeur du même libellé.
pour l'instant je passe l'index dans le .tag du bouton, et la désignation dans le .text, mais finalement il me manque sa valeur,... Je pensais être obligé de construire une list en aval, contenant l'index et la valeur, mais j'avoue que je sais pas trop comment m'y prendre. existe-il un autre moyen de passer plusieurs valeurs différentes dans un même tag ? le rowcol renvoie deux int, existe il dans le même genre un objet qui peut renvoyer un int et un double en même temps... Sinon je gérerais une base sql, ça sera peut être plus simple. encore des tutos à potasser !!! merci pour ces précieux conseils en tout cas et bonnes fêtes !
 

klaus

Expert
Licensed User
Oui,

B4X:
Type Tags (Row As Int, Col As Int, Index As Int, Designation As String, Valeur As Double)
Dim Tag1 As Tags
Tag1.Row = 1 
Tag1.Col = 1
Tag1.Index = 1
Tag1.Desigsnation = "Texte"
Tad1.Valeur = 123.2334
Et utiliser comme RowCol, mais avec les variables complémentaires.

Meilleures salutations.
 

logemag

Member
Licensed User
mince effectivement, j'avais survolé le TYPE, ça permet de faire ce qu'on veut avec... bin faut faut que je revoie mon code pour tout passer... C'est le problème de n'avoir jamais suivi de cours de basic, quand on apprend tout seul on se trouve vite limité, et on fait seulement avec le peu que l'on connait..., merci encore même si mes questions paressent futiles, mais j'en apprends vraiment tous les jours, et ça me booste... à bientôt pour un nouveau défi... si j'y arrive...
 
Top