Italian [B4XPages] Domande (sto passando tutto il progetto da B4A)

3uowiS

Active Member
Licensed User
Ciao a tutti, come consigliato da @LucaMs (che ovviamente aveva ragione) mi sono informato, ho visto vari tutorial e ci sono un sacco di vantaggi a usare B4XPages!
Quindi sto spostando tutto il progetto da B4A a B4XPages e ho già le prime domande, così ho aperto questo Thread per chiedervi aiuto sui dubbi che via via mi verranno.

Domanda 1) Considerando che l'app poi dovrà essere sia per Android che per Ios, le varie variabili che erano dichiarate come List, String, Int, Boolean possono/devono essere dichiarate come B4XView?

Domanda 2) Nella ActivityMain in B4A ho una Sub che richiamo in Activity Create che controlla se il file setting esiste, se esiste apre l'activity Login altrimenti l'activity Register.
Adesso con le B4XPages ho provato a fare la stessa cosa (ovviamente usando B4XPages.ShowPage al posto di StartActivity) ma non me le apre, visualizza solo la B4XMainPage, perché?

Grazie in anticipo
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Domanda 1) Considerando che l'app poi dovrà essere sia per Android che per Ios, le varie variabili che erano dichiarate come List, String, Int, Boolean possono tutte essere dichiarate come B4XView?
Le View dovresti dichiararle come B4XView, non altri tipi, come quelli che hai elencato.
Ricorda che in ogni momento puoi convertire, magari temporaneamente, da B4XView a View "nativa" e viceversa. Ad esempio, hai delle EditText ma le dichiari come B4XView (va fatto); se in un certo punto del programma hai bisogno di usare una proprietà o metodo specifico della EditText - che probabilmente non esiste in B4i, non lo so perché non ho B4i, scriverai qualcosa di questo tipo:
B4X:
Private MiaEditText As B4XView ' questo di base; fallo generare al Designer - Generate members.

' Se qui avessi la necessità di usare una proprietà o metodo specifico delle EditText...
Dim et As EditText = MiaEditText
'uso et.[NomeProprietà]
'uso et.[NomeMetodo]

' MiaEditText rimarrà una B4XView; et sarà solo una variabile di comodo, temporanea (locale alla routine)
 

LucaMs

Expert
Licensed User
Longtime User
Senza vedere dove e come tenti di visualizzare le altre due pagine (Login e Register) non è possibile darti una risposta.

Per vedere gli eventi che puoi usare...

 

3uowiS

Active Member
Licensed User
Ok, quindi B4XView devo usarlo solo con tutto ciò che metto nel designer. Grazie, adesso è chiaro!


Questo è il codice che avevo in B4A, ho solo usato B4XPages.ShowPage al posto di StartActivity ma evidentemente non è così che funziona...
B4X:
Sub FileManagement
        
    'contenuto di settings.txt
    ' 0 Lingua (it, es, en)
    ' 1 Username
    ' 2 Password
    ' 3 Email
        
    'contenuto di myroster.txt
    ' 0 Nome squadra
    ' 1-13 ID giocatori
    '14 TotalPlayers
    '15 TotalGen
    '16 TotalG
    '17 TotalF
    '18 TotalC
    '19 Salary Cap
        
    If File.Exists(File.DirInternal,"myBasketBet/settings.txt") Then     'SE IL FILE ESISTE
        Log("File esiste")
        lstSettingsList = File.ReadList(File.DirInternal,"myBasketBet/settings.txt")    'leggo i dati e li passo a SettingList
        For i = 0 To 9        'creo un ciclo per passare i dati da SettingList all'array Settings
            strSettings(i) = lstSettingsList.Get(i)
        Next
            
        If    strSettings(0) = "it" Then
            language = "it"
        Else If strSettings(0) = "es" Then
            language = "es"
        Else
            language = "en"
        End If
            
        lstMyRosterList = File.ReadList(File.DirInternal,"myBasketBet/myroster.txt")    'leggo i dati e li passo a MyRosterList
        For i = 0 To 19        'creo un ciclo per passare i dati da MyRosterList all'array MyRoster
            strMyRoster(i) = lstMyRosterList.Get(i)
        Next
            
        'carico le variabili con i valori salvati sul file
        TotalPlayers = lstMyRosterList.Get(14)
        TotalGen = lstMyRosterList.Get(15)
        TotalG = lstMyRosterList.Get(16)
        TotalF = lstMyRosterList.Get(17)
        TotalC = lstMyRosterList.Get(18)
        SalaryCap = lstMyRosterList.Get(19)
        loggedIn = True
        B4XPages.ShowPage("Login")    'avvio la pagina di login
        '-----------------------------------------------------------------------------------------------
    Else 'SE IL FILE NON ESISTE creo un ciclo per poi riempire gli slot di settings.txt con gli zeri
        Log("File non esiste")
        For i = 0 To 9
            strSettings(i) = "0"
        Next
            
        'creo la directory
        File.MakeDir(File.DirInternal, "myBasketBet")
        'scrivo il file nella directory
        File.WriteList(File.DirInternal, "myBasketBet/settings.txt", strSettings)
            
        'creo un altro ciclo per riempire gli slot di myroster.txt con gli zeri (tranne l'ultimo slot)
        For i = 0 To 18
            strMyRoster(i) = "0"
        Next
                            
        strMyRoster(19) = 250    'imposto il salary cap a 250

        'scrivo il file nella directory
        File.WriteList(File.DirInternal, "myBasketBet/myroster.txt", strMyRoster)
        loggedIn = True
        B4XPages.ShowPage("Register")    'avvio la pagina di registrazione
    End If       
End Sub
 

josejad

Expert
Licensed User
Longtime User

B4X:
Public Sub Initialize
    If KVS.ContainsKey("user") Then  'If we've logged before, go directly to PageData
        PageData.Initialize
        B4XPages.AddPage("Page Data", PageData)
        B4XPages.ShowPageAndRemovePreviousPages("Page Data")
        'To avoid loading B4XMainpage if you've logged (check https://www.b4x.com/android/forum/threads/b4xpages-how-to-quickly-load-a-b4xpage-without-showing-mainpage.127180/#post-796199)
    End If
End Sub

'This event will be called once, before the page becomes visible.
Private Sub B4XPage_Created (Root1 As B4XView)
    Root = Root1
    'If we are not logged, load the login layout and initialize PageData
    Root.LoadLayout("Login")
    If Not(PageData.isInitialized) Then
        PageData.Initialize
        B4XPages.AddPage("Page Data", PageData)
    End If
    
End Sub
 

LucaMs

Expert
Licensed User
Longtime User
Questo è il codice che avevo in B4A, ho solo usato B4XPages.ShowPage al posto di StartActivity ma evidentemente non è così che funziona...
Suppongo che tu abbia lasciato quella routine nell'Activity Main; questa dovresti lasciarla intatta, ovvero come è definita dal template dei progetti B4XPages.

Devi considerare la classe B4XMainPage come se fosse la "vecchia Activity Main"; ragionando in questo modo, il tutto ti diventerà automatico.

Public Sub Initialize
If KVS.ContainsKey("user") Then
'If we've logged before, go directly to PageData
PageData.Initialize
B4XPages.AddPage("Page Data", PageData)
Non condizionare la creazione e aggiunta alle B4XPages; meglio dichiarare tutte le pagine nella Class_Globals, come pubbliche, inizializzarle ed aggiungerle nella B4XPage_Created della B4XMainPage.
 

3uowiS

Active Member
Licensed User
No, quella routine l'ho messa in B4XMainPage sotto B4XPage_Created. La Main non l'ho toccata, mi ricordavo che me lo avevi detto in un altro post
 

3uowiS

Active Member
Licensed User
3) In B4XPage_Created devo inserire ciò che prima era inserito in Activity Create, giusto?

4) La sub Initialize che funzione ha? (inizializzare ok...ma in quali circostanze?)
 

LucaMs

Expert
Licensed User
Longtime User
No, quella routine l'ho messa in B4XMainPage sotto B4XPage_Created. La Main non l'ho toccata, mi ricordavo che me lo avevi detto in un altro post
allora righe come questa:
B4XPages.ShowPage("Register") 'avvio la pagina di registrazione
vanno bene, se però prima hai fatto ciò che è necessario per la pagina Register:

B4XMainPage
B4X:
Sub Class_Globals

#Region Pagine
    Public pagRegister As clspagRegister ' mettiamo che tu abbia creato la class B4XPage con questo nome, clspagRegister
#End Region

End Sub

Public Sub Initialize
    pagRegister.Initialize
End Sub

Private Sub B4XPage_Created (Root1 As B4XView)
    B4XPages.AddPage("pagRegister", pagRegister)
End Sub

poi per visualizzarla:
B4X:
B4XPages.ShowPage("pagRegister")
 

3uowiS

Active Member
Licensed User

Lo avevo fatto così: (l'unica cosa che vedo diversa dal tuo esempio è che non ho inizializzato sotto la sub Initialize)
B4X:
Sub Class_Globals
    Private Root As B4XView
    Private xui As XUI
    Dim RegisterPage As B4XRegisterPage        'dichiaro la pagina Register
    Dim LoginPage As B4XLoginPage            'dichiaro la pagina Login
    
    Dim language As String
    Dim lstSettingsList As List
    Dim lstMyRosterList As List
    Dim strSettings(10) As String
    Dim strMyRoster(20) As String
    Dim TotalGen As Int
    Dim TotalPlayers As Int
    Dim TotalG As Int
    Dim TotalF As Int
    Dim TotalC As Int
    Dim SalaryCap As Int
    Dim loggedIn As Boolean = False
End Sub

Public Sub Initialize
    
End Sub

'This event will be called once, before the page becomes visible.
Private Sub B4XPage_Created (Root1 As B4XView)
    Root = Root1
    Root.LoadLayout("classicmain")
    
    RegisterPage.Initialize        'inizializzo la pagina Register
    B4XPages.AddPage("Register", RegisterPage)    'aggiungo la pagina Login
    LoginPage.Initialize        'inizializzo la pagina Register
    B4XPages.AddPage("Login", LoginPage)    'aggiungo la pagina Login
    
    FileManagement
End Sub
 

3uowiS

Active Member
Licensed User
Grazie, adesso ho potuto vedere che in realtà la apre ma poi la richiude...infatti se premo il tasto Back sullo smartphone visualizzo la pagina login.

*** mainpage: B4XPage_Created
*** login: B4XPage_Created
*** login: B4XPage_Appear
*** login: B4XPage_Disappear [login]

Ma perché la chiude?
 

LucaMs

Expert
Licensed User
Longtime User
Più che chiuderla, credo che riporti in primo piano la B4XMainPage. Per questo motivo @José J. Aguilar ti suggeriva di usare:
B4XPages.ShowPageAndRemovePreviousPages
anziché il semplice
B4XPages.ShowPage.

E' una possibilità, anche se non ne vado matto. Altro modo sarebbe lanciare quella tua routine dall'interno della B4XMainPage_Appear, ad esempio.
Prova anche a lanciarla usando:
CallSubDelayed(Me, "FileManagement")
(nella B4XPage_Created)
benché forse non funzionerebbe perché... va beh, prova in quei 3 diversi modi.
 

3uowiS

Active Member
Licensed User
CallSubDelayed(Me, "FileManagement")
Perfetto! Invece così funziona! Sei un grande!

Altra domanda: le variabili da richiamare in più pagine, vanno dichiarate in Process_Globals nella Main (quella che non va toccata)? Mi sembrava di aver capito che uno dei vantaggi era di richiamare le variabili in ogni pagina, ma forse ho capito male.

Grazie ancora per tutti gli aiuti che mi dai!
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Sei un grande!
Vecchio, più che grande

Non confondere la ACTVITY MAIN con la CLASSE (e pagina B4XPage) B4XMainPage. La prima, normalmente non serve "toccarla" ed è meglio non farlo.

Puoi scegliere di dichiarare variabili pubbliche che debbano essere utilizzate in tutto il progetto:

a - in un modulo di codice (magari dagli un bel nome: modGlobals);
b - nella Class_Globals della B4XMainPage.
 

3uowiS

Active Member
Licensed User
Ho dichiarato "Public language As String" in Class_Globals di B4XMainPage ma in B4XLoginPage quando la uso mi da errore dicendo che non è dichiarata. Devo dichiararla con un qualche prefisso come facevo prima in B4A?
 

LucaMs

Expert
Licensed User
Longtime User
Ho dichiarato "Public language As String" in Class_Globals di B4XMainPage ma in B4XLoginPage quando la uso mi da errore dicendo che non è dichiarata. Devo dichiararla con un qualche prefisso come facevo prima in B4A?
Forse (questione di gusti?) sarebbe meglio in un bel modulo di codice, modGlobals.
In questo caso scriveresti:
modGlobals.MiaVariabile = ...

Dato che hai scelto quel posto:
B4XPages.MainPage.MiaVariabile =...
 
Cookies are required to use this site. You must accept them to continue using the site. Learn more…