Italian assegnare nomi ad oggeti con tag tramite cicli for/if

iz1kbp

Member
Ciao a tutti, mi sto arenando su un problema che in VB6 si risolve in pochi secondi.
In Vb6 , ho un array di 24 tasti ( buttonx (23) ), e per mettere un testo (caption)a tutti assieme, semplicemente uso un ciclo for da 1 a 23 con un if sull'indice dell'array.
Se l'indice corrisponde al numero del ciclo if, semplicemente button(index).caption ="testo"

In B4a non esiste questo metodo di matrici.
Ho seguito il tutorial per creare i tasti con il tag...ma arrivato allo stesso punto...mi areno, non so come fare questa operazione:
ho 24 tasti e devo assegare un numero da 1 a 24 a ciascuno di questi tasti tramite un ciclo for.
esempio:
for cicla=1 to 24
if tag=cicla then bottone.text=cicla
next


Ho a disposizione il tag...ma non trovo alcun riferimento al tasto che voglio indirizzare.
Mi sapete dare una dritta?
Grazie
Mario
 

giannimaione

Well-Known Member
Licensed User
Longtime User
anche con B4A puoi creare un "array" di bottoni; o tramite codice oppure nel designer

non si capisce (scusa) che cosa vuoi ottenere; ogni singolo bottone con la proprietà TEXT numerata oppure cosa?
in ogni caso ci sono tanti esempi nel forum
 

LucaMs

Expert
Licensed User
Longtime User
Nemmeno io ho capito esattamente cosa vuoi fare con i tasti. Cmq, la soluzione migliore è metterli tutti in un Panel (volendo trasparente) e poi ciclare con:

B4X:
For Each btn As Button In NomePannello.GetAllViewsRecursive
    btn.Text = "Quello che vuoi"
Next

Puoi anche inserirli in un array, più o meno con quel codice:

B4X:
Private arrButtons(24) As Button

Dim I As Int = 0
For Each btn As Button In NomePannello.GetAllViewsRecursive
    btn.Text = "Quello che vuoi"
    arrButtons(I) = btn
    I = I + 1
Next

Nota che il primo elemento di un Array ha indice zero.
 

sirjo66

Well-Known Member
Licensed User
Longtime User
se ho capito bene hai creato 24 bottoni sul designer, e su ogni bottone hai messo il valore tag da 1 a 24, e lo vuoi riportare sul bottone.text, e così ???

in questo caso:
B4X:
For Each btn As Button In NomePannello.GetAllViewsRecursive
    btn.Text = btn.Tag.ToString
Next

Praticamente per fare la scansione di questi bottoni devi usare GetAllViewsRecursive, ed è per questo che Luca ti ha consigliato di metterli dentro un Panel, perchè così non fai la scansione anche su tutti gli altri oggetti che hai nella tua Form, altrimenti dovresti anche capire oggetto per oggetto di cosa si tratta (Button, Label, EditText eccetera).

Altra soluzione molto carina (come ti ha già suggerito Luca) è di fare una volta sola la scansione dei bottoni e di mettere il relativo puntatore su un array di puntatori ai bottoni, così puoi riferirti a loro usando appunto un indice.
Ecco il perchè dell'array Private arrButtons(24) As Button
Poi per assegnare il puntatore arrButtons(I) = btn
e quindi poi per riferirsi al bottone numero 5, ad esempio farai arrButtons(4)
In questo modo puoi (quasi) fare come in VB6
 
Last edited:

sirjo66

Well-Known Member
Licensed User
Longtime User
quello che ti ho riportato è solo un traccia di quello che devi fare, dai un'occhiata in giro, non mi ricordo al volo cosa scrivere

e poi se non dici che errore ti dà come possiamo aiutarti ??

dato che su B4A (come su Java) la conversione dei dati è implicita, basta che tu scriva btn.Text = btn.Tag
 
Last edited:

iz1kbp

Member
questo è l'errore
------------------
B4A Versione: 9.80
Java Versione: 8
Analisi del Codice. (0.03s)
Building folders structure. (0.03s)
Compilazione del codice. Error
Errore nella compilazione del programma.
Descrizione dell'errore: Tipo sconosciuto: Object
Manca un riferimento ad una libreria?
Errore nella linea: 52
btn.Text=btn.Tag.tostring
Word: tostring
-----------------------
 

iz1kbp

Member
scusate...sarò ignorante ma non capisco

questo è il codice caricato nell'activity create . sono le linee 48,49,50

Viene compilato,senza errori, ma nel debug ,parte con una serire di errori Java ...questo è lo screen shot.
L'applicazione non parte neppure. 1584280747444.png

1584280747444.png
 

Sagenut

Expert
Licensed User
Longtime User
Il suo problema penso che sia che non ha ancora creato l'array di Button.
Guarda quì:
Creare array di Views
 

Sagenut

Expert
Licensed User
Longtime User
Per creare un array vero e proprio:
B4X:
dim arrbuttons() as button
arrbuttons = array as button (button1, button2, button3, button4........)

for x = 0 to 23
    arrbuttons(x).text = arrbuttons(x).tag
next
I button devono essere già stati creati e dichiarati.
 
Last edited:

iz1kbp

Member
... quello che era un problema abbastanza semplice sta diventando una cosa enorme!! Torno al mio vecchio progetto, fatto di tante funzioni replicate per ogni singolo pulsante.
Era lungo, concettualmente sbagliato, ma funzionante.
 

Sagenut

Expert
Licensed User
Longtime User
Ma no, non mollare!
 

iz1kbp

Member
Sono iscritto su alcuni forum su vb6, è mia abitudine, nel caso intervenga come "consigliere" per chi pone la domanda scrivere un codice che prelevo direttamente dall'IDE di vb6 e che provo direttamente.
Se poi addirittura postavano il codice, ovvio se di dimensioni ragionevoli, lo scaricavo e ci guardavo dentro .
In caso chiedevo lumi sul codice indicando numero riga/procedura.Andare a tastoni so cosa vuol dire....perdere tempo. nulla piu.In Vb6 quello che devo fare sono 4 istruzioni in croce, ci impiego 1 un minuto.
Non si tratta di non conscere la struttura della programazione, sono nu po di anni che uso vb6,si tratta solo che non c'è una bibliografia sulle varie funzioni e sintassi base e con esempi esplicativi, come su MSND di vb6....per esempio.
Per esempio, hanno postato un codice con scritto...B4XView..cosa è?
Lancio l'Help e mi rimanda ad un form di gente che utilizza il sistema da anni.
Per uno come me che sta iniziando cosa capisce? poco...se non dopo domande , domande con risposte, per molti scontate...ma per un "novello"...non certo.
Scusate lo sfogo...ma dai tempi di qbasic per dos, ho passato un po di IDE.
Grazie comunque e buon proseguimento
Mario
 

giannimaione

Well-Known Member
Licensed User
Longtime User
ma che cavolo significa?
B4X:
For Each btn As Button In NomePannello.GetAllViewsRecursive
    btn.Text = btn.Tag
Next
scusate, se l'esempio serve solo per far comprendere il funzionamento ok; altrimenti NON HA NESSUNA UTILITA'
 

giannimaione

Well-Known Member
Licensed User
Longtime User
Non si tratta di non conscere la struttura della programazione, sono nu po di anni che uso vb6,si tratta solo che non c'è una bibliografia sulle varie funzioni e sintassi base e con esempi esplicativi, come su MSND di vb6....per esempio.
Per esempio, hanno postato un codice con scritto...B4XView..cosa è?
cosa pensavi di trovare ? L'America ? oppure l'oro in Eldorado ?
il copia e incolla non serve; devi capire la logica (se vuoi essere / diventare un programmatore)
studia ragazzo, studia!

"Gli esami non finiscono mai" Eduardo de Filippo
 

Sagenut

Expert
Licensed User
Longtime User
Cerco di aiutarti in maniera più concreta.
Immagino che tu abbia già creato una interfaccia con 24 Button tramite il Designer. Giusto?
Sempre dal Designer dal menù scegli Tools -=> Generate Members e metti il segno di spunta su tutte le caselle dei 24 button e poi Generate Members dalla stessa finestra.
In questo modo crei il riferimento nell'IDE tipo
B4X:
Private button1 as button
In Globals metti
B4X:
dim arrbuttons() as button
senza dichiarare la dimensione tra le parentesi in modo da avere più libertà.
Per creare un array di button usa il codice che ti ho già postato
B4X:
arrbuttons = array as button (button1, button2, button3, button4........)
dove dovrai scrivere tutti i nomi dei button che vuoi includere nell'array.
Da quel momento potrai gestire l'array con un ciclo
B4X:
for x = 0 to 23
    arrbuttons(x).text = arrbuttons(x).tag
next
Spero di averti aiutato maggiormente.
 

giannimaione

Well-Known Member
Licensed User
Longtime User
ragazzi è tutto inutile;
se il buon e bravo iz1kbp non ci fa capire cosa deve realizzare, è tutto inutile!
 
Top