Italian Unica variabile

Antonio67

Member
Ciao,risolto il primo problema del post precedente,ora (sempre attinente alla stessa app) come richiamare un certo numero di componenti es.5 label,con un unica variabile,non so tipo
dim x = label1,label2,label3,label4,label5 as label
grazie sempre
 

Antonio67

Member
Ciao lord. Facendo cosi non ho un riferimento per tutte le label. In pratica vorrei evitare di dichiarare una label alla volta. Ripeto vorrei una variabile con cui in essa faccio riferimento a tuttenle label che possono essere 5 come 100. Non so se mi sono espresso bene, faccio un esempio: se voglio che 10 label diventino tutte dello stesso colore dovrei dire label1.color=colors.red, label2.color=colors.red...e cosi via, mentre mi sarebbe pratico scrivere dim x (10) as label x.color=colors red. Logicamente così non funziona. Ma il concetto e quello, cioè di cambiare colore tutte insieme.
 

LordZenzo

Well-Known Member
Licensed User
Longtime User
se tu facessi una cosa del genere (che non e' possibile), oltre al colore sarebbero tutte uguali anche per il testo e non credo tu voglia una cosa del genere
percui
usa la matrice di label
ed il codice unico sara'
for i=0 to 4
lelabel(i).color=red
next i
 

Antonio67

Member
Ciao. Niente non funziona ancora, possibile che non ce un modo per richiamare un certo numero di label con un unico nome, sarebbe stato molto comodo dire che y equivale alla label1,label2,label3,ecc...
 

sirjo66

Well-Known Member
Licensed User
Longtime User
"molto comodo" ???

a me invece sembra del tutto inutile, che senso ha mettere 100 label uguali con esattamente le stesse proprietà ??

senza contare il fatto che se devo cambiare il colore a tutte 100 le label mi bastano tre righe di programma

Sergio
 

Antonio67

Member
Il colore delle label e solo un esempio. Ti spiego velocemente quello che sto cercando di realizzare: ho 90 label contrassegnate da 1 a 90, poi ho un'altra label che mi sortisce un numero. Ora devo fare in modo che la label che ha lo stesso numero della label che sortisce i numeri, cambia colore . es.se il numero è 20 la label numero 20 da rossa passa a blu. Inizialmente facevo: che se la labe1.text="30" allora la label con il numero 30 cambia colore. Cosi e facile su poche label ma su 90 il codice sarebbe lungo 1000 km. Per questo mi era comodo richiamare tutte le 90 label con un solo nome.
 

LucaMs

Expert
Licensed User
Longtime User
Non è chiarssimo cosa vuoi ottenere e perché.

Comunque, supponendo che tu voglia "trattare" un gruppo di label in modo diverso da altre label presenti in un layout, il modo più semplice è quello di mettere il gruppo di label dentro un panel (volendo questo può essere di colore trasparente).
Mettiamo che tu abbia chiamato il pannello pnlGruppoLabel, poi puoi usare:
B4X:
For Each lbl As Label In pnlGruppoLabel.GetAllViewsRecursive
    lbl.Color = Colors.Red
Next

1) il pnlGruppoLabel dovrà contenere soltanto le label (altrimenti il codice va modificato)
2) potresti scrivere quelle 3 righe in una routine e, a seconda della proprietà della label che vuoi modificare, passargli i parametri adatti, tipo:
B4X:
Private Sub ModificaGruppoLabel(NomeProprieta As String, ValoreProprieta As Object)
   For Each lbl As Label In pnlGruppoLabel.GetAllViewsRecursive
     Select NomeProprieta
       Case "Color"
         lbl.Color = ValoreProprieta
       Case "TextColor"
         lbl.TextColor = ValoreProprieta
       Case ' altre proprietà
     End Select
   Next
End Sub


Anzi, meglio ancora, potresti anche passare il pannello alla routine, così potresti avere più gruppi e scegliere quale gruppo di label modificare.
B4X:
Private Sub ModificaGruppoLabel(pnlGruppo As Panel, NomeProprieta As String, ValoreProprieta As Object)
   For Each lbl As Label In pnlGruppo.GetAllViewsRecursive
     Select NomeProprieta
       Case "Color"
         lbl.Color = ValoreProprieta
       Case "TextColor"
         lbl.TextColor = ValoreProprieta
       Case ' altre proprietà
     End Select
   Next
End Sub
 

LucaMs

Expert
Licensed User
Longtime User
Il colore delle label e solo un esempio. Ti spiego velocemente quello che sto cercando di realizzare: ho 90 label contrassegnate da 1 a 90, poi ho un'altra label che mi sortisce un numero. Ora devo fare in modo che la label che ha lo stesso numero della label che sortisce i numeri, cambia colore . es.se il numero è 20 la label numero 20 da rossa passa a blu. Inizialmente facevo: che se la labe1.text="30" allora la label con il numero 30 cambia colore. Cosi e facile su poche label ma su 90 il codice sarebbe lungo 1000 km. Per questo mi era comodo richiamare tutte le 90 label con un solo nome.

Purtroppo i tuoi post, non avendo una licenza, arrivano in ritardo ed io ho scritto il mio precedente senza ancora aver potuto leggere il tuo.

Nel tuo caso, dovresti usare un array, come ti ha consigliato @LordZenzo. Al limite, se non vuoi usare il codice:
dim LeLabel(4) as label
Lelabel(0)=label1
Lelabel(1)=label2
.....

potresti usare le tre righe del post precedente ma in questo modo (dopo aver messo le label in un pnlGruppoLabel - con Colors.Transparent, se serve):
B4X:
Dim I As Int = 0
For Each lbl As Label In pnlGruppoLabel.GetAllViewsRecursive
    Lelabel(I) = lbl
    I = I + 1
Next

Attenzione però che le label siano state tutte inserite nel giusto ordine, altrimenti verrano inserite nell'array in maniera non corretta.
Altro modo: potresti mettere il numero nella proprietà Tag della label e poi usare:
B4X:
Dim I As Int
For Each lbl As Label In pnlGruppoLabel.GetAllViewsRecursive
    I = lbl.Tag
    Lelabel(I) = lbl
Next

(ovvio che il nome array Lelabel a me non piace, lblNumeri() sarebbe meglio, ma @LordZenzo ha giustamente fatto solo un esempio. Così come il panel potresti chiamarlo pnlNumeri).
 
Last edited:

LordZenzo

Well-Known Member
Licensed User
Longtime User
e comunque
tu vorresti che un solo comando faccia il lavoro di tre
ma nella programmazione non e' cosi che funziona
nel modo dei bit e dei pc, un programma di 10.000 righe serve a fare un solo caffè
una volta scritte le 10.000 righe possiamo avere il lusso di chiamare le 10.000 righe con il nome FaiIlCaffe e con un unico comando fare il lavoro di tre
ossia
fai una routine con i consigli che ti abbiamo dato, magari falla in maniera aperta ossia che sia possibile poter riutilizzare anche in altri programmi, e vedrai che tutto funziona alla grande
 

Antonio67

Member
Certo anche mi sa che ho cantato vittoria tropo presto.
Allora: come detto da Luca, ho raggruppato le label nel panel
ForEach lab AsLabel In pan
Lab sono le label contrassegnate e L1,L2, e L3 sortiscono i numeri. Ora dopo
ForEach lab AsLabel In pan
Ho dato la condizione di
If l1.text=lab.text then
Lab.color=colors.blue
Else
Lab.color=colors.red
Ora se faccio la stessa cosa con l2 e l3, mi da solo la l3
Cioè lab segue solo il numero di l3 e no delle altre 2.Uffa
 

LucaMs

Expert
Licensed User
Longtime User
Sai "che te dico"? Faccio prima a creare un esempio che a spiegarlo :)


... e mentre creavo l'esempio, mi sono accorto che hai ragione e penso sia un bug.
Se si utilizza:
B4X:
For Each lbl As Label In pnlGruppo.GetAllViewsRecursive
ad ogni "giro", lbl dovrebbe puntare ad una label diversa e quindi mettendo poi:
lblNumero(I) = lbl
avendo incrementato I, il tutto dovrebbe funzionare; invece no!

Quindi la soluzione è usare:
B4X:
For I = 0 to pnlGruppo.NumberOfViews - 1
    Dim lbl As Label = pnlGruppo.GetView(I)



Prova allegata.
 

Attachments

  • EvidenziaLabel.zip
    10.5 KB · Views: 295
Last edited:

Antonio67

Member
Ciao Luca l'esempio non me lo apre ho la ver.2.50.Intanto ti invio la bozza dell'app in forma ridotta
 

Attachments

  • bingo.zip
    7.6 KB · Views: 302
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Ciao Luca l'esempio non me lo apre ho la ver.2.50.Intanto ti invio la bozza dell'app in forma ridotta
E' leggermente incasinata :p (scusa, eh).

Intanto, per favore, usate dei nomi decenti per View e variabili!

Queste righe sono sbagliate:
B4X:
If l1=lab.Text

' semmai
If l1.Text = lab.Text

B4X:
For i = 0 To Pan.NumberOfViews(1)

For i = 0 To Pan.NumberOfViews-1

B4X:
lab(i)=Pan

???? in questo modo tenti di mettere un pannello nell'array di label lab

e tanta altra roba è sbagliata.

Tutto quel vai, ripeti, timer... non sono necessari, se utilizzi la routine Estrai che trovi nel progetto che ho allegato


Apri IN UN TEXT EDITOR (Wordpad) EvidenziaLabel.b4a del progetto che ho allegato e copia e incolla le routine che ti servono.



Altrimenti mandami le specifiche del progetto che vuoi realizzare + 100 euro per ogni ora che impiegherò per realizzarlo :p (scherzo, ovviamente... nel senso che 100 non bastano :p)
 
Top