Italian [B4XPage][B4XDraw][B4J] Differenti Draw in diverse Page

Elric

Well-Known Member
Licensed User
Grazie mille!

Thank you very much!

Questo potrebbe voler dire che gli eventi dei due layout (CenterPanel e LeftPanel) devono essere gestiti nel modulo dove è inizializzato il drawer?

This might mean that the events of two layouts (CenterPanel and LeftPanel) should be managed in the module where the drawer is initialized?
Nell'esempio di klaus questo non avviene: il drawer e i due layout (CenterPanel e LeftPanel) sono inizializzati nel modulo mdlDrawer mentre gli eventi dei pulsanti nei moduli B4XPageX. Quindi questa non è una regola.

In klaus's example this is not true: the drawer and both layouts (CenterPanel e LeftPanel) are initialized in mdlDrawer module but the buttons events in B4XPage modules. Then, this is not a rule.
 

LucaMs

Expert
Licensed User
Longtime User
Grazie mille!

Thank you very much!


Nell'esempio di klaus questo non avviene: il drawer e i due layout (CenterPanel e LeftPanel) sono inizializzati nel modulo mdlDrawer mentre gli eventi dei pulsanti nei moduli B4XPageX. Quindi questa non è una regola.

In klaus's example this is not true: the drawer and both layouts (CenterPanel e LeftPanel) are initialized in mdlDrawer module but the buttons events in B4XPage modules. Then, this is not a rule.
Iniziamo col chiamare le cose col loro nome, altrimenti ci perdiamo.

mdlDrawer, creato da te, precisamente è una Classe, non un Modulo di codice (*) (motivo per cui, tra l'altro, dargli quel nome, con quel prefisso "mdl" e dare alle sue istanze (oggetti) il prefisso "mod" è molto fuorviante).

Nel progetto ci sono 4 istanze (oggetti) della classe mdlDrawer, ognuna dichiarata privata ed initializzata in una classe B4XPage. La classe mdlDrawer ha un oggetto di tipo B4XDrawer e lo "espone", dato che è dichiarato Public.

Gli eventi associati alle B4XView della "parte sinistra" del Drawer vengono gestiti nella tua classe mdlDrawer perché è in questa che viene caricato il layout, il cui nome gli viene passato dall'interno di quelle 4 B4XPage.

Quindi:
Quindi questa non è una regola.
quella è una regola, gli eventi delle view (o B4XView) devono stare nella classe in cui il layout viene caricato.

(*) [Nota che un modulo di codice, oltre a non poter essere istanziato - ovvero creare oggetti da esso, "copie" diciamo, non può contenere-gestire eventi]
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Utilizzando il primo sistema, avevo imbastito un'app che mostrava drawer diversi in funzione di chi aveva effettuato il login (in pratica il menu di opzioni mostrato sul drawer dipendeva dal profilo dell'utente); mi restava di passare tutto a classe, ma..ho perso interesse e mi sono dedicato ad altro.
Sarebbe diventato alquanto complicato. A seconda di chi avesse effettuato il login (magari specifico utente o "qualifica" dell'utente - amministratore o no, ad esempio) avresti non solo dovuto caricare layout diversi nella "parte sinistra del Drawer" (LeftPanel), cosa fattibile, ma anche gestire gli eventi delle view contenute in quei layout e spostando tutto in una classe anche tutti questi eventi sarebbero dovuti stare in questa classe, eventi che poi avrebbero dovuto chiamare routine delle varie pagine B4XPage.

Tutto molto complicato; meglio che ogni pagina B4XPage abbia il proprio oggetto B4XDrawer (a meno che LeftPanel non sia fisso, identico per ogni pagina esistente nel progetto).
 

udg

Expert
Licensed User
Longtime User
In quel caso specifico, il profilo utente determinava quali voci di menu attivare/disattivare (o anche mostrare/nascondere, non ricordo).
In ogni caso direi ci fosse una sola "button_click" legata al menu e poi, grazie ai tag, una serie di "case" determinavano cosa fare.
Se vuoi anche il layout sx poteva essere "unico"; bastava modificare al volo le label di ciascun tasto e il valore del tag e provvedere a nascondere i tasti inutilizzati per quel profilo. Intendo dire, un unico layout con (ad esempio) 10 tasti; per il profilo 1 ne mostri 4 (e li configuri al volo dopo il login) e ne oscuri 6; per il profilo 2 ne mostri 5 (e li configuri anche in modo molto diverso dal profilo 1) e ne oscuri 5.. e così via.
Oppure ragioni al contrario.
Il tasto1 cambia la label in funzione del profilo ma il tag resta quello (ad indicare la posizione relativa rispetto agli altri). Nella button_click avrai un "case" per il tasto in base al Sender e un "case" in funzione del profilo per decidere quale azione effettuare.
Ancora una.
Cambi la label del tasto in base al profilo e al click chiami la pagina corretta. Compito della pagina è eseguire il codice corretto per il profilo attivo.

Sicuramente si potrebbe pensare ad altre alternative, avendo in mente cosa si vuole fare. A me bastava nascondere le opzioni non disponibili ed essere pronto in un paio d'ore; ne avrei investito un'altra per la questione della classe, ma, come detto, ho perso interesse e sono passato ad altro.
 

LucaMs

Expert
Licensed User
Longtime User
come detto, ho perso interesse e sono passato ad altro.
Invece si dovrebbe ragionare un po' più a fondo sulle B4XPages per via della differenza sostanziale tra unico "oggetto visivo base" in B4A (Activity) e multiplo in B4J (Form) e al 99% in B4i, non avendolo non posso esserne certo al 100% e non so quale sia il suo tipo.
 

Elric

Well-Known Member
Licensed User
Iniziamo col chiamare le cose col loro nome, altrimenti ci perdiamo.

mdlDrawer, creato da te, precisamente è una Classe, non un Modulo di codice (*) (motivo per cui, tra l'altro, dargli quel nome, con quel prefisso "mdl" e dare alle sue istanze (oggetti) il prefisso "mod" è molto fuorviante).

(...)

(*) [Nota che un modulo di codice, oltre a non poter essere istanziato - ovvero creare oggetti da esso, "copie" diciamo, non può contenere-gestire eventi]
Per prima cosa: grazie, perché apprendo sempre cose nuove e la cosa non può che farmi piacere!

Tend(ev)o a chiamare le "classi" "moduli" perché indend(ev)o "modulo" la "scheda" dove scrivere il codice e perché la classe l'aggiungo dal menù "Project --> Add New Module --> Class Module" ma capisco che è fuorviante perché sarebbe bene identificare meglio le cose. Anzi, da qualche parte mi pare di aver letto che l'uso dei Moduli di codice è deprecato, ma non ricordando dove, non ci metto la mano sul fuoco.

(...)
Nel progetto ci sono 4 istanze (oggetti) della classe mdlDrawer, ognuna dichiarata privata ed initializzata in una classe B4XPage. La classe mdlDrawer ha un oggetto di tipo B4XDrawer e lo "espone", dato che è dichiarato Public.

Gli eventi associati alle B4XView della "parte sinistra" del Drawer vengono gestiti nella tua classe mdlDrawer perché è in questa che viene caricato il layout, il cui nome gli viene passato dall'interno di quelle 4 B4XPage.

Quindi:

quella è una regola, gli eventi delle view (o B4XView) devono stare nella classe in cui il layout viene caricato.
Ok, ma volevo solo limitarmi ad osservare che nell'ultimo esempio di klaus (quello che funziona) questo non è: gli eventi delle view centrali stanno nella classe B4XPage e non dove viene caricato il layout, ossia nella classe mdlDrawer. Posto che quindi è possibile, mi chiedevo se fosse più corretto parlare di best practice e code smell (visto che il codice funziona comunque) invece che di regola (ma mi rimetto a chi ne sa più di me).

@udg : Fare 2 drawer, uno per amministratore e uno per utente, era uno degli scenari a cui pensavo (credo di averne pensati 3 o 4...) quando mi sono chiesto se fosse possibile fare drawer differenti senza scrivere un drawer per ciascuna pagina. :)
 

LucaMs

Expert
Licensed User
Longtime User
Anzi, da qualche parte mi pare di aver letto che l'uso dei Moduli di codice è deprecato, ma non ricordando dove, non ci metto la mano sul fuoco.
No, sono utili, per metterci routine pubbliche di utilità per il progetto specifico o magari per qualunque progetto.
Ad esempio potresti creare i tuoi moduli che lavorino su stringhe (come StringUtils, che è una libreria ma la cui base sarà certamente un modulo di codice), o su DB, etc.
L'importante è ricordarsi che non possono contenere e tantomeno gestire eventi e che ne deve esistere un'unica copia.
 

klaus

Expert
Licensed User
Longtime User
Ok, ma volevo solo limitarmi ad osservare che nell'ultimo esempio di klaus (quello che funziona) questo non è: gli eventi delle view centrali stanno nella classe B4XPage e non dove viene caricato il layout, ossia nella classe mdlDrawer.
Just to clarify.
The events must be in the module where the layout is loaded.
In the project I posted in post #10, a Drawer instance is initialized in each Page.
The LeftPanel layout is loaded in the Drawer module and the Drawer events are managed there.
The CenterPanel layouts are loaded in each Page module and the Page events are managed there.
You cannot load the Page layouts in the Drawer module and manage the events in the Page module, this was the original problem.
 

Elric

Well-Known Member
Licensed User
Just to clarify.
The events must be in the module where the layout is loaded.
In the project I posted in post #10, a Drawer instance is initialized in each Page.
The LeftPanel layout is loaded in the Drawer module and the Drawer events are managed there.
The CenterPanel layouts are loaded in each Page module and the Page events are managed there.
You cannot load the Page layouts in the Drawer module and manage the events in the Page module, this was the original problem.
... e questo dimostra quanto sia lucido io...

Grazie mille per la precisazione. Ho proprio preso una cantonata (scusa LucaMs), probabilmente leggendo con troppa superficialità il codice di klaus.

Grazie mille a tutti!

... and this is the proof about how cleared headed I am...

Thank you to have specified. I've really got a goofy error (sorry LucaMs), probably I've red too superficially klaus' code.

Thank you so much to all!
 

klaus

Expert
Licensed User
Longtime User
Klaus, una domanda: cosa mangi?
Well, nothing really special, no special vitamins nor food supplements, but simply balanced food.
My wife is cooking and we prefer 'la cucina della mamma' rather than industrial food or fast food.
Then we drink each day our 'aperitivo' in the late after-noon, a glass of white wine and we drink red or white wine, depending on what we eat, with our diner, the main daily meal ;).
 

LucaMs

Expert
Licensed User
Longtime User
Pensa che oggi, non so perché, ma ho usato e scritto la parola "zusammen" (il poco tedesco che ho imparato, malgrado mia madre fosse di lingua tedesca - e malgrado lei fosse nata in Lussemburgo, lo imparai durante 3 vacanze in Germania, 40 anni fa, ma non certo tedesco scritto, piuttosto come un pappagallo).

Malgrado il suono 😁 è una bella parola, no?
 

Elric

Well-Known Member
Licensed User
Insomma, il segreto è bere vino dopo le 18 e aria fresca di montagna...

So, the secret is drinking wine after 6 pm and mountain pure air...
 
Top