Italian COSTANTI? assenti!

dexMilano

Active Member
Licensed User
Longtime User
Scusate,
posto per conferma.
In B4A NON è possibile definire delle costanti ma solo variabili che si inzializzano al valore in questione.

Ma voi come fate?

Io al momento facico così
B4X:
spn_status.Add("New")                : Dim STATUS_NEW As Int = 0
Ma come faccio a evitare di scriverci sopra per errore?

thx

dex
 

LucaMs

Expert
Licensed User
Longtime User
eh non
Scusate,
posto per conferma.
In B4A NON è possibile definire delle costanti ma solo variabili che si inzializzano al valore in questione.

Ma voi come fate?

Io al momento facico così
B4X:
spn_status.Add("New")                : Dim STATUS_NEW As Int = 0
Ma come faccio a evitare di scriverci sopra per errore?

thx

dex

eh, si, non esistono costanti e enum.

Ci stavo (ri)pensando proprio poco fà.

Stavo pensando ad usare una classe... ora vedo se può essere adatta allo scopo.

Un altro modo potrebbe essere... chiedere ad Erel se sia fattibile qualcosa con la reflection (non so bene come funzioni, la reflection, ma ritengo sia lo strumento più potente per superare i limiti di b4a).


P.S. ho provato con una classe... guarda l'esempio qui
 
Last edited:

djveleno

Active Member
Licensed User
Longtime User
Scusate,
posto per conferma.
In B4A NON è possibile definire delle costanti ma solo variabili che si inzializzano al valore in questione.

Ma voi come fate?

Io al momento facico così
B4X:
spn_status.Add("New")                : Dim STATUS_NEW As Int = 0
Ma come faccio a evitare di scriverci sopra per errore?

thx

dex
Io le costanti le dichiaro in Sub Process_Global e, sono certo di non poterle sovrascrivere in quanto uso la dichiarazione della variabile e non il valore, ad esempio, se voglio disegnare una riga, e mi serve sempre Blu dichiaro una costante di questo genere:

B4X:
Dim LineColor As Int                        : LineColor = Colors.Blue

La costante potrà cambiare solo se da codice assegnerò un altro valore alla stessa, altrimenti non potrò sovrascriverla in alcun modo.
 

dexMilano

Active Member
Licensed User
Longtime User
Grazie per le conferme
:-(

@djveleno
non ho capito
se tu da qualche altra parte scivi (x errore)
LineColor = Colors.Red
Il valore cambia.
 

djveleno

Active Member
Licensed User
Longtime User
Grazie per le conferme
:-(

@djveleno
non ho capito
se tu da qualche altra parte scivi (x errore)
LineColor = Colors.Red
Il valore cambia.
Purtroppo si, perchè in realtà sono delle semplici variabili e quindi possono variare ma, se crei una classe che contiene tutte le costanti, allora non potranno mai cambiare, neanche per errore.
 

dexMilano

Active Member
Licensed User
Longtime User
visto.
adesso ho capito come "proteggerlo".
Mi chiedo se ha senso fare una classe ad hoc per questo uso.
Che dici?
Grazie
 

LucaMs

Expert
Licensed User
Longtime User
visto.
adesso ho capito come "proteggerlo".
Mi chiedo se ha senso fare una classe ad hoc per questo uso.
Che dici?
Grazie

Come ho scritto, ci ho pensato adesso (anzi, in quel momento), a usare una classe per quello scopo, quindi nella unica app che sto completando ancora non l'ho usata (magari col tempo, quando l'avrò finita...)

Si, ha senso, perché appunto non sono variabili ma qualcosa di più simile alle costanti. Non ha la comodità delle Enum di VB.Net, ma nell'intellisense vengono fuori ugualmente.
 

LucaMs

Expert
Licensed User
Longtime User
Ah, chiaramente, l'avevo pensata e scritta al volo in quel momento, quindi potrebbe essere MOLTO migliorata...
la cosa che mi viene in mente adesso è aggiungere un commento al costruttore (l'inizializzazione) specificando che và trattata come una Enum.
Poi, chissà, qualche parametro? mah, devo pensarci un po' :)
 

dexMilano

Active Member
Licensed User
Longtime User
Alla fine ho optato per questa soluzione.
La pubblico perchè potrebbe essere utile ad altri e perchè accetto miglioramenti.

Creo una classe (MY_CONSTANTS) senza alcun attributo con Initialize vuoto, dove metto una serie di metodi che si chiamano come le costanti che mi servono

B4X:
'Class module
Sub Class_Globals
   
End Sub

'Initializes the object. You can add parameters to this method if needed.
Public Sub Initialize

End Sub
...
'Importance   
Sub IMP_HIGH As Int : Return 3 : End Sub
Sub IMP_MEDIUM As Int : Return 2 : End Sub
Sub IMP_LOW As Int : Return 1 : End Sub
Sub IMP_NULL As Int : Return 0 : End Sub
...
Come potete immaginare questo approccio evita la riscrittura dei valori (non ci sono!)


Ovviamente nel modulo main devo mettere qualcosa del tipo
B4X:
    Dim KONST As MY_CONSTANTS
    KONST.Initialize


per usare le costanti devo semplicemente semplicemente
B4X:
If Position < KONST.STATUS_CLOSE AND currentAct.status > KONST.STATUS_WAIT Then btn_saveAct.Enabled = True
In questo modo l'helper dell'IDE mi da anche i nomi delle costanti.
 

LucaMs

Expert
Licensed User
Longtime User
Io ho usato un metodo mooolto simile (come avevo già scritto nel #5) però mi complico la vita, perché creo più di una "classe di costanti".
Il motivo è evidente: mi servono per scopi diversi, magari legate ad altre classi "normali" che non sono sempre presenti in una app.
Volendo, puoi aggiungere il commento ad ogni Sub-costante, così l'IDE non solo ti suggerisce il nome della costante, ma te ne spiega anche la "funzione".

(Chissà se per Erel sia complicato mettere costanti e magari variabili statiche in B4A! mah, probabilmente sì)
 
Last edited:
Top