Italian B4XPages - (scarso) Tutorial in italiano

LucaMs

Expert
Licensed User
Longtime User
Tra poco commenterò, scrivendo i motivi per cui te lo avevo chiesto.
spero di aver capito
Come detto, hai sicuramente creato un buon progetto.
Mancano i singoli oggetti persona (anche se sono accessibili tramite la mapPersone, dichiarata, inizializzata e riempita nel modulo di codice x).

Se lo avessi fatto come quello che ho allegato (aprilo e tienilo aperto davanti a te), avrei paragonato quella classe clsPersona ad una B4XPage e...
 

Fulvio75

Well-Known Member
Licensed User
Certo, è uguale nel senso che il funzionamento è lo stesso; l'organizzazione, la "pulizia" del progetto no.
Sto provando le pages, ho un problema con il BT che dichiarato in una Activity l'evento di ricezione dati va solo se aperta e visualizzata quella activity, in pages in teoria dovrebbe andare in tutte le pagine visualizzate
 

LucaMs

Expert
Licensed User
Longtime User
Sto provando le pages, ho un problema con il BT che dichiarato in una Activity l'evento di ricezione dati va solo se aperta e visualizzata quella activity, in pages in teoria dovrebbe andare in tutte le pagine visualizzate
Eh ma stai uscendo del tutto fuori tema!
Quella è una domanda che potresti pubblicare in un altro thread!
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Sto provando le pages, ho un problema con il BT che dichiarato in una Activity l'evento di ricezione dati va solo se aperta e visualizzata quella activity, in pages in teoria dovrebbe andare in tutte le pagine visualizzate
No, nemmeno con le B4XPages.
Non ho mai usato il BT, né so quale sia la libreria che usi. Suppongo che tu abbia un oggetto di "tipo BT" (qualcosa del genere), dichiarato ed inizializzato nella B4XMainPage; i suoi eventi verranno "scatenati" solo in quella pagina.

La cosa può diventare complicata, in questo caso, in quanto dovresti "delegare" l'evento, dalla B4XMainPage a quella correntemente visualizzata; ma peggio ancora con N Activity.

Cmq, devo ancora fare colazione, ergo vado e più tardi, non so bene quando, proverò a spiegarti il motivo per cui ti avevo chiesto di creare quel "normale" progetto B4A (usiamo il mio, in quanto non hai creato le singole variabili-oggetto, solo la map, ed hai aggiunto un modulo di codice che non era nelle mie richieste - utilissimo nel tuo progetto, eh!)
 

LucaMs

Expert
Licensed User
Longtime User
Sto provando le pages, ho un problema con il BT che dichiarato in una Activity l'evento di ricezione dati va solo se aperta e visualizzata quella activity, in pages in teoria dovrebbe andare in tutte le pagine visualizzate
Avevo riacceso (scocciatura riaccendere il router... lunga storia) solo per dire che, pur non avendo mai usato BT, né sapendo quale fosse la libreria, etc., suppongo che dovresti usare il servizio Starter.
Poi, cercando, ho trovato la libreria che penso tu stia usando e... anche un esempio di Erel di tipo B4XPages! (Che non ho provato e nemmeno scaricato... per ora).


P.S. In quel thread:

1699017979211.png



Ehm... solo che lo Starter è vuoto. Probabilmente perché il testo sopra lo scrisse prima di aggiornare il progetto alle B4XPages? Credo di sì (e non so come fosse con B4i, che non ha lo Starter!)
 

LucaMs

Expert
Licensed User
Longtime User
Nota su quel progetto (BlueTooth) B4XPages di Erel.

Il suo progetto ha solo la B4XMainPage, ma la cosa, nel tuo caso, Fulvio, si risolve "facilmente" (o quasi): ogni evento del "manager" (la variabile-oggetto di tipo BleManager2) deve "delegare" alla pagina correntemente visualizzata, ovvero chiamare un metodo (Sub pubblica) della pagina visualizzata.

Esempio di "delega" (vogliamo chiamarla "rinvio"? Si potrebbe, basta che non si pensi a "rinvio" come "esecuzione ritardata", ovvero come nel noto proverbio: "Mai rimandare a domani ciò che puoi rimandare a... dopodomani 😄. Beh, magari: "reindirizzamento"):
B4X:
Sub Manager_DataAvailable (ServiceId As String, Characteristics As Map)
    '***  Righe del progetto originale di Erel  ***
'    pbReadData.Hide
'    clv.Add(CreateServiceItem(ServiceId), "")
'    For Each id As String In Characteristics.Keys
'        clv.Add(CreateCharacteristicItem(id, Characteristics.Get(id)), "")
'    Next

'Delega - Viene chiamato il metodo (Sub pubblica), che IO ho scelto di denominare "DataAvailable" e potresti anche chiamare "Pippo", della pagina attualmente visualizzata.
    CallSubDelayed3(B4XPages.GetManager.GetTopPage.B4XPage, "DataAvailable", ServiceId, Characteristics)
End Sub
(NON testato!)

Quindi, nelle altre B4XPage, creerai quella Sub:
B4X:
Public Sub DataAvailable(ServiceId As String, Characteristics As Map)
' ...
End Sub
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Ecco, forse un'altra delle cose che fanno sembrare i progetti B4XPages ostici, potrebbe essere:

B4XPages.GetManager.GetTopPage.B4XPage
dove ha pescato quella riga @LucaMs?

Per i (pochi) che non lo sapessero, l'Editor aiuta molto (soprattutto se chi crea librerie commentasse sempre e bene i membri degli oggetti).
["Regola" generale, non specifica per le B4XPages: usare "punto" e tasto "TAB"]

1.gif
 

Sabotto

Active Member
Licensed User
Si ma non mischiamo le cose. Stavamo parlando dell'esempio della classe Persona fatta con Activity.
scusate eh... ma qui c'è gente che freme...
 

LucaMs

Expert
Licensed User
Longtime User
Stavamo parlando dell'esempio della classe Persona fatta con Activity.
Giusto per chiarire meglio.
Il progetto Persona realizzato in modo "standard", ovvero con Activity(ies) anziché con B4XPage(s) (pare che la grammatica italiana voglia che non si faccia il plurale; suppongo perché in italiano abbiamo gli articoli per singolare e plurale, "il" - "i", mentre in inglese è comunque "the". "Forse" sono fuori tema 😄) e con alcune classi.

Ho già bell'e dimenticato il motivo preciso per cui gli avevo chiesto di creare un tale progetto; vado a naso (e con TV acceso), quindi perdonate eventuali cose "scarsamente" intelligenti....
 

LucaMs

Expert
Licensed User
Longtime User
"Purtroppo" Fulvio non ha creato variabili-oggetto pubbliche, dalla classe (per il modo in cui ha realizzato la cosa, il progetto funzionerebbe ugualmente, eh).

Guardando la versione che ho allegato io, ci sono tre variabili-oggetto di tipo clsPersona, dichiarate come pubbliche nella Process_Globals dell'Activity Main.
Vengono inizializzate nell'Activity_Create (ed anche impostate le proprietà, cosa non indispensabile, ovviamente).

Viene dichiarata anche una Map, mapPersone, sempre pubblica e nello stesso posto. Anch'essa viene inizializzata nella Create e riempita con i tre oggetti Persona1, Persona2, Persona3.

Ecco, non c'è grande differenza tra quella classe più i 3 oggetti e le B4XPage (una differenza è che solitamente non si avranno 3 oggetti uguali, 3 pagine uguali; potremmo avere 3 variabili come quelle ma di tipi diversi, ovvero creati a partire da 3 classi-b4xpage diverse. E qui ho spiegato male!!! Ci riprovo, senza cancellare)

Così come scrivete (ho scritto) la classe clsPersona, dichiarata una variabile-oggetto Persona1, inizializzata ed aggiunta a mapPersone, la stessa cosa è creare una pagina: scrivi una classe B4XPage (che anziché clsPersona magari avrà nome pagProdotto, ma anche clsProdotto, volendo, solo che con prefisso "pag" si capisce meglio), crei una variabile-oggetto di quel tipo, di tipo pagProdotto, la inizializzi e la aggiungi; qui la differenza è che anziché ad una tua map, la aggiungi a B4XPages, che esiste "dietro le quinte".

Manca una sola cosa: una classe B4XPage contiene un panel (gli viene passato dall'ambiente di sviluppo, Root1, e nella classe useremo Root, che è una variabile-riferimento privata a quello stesso panel - è sempre una variabile-oggetto, perché tutte queste sono riferimenti ad oggetti).

Quindi, "tutta" quella roba l'ho dichiarata e inizializzata nell'Activity Main; in un progetto B4XPages lo avrei fatto nella B4XMainPage, come appena descritto.

Quanta differenza c'è, nello sviluppo? Niente o quasi. La differenza sta nei vantaggi dell'uso di pagine B4XPage rispetto alle Activity.
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Quanta differenza c'è, nello sviluppo? Niente o quasi. La differenza sta nei vantaggi dell'uso di pagine B4XPage rispetto alle Activity.
Invece no, ho veramente fatto troppa confusione!

Il progetto con le classi che ho allegato, sarebbe servito solo a dimostrare come scrivere classi, creare variabili-oggetto da queste classi ed aggiungere queste variabili, questi oggetti, ad una struttura (la mapPersone).

Creare pagine B4XPage è praticamente la stessa cosa, sì, questo è corretto, ma il punto è che si creeranno ed useranno queste variabili-oggetto-pagine "al posto" delle Activity. Era forse ovvio, ma non lo avevo scritto.

Quindi forse in un progetto "classico" avrei:

actLogin
actProdotti
actProdotto
actAcquisti
etc

mentre in un progetto B4XPages avrei le variabili-oggetto (non sono classi):

Login
Prodotti
Prodotto
Acquisti
etc

(meglio con un prefisso nel nome, che qui non ho scritto, per non confondere la classe-b4xpage pagProdotto cui accennavo prima, che è una classe (!), con l'oggetto creato a partire da quella classe. Io addirittura davo come prefisso alla classe-b4xpage "clspag", ovvero clspagProdotto, ed alla variabile-oggetto pagProdotto. Insomma, usate il prefisso che volete, che sia diverso per la classe e per la variabile-oggetto, in modo che sia più "leggibile")
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
clspagProdotto (la classe)
pagProdotto (la variabile-oggetto-pagina)

Quello che non mi piace è usare un prefisso di ben 6 caratteri ("clspag"), vorrei usarne sempre 3 (anche se non è obbligatorio).

Direi che pagProdotto vada bene. Per la classe, invece? cpg? clp? Direi cpgProdotto, che ne pensate?

P.S. Forse, facendo uno strappo alla "regola" (dei 3 caratteri), meglio cpagProdotto (la classe), pagProdotto l'oggetto (variabile).
 

Fulvio75

Well-Known Member
Licensed User
Appena ho un attimo ti dico del BT e come lo gestisco, comunque le classi BT e Connection sono in un modulo chiamato ELM327, in questo modulo ho appunto BT classe e Connection classe che inizializzo dentro la sub chiamata Initialize del modulo elm327.
Dalla Activity 🤣🤣🤣 principale chiamo elm327.initialize e si inizializzano BT e Connection e va tutto compresa la sub astream di Connection che restituisce i dati.
Però.... Se ho un'altra Activity aperta oltre alla precedente da dove non ho chiamato elm327.inizialize l'evento Astream che restituisce i dati non funziona più.
Devo provare con b4xpages quando ho tempo.
Per ovviare al problema solo per questa app uso i panel e ovvio così va tutto perché l Activity inizializzatrive e sempre aperta
 

LucaMs

Expert
Licensed User
Longtime User
Per ovviare al problema solo per questa app uso i panel e ovvio così va tutto perché l Activity inizializzatrive e sempre aperta
Appunto, e la stessa cosa sarebbe con le B4XPages, perché ognuna ha il proprio panel e stanno tutte sulla stessa Activity (Main).
La differenza principale è che usando N panel dovrai avere tutto il codice che ti serve in quell'Activity, mentre con le B4XPages avrai il vantaggio di suddividerlo a seconda delle funzionalità.
 
Top