Italian Problemino

GIS

Active Member
Licensed User
Credevo di aver risolto tutto invece .....
Mi spiego: una richiesta di dati dove l'utente si registra all '''app. Volevo controllare che e mail inserita dall'utente sia corretta. perciò l'utente finito di inserire i dati clicca sul botton e il codice memorizza i dati in un file. il problema nasce che io volevo far aprire un panel per richiedere il codice inviato via email ma il panel.visible = true non si trova nell Activity_create perciò il programma non si ferma nel editText. Ho anche visto che anche l'invio email deve essere nell activity_create per funzionare.
Suggerimenti?
Non so se mi sono spiegato bene.....
 
Last edited:

udg

Expert
Licensed User
Non so se ho compreso bene la dinamica che hai immaginato, ma direi che il problema non sia nell' Activity_Create.
Se la sequenza è:
1. l'app parte e controlla di non avere già un codice registrazione (file o db locale)
1a se c'è codice registrazione va a Login oppure direttamente alla fase attiva dell'app
1b se manca codice registrazione, mostra pannello in cui immettere dati identificativi e tasto "invia". Qui si può solo procedere con l'invio dei dati o con il termine dell'app.
Inviando i dati, il pannello di registrazione si oscura (o chiude) ed un nuovo pannellino chiede di immettere il codice registrazione ricevuto tramite mail e premere "prosegui/accedi..". Anche qui due opzioni: o immetti un codice registrazione valido oppure termini l'app.
2. Il server riceve i dati di registrazione, genera un codice univoco (ev. basato sui dati forniti) e lo trasmette tramite email all'utente
3. l'utente immette il codice ricevuto, il codice viene controllato e l'app passa alla fase successiva.

La creazione del pannello per l'immissione del codice ricevuto tramite mail va eseguita nel button_click del tasto "invia". In pratica, crei un pannello e lo aggiungi all'activity; in questo modo si sovrappone a quello visualizzato (da cui l'idea di un background oscurato al 100% o parzialmente. Dopo la creazione fai un requestfocus sull'unico edittext del secondo pannellino e attendi la pressione del suo button
Una volta che l'utente avrà immesso il codice e premuto il tatso del secondo pannello, potrai rimuovere da activity sia il secondo pannello che il primo (quello dei dati identificativi) e mostrare ciò che si vedrebbe se non ci fosse la fase di registrazione (o anche avviare una seconda activity chiudendo la prima).
 

GIS

Active Member
Licensed User
diciamo che come ragionamento ci sei ma la mia procedura è piu semplice. so che avrei dovuto mettere il codice sarebbe stato piu semplice capire ma non ho potuto. Adesso mi spiego meglio. Si apre l app e ci si trova nel login col botton per la per la registrazione. Una volta premuto il botton si passa ad un'altra activity_create con la sua maschera per l'inserimento dei dati richiesti(nome, cognome , e-mail ecc) una volta terminata la compilazione si preme il botton registrazione. A questo punto creo un numero random che mando all'email inserita nella registrazione e apro un panel per l'inserimento del codice inviato via email dopo di ché faccio la registrazione. Premetto che ovviamente faccio il controllo se l utente esiste già. Cmq il problema nasce che l'e-mail non viene spedita e il panel con edittext per l'inserimento del codice inviato via email si visualizza ma non si ferma ad attendere l'inserimento..... Il problema è questo... Ho provato che mettendo l'invio della email e il panel nell'activity_create funziona correttamente ma non è li che deve funzionare. Io nel mio piccolo ho anche pensato di passare i dati inseriti in una nuova Activity_creata con la sua maschera per far funzionare il tutto ma non mi piaceva preferivo il procedimento indicato all'inizio.
Dimmi cosa pensi....
 

GIS

Active Member
Licensed User
B4X:
#Region  Activity Attributes
    #FullScreen:  True
    #IncludeTitle:  False
#End Region

Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.

End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.
    
    Dim myImagine As Bitmap
    
    Private accountEmail As Label
    Private accountPassword As Label
    Private CodAzienda As Label
    Private Cognome As Label
    Private Nome As Label
    Private TitoloAccount As Label
    Private NumInterno As Label
    Private TitoloAccount As Label
    Private NumInterno As Label
    
    Private EditAzienda As EditText
    Private EditCognome As EditText
    Private EditEmail As EditText
    Private EditNome As EditText
    Private EditPassword As EditText       
    Private EditNumInterno As EditText
    Private OkRegistrazione As Button
    Private SfondoAccount As ImageView
    
    Private conferma As Button
    Private num As EditText
    Private tit As Label
    Private Panel1 As Panel
    
    Dim SMTP1 As SMTP
    Dim ListaRegistrati(100) As String
    Dim numVerifica As Long
    Dim inviata As Boolean
    
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    Activity.LoadLayout("Account")
    Panel1.Visible = False
    
    SetLabelSize(TitoloAccount,"REGISTRAZIONE")
    
    myImagine.Initialize(File.DirAssets,"Blue.png")
    OkRegistrazione.SetBackgroundImage(myImagine)

    myImagine.Initialize(File.DirAssets,"Blue.png")
    conferma.SetBackgroundImage(myImagine)
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub
Sub OkRegistrazione_Click   
    
    EditCognome.Text =  EditCognome.Text.ToUpperCase
    EditNome.Text =  EditNome.Text.ToUpperCase
    EditEmail.Text = EditEmail.Text.ToUpperCase
    
    numVerifica = Rnd(100000,999999)
    
    SalvaAccount(EditNome.Text, EditCognome.Text, EditNumInterno.Text, EditEmail.Text, EditPassword.text)
    
End Sub

Sub SalvaAccount( NomeReg As String, CognomeReg As String, NumInternoReg As String, EmailReg As String, PasswordReg As String)
    
        Dim List1 As List
        inviata = False
        
If EditAzienda.Text = "1234" Then   
    
        Sviluppatore.ftp.Initialize ("ftp","ftp.xxxxxxxxxx.org", 21 , "xxxxxxxxx", "xxxxxxxx")
        Sviluppatore.ftp.PassiveMode = True
        Sviluppatore.ftp.DownloadFile("/pizzagrifalapp/Registrazioni.txt", True, File.DirRootExternal,  "/pizza/Registrazioni.txt" )
        
    'If File.Exists(File.DirRootExternal,  "Pizza/Registrazioni.txt") Then
    
            List1 = File.ReadList(File.DirRootExternal, "Pizza/Registrazioni.txt")
                
                For ii = 0 To 99
                ListaRegistrati(ii) = List1.Get(ii)
                    
                Next
                    Dim trovato As Boolean
                    trovato = False
                        
                For i = 0 To 99
                    
                    ListaRegistrati(i) = List1.Get(i)
                    
                    Dim stringArray() As String = Regex.Split("\|",ListaRegistrati(i))
        
        
                 If ListaRegistrati(i) <> "0" Then
                Log(stringArray(3) & "    " & stringArray(4))
                
                         If stringArray(0) = NomeReg And stringArray(1) = CognomeReg   Then
                                              
                            
                                        Msgbox("Cognome e  Nome già Registrati!!!", "ERRORE!!")
                        
                                            Pulisce
                                            trovato =True
                            
                        
                          Else if stringArray(3) = EmailReg Then
                        
                                             Msgbox("E-mail già Registrata!!!", "ERRORE!!")
                        
                                               Pulisce
                                            trovato =True
                        
                        
                         End If
                        
                     Else         
                        
                        If inviata = False Then email
                        Panel1.Visible = True
                        
                                                        
                                       If trovato = False And ListaRegistrati(i) = "0" Then
                                                
                                            ListaRegistrati(i) = NomeReg & "|" & CognomeReg & "|" & NumInternoReg  & "|" & EmailReg  & "|" & PasswordReg
                        
                                            Log( NomeReg & "|" & CognomeReg & "|" & NumInternoReg  & "|" & EmailReg  & "|" & PasswordReg & "......." & i)
                                                trovato = True
                        
                                             'scrivo nel file
                                            File.WriteList(File.DirRootExternal, "Pizza/Registrazioni.txt", ListaRegistrati)
                        
                                            Sviluppatore.ftp.Initialize ("ftp","ftp.xxxxxxxx.org", 21 , "xxxxxx", "xxxxxxxxx")
                                            Sviluppatore.ftp.PassiveMode = True
                                              Sviluppatore.ftp.UpLoadFile(File.DirRootExternal,  "/pizza/Registrazioni.txt",True, "/pizzagrifalapp/Registrazioni.txt" )
                        
                                        
                                             Msgbox("Registrazione completata2", "")
                                             StartActivity(Main)
                                        End If
                        
                    End If   
                                        
                Next           
    trovato = False
    
Else   
     Pulisce
     Msgbox("Codice Azienda, Errato!!!", "ERRORE!!")
    
End If   
    
End Sub


Sub email
    
    'funziona per inviare e-mail
    SMTP1.Initialize("smtp.gmail.com", 465, "xxxxxxxx@gmail.com","xxxxxxxx","SMTP")
    SMTP1.UseSSL = True
    SMTP1.To.Add(EditEmail.Text)
    SMTP1.Subject = "Numero di verifica"
    SMTP1.Body = "Numero di verifica e-mail dell'app SPEEDY PIZZA" & "  " & numVerifica
    SMTP1.Send
    inviata = True
    
End Sub

Sub Pulisce
    
    EditAzienda.Text = ""
    EditCognome.Text = ""
    EditNome.Text =  ""
    EditNumInterno.Text =  ""
    EditPassword.text =  ""
    EditEmail.Text = ""
    
    
End Sub


'questo serve a modificare la grandezza del testo nella label
Sub SetLabelSize(lbl As Label, txt As String)
    Dim dt As Float
    Dim limit = 0.5 As Float
    Dim h As Int
  
    lbl.Text = txt
    lbl.TextSize = 72
    dt = lbl.TextSize
    h = Main.stu.MeasureMultilineTextHeight(lbl, txt)
    Do While dt > limit Or h > lbl.Height
        dt = dt / 2
        h = Main.stu.MeasureMultilineTextHeight(lbl, txt)
        If h > lbl.Height Then
            lbl.TextSize = lbl.TextSize - dt
            lbl.TextSize = lbl.TextSize - 1 'ho aggiunto questo meno 1 se no a volte la scritta era grande e non si leggeva
        Else
            lbl.TextSize = lbl.TextSize + dt
            lbl.TextSize = lbl.TextSize - 1 'ho aggiunto questo meno 1 se no a volte la scritta era grande e non si leggeva
        End If
    Loop
End Sub
    

'questo serve a modificare la grandezza del testo nel bottone
Sub SetButtonTextSize(lbl As Button, txt As String)
    Dim dt As Float
    Dim limit = 0.5 As Float
    ' Dim limit = 1 As Float
    Dim h As Int
  
    lbl.Text = txt
    lbl.TextSize = 72
    dt = lbl.TextSize
    h = Main.stu.MeasureMultilineTextHeight(lbl, txt)
    Do While dt > limit Or h > lbl.Height
        dt = dt / 2
        h =Main.stu.MeasureMultilineTextHeight(lbl, txt)
        If h > lbl.Height Then
            lbl.TextSize = lbl.TextSize - dt
            lbl.TextSize = lbl.TextSize - 2 'ho aggiunto questo meno 2 se no era grande e andava fuori dal bottone
        Else
            lbl.TextSize = lbl.TextSize + dt
            lbl.TextSize = lbl.TextSize - 2 'ho aggiunto questo meno 2 se no era grande e andava fuori dal bottone
        End If
    Loop
End Sub



Sub conferma_Click
    
    If numVerifica <> num.Text Then
        
        Msgbox("Verifica E-mail Errata!!!", "ERRORE!!")
        Activity.Finish
        
    End If
    
    
End Sub

il problema è on panel1.visible =true lo visualizza ma non si ferma ad attendere l inserimento nell edit text non riesco a capire perché
 

udg

Expert
Licensed User
Il primo vero problema è che non gestisci gli eventi dei componenti FTP e SMTP
Guarda la sua definizione: https://www.b4x.com/android/help/net.html#ftp
Hai DownloadComplete, ListComplete,...
Quindi, un bel WaitFor prima di proseguire con il codice e questo lo risolvi.

Simile per SMTP dove hai
Sub SMTP_MessageSent(Success As Boolean)
For ii = 0 To 99
A meno che la lista non sia sempre di 100 elementi, questo lo dovrestri sostituire con un loop while e ListaRegistrati() potrebbe divenire un List invece che un array.

Dim trovato As Boolean
trovato = False
'puoi cambiare in (più compatto ed ugualmente leggibile)
Dim trovato As Boolean = False
 
Last edited:

GIS

Active Member
Licensed User
Ok, intanto grazie. Seguirò il tuo consiglio per quanto riguarda la gestione dei SMTP e FTP qui non li avevo messi visto che i file veniva preso e mandato senza problemi ma in effetti non ci avevo pensato visto che il debug non mi da da errori.
A meno che la lista non sia sempre di 100 elementi, questo lo dovrestri sostituire con un loop while e ListaRegistrati() potrebbe divenire un List invece che un array
Questa app verrà usata al massimo da una 15na di persone essendo un'app interna all'azienda dove lavoro, è più un allenamento che faccio in B4A. Non è il massimo di flessibilità ma per il momento va bene cosi
Anche perché una volta messa on line comincerò a vedere come utilizzare mysql che è la cosa che mi interessa molto.
 

GIS

Active Member
Licensed User
Ciao,rimetto il codice dopo aver apportato delle modifiche come suggerito. Purtroppo il problema persiste... Il Panel1 si visualizza ma il programma continua ad andare avanti senza fermarmi. Se avete altre idea del perchè. grazie



B4X:
#Region  Activity Attributes
    #FullScreen:  True
    #IncludeTitle:  False
#End Region

Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.

End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.
   
    Dim myImagine As Bitmap
   
    Private accountEmail As Label
    Private accountPassword As Label
    Private CodAzienda As Label
    Private Cognome As Label
    Private Nome As Label
    Private TitoloAccount As Label
    Private NumInterno As Label
    Private TitoloAccount As Label
    Private NumInterno As Label
   
    Private EditAzienda As EditText
    Private EditCognome As EditText
    Private EditEmail As EditText
    Private EditNome As EditText
    Private EditPassword As EditText      
    Private EditNumInterno As EditText
    Private OkRegistrazione As Button
    Private SfondoAccount As ImageView
   
    Private conferma As Button
    Private num As EditText
    Private tit As Label
    Private Panel1 As Panel
   
    Dim SMTP1 As SMTP
    Dim ListaRegistrati(100) As String
    Dim numVerifica As Long
    Dim inviata As Boolean = False
   
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    Activity.LoadLayout("Account")
    Panel1.Visible = False
   
    SetLabelSize(TitoloAccount,"REGISTRAZIONE")
   
    myImagine.Initialize(File.DirAssets,"Blue.png")
    OkRegistrazione.SetBackgroundImage(myImagine)

    myImagine.Initialize(File.DirAssets,"Blue.png")
    conferma.SetBackgroundImage(myImagine)

   
   
   




End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub
Sub OkRegistrazione_Click  
   
   
   
   
    EditCognome.Text =  EditCognome.Text.ToUpperCase
    EditNome.Text =  EditNome.Text.ToUpperCase
    EditEmail.Text = EditEmail.Text.ToUpperCase
   
   
   
   
   
    numVerifica = Rnd(100000,999999)
   

   
   
    SalvaAccount(EditNome.Text, EditCognome.Text, EditNumInterno.Text, EditEmail.Text, EditPassword.text)

   
   
End Sub

Sub SalvaAccount( NomeReg As String, CognomeReg As String, NumInternoReg As String, EmailReg As String, PasswordReg As String)
   
        Dim List1 As List
       
       
If EditAzienda.Text = "1234" Then  
   
       
       
       
        If File.Exists(File.DirRootExternal,  "Pizza/Registrazioni.txt") Then
   
    Sviluppatore.ftp.Initialize ("ftp","ftp.xxxxxxxxxxxx.org", 21 , "xxxxxxxxxx", "xxxxxxxxxx")
        Sviluppatore.ftp.PassiveMode = True
        Dim sf As Object = Sviluppatore.ftp.DownloadFile("/pizzagrifalapp/Registrazioni.txt", True, File.DirRootExternal,  "/pizza/Registrazioni.txt" )
        Wait For (sf) FTP_DownloadCompleted (ServerPath As String, Success As Boolean)
            List1 = File.ReadList(File.DirRootExternal, "Pizza/Registrazioni.txt")
               
                For ii = 0 To 99
                ListaRegistrati(ii) = List1.Get(ii)
                   
                Next
                    Dim trovato As Boolean
                    trovato = False
                       
                For i = 0 To 99
                   
                    ListaRegistrati(i) = List1.Get(i)
                   
                    Dim stringArray() As String = Regex.Split("\|",ListaRegistrati(i))
       
       
                 If ListaRegistrati(i) <> "0" Then
                Log(stringArray(3) & "    " & stringArray(4))
               
                         If stringArray(0) = NomeReg And stringArray(1) = CognomeReg   Then
                                             
                           
                                        Msgbox("Cognome e  Nome già Registrati!!!", "ERRORE!!")
                       
                                            Pulisce
                                            trovato =True
                           
                       
                          Else if stringArray(3) = EmailReg Then
                       
                                             Msgbox("E-mail già Registrata!!!", "ERRORE!!")
                       
                                               Pulisce
                                            trovato =True
                       
                       
                         End If
                       
                     Else        
                       
                        If inviata = False Then email
                        OkRegistrazione.Visible = False

'xxxxxxxxxxxx il problema è qui xxxx

                           Panel1.Visible = True
                       
    'xxxxxxxxxxxxxxxxxxxx                    
                               
                                       If trovato = False And ListaRegistrati(i) = "0" Then
                                               
                                            ListaRegistrati(i) = NomeReg & "|" & CognomeReg & "|" & NumInternoReg  & "|" & EmailReg  & "|" & PasswordReg
                       
                                            Log( NomeReg & "|" & CognomeReg & "|" & NumInternoReg  & "|" & EmailReg  & "|" & PasswordReg & "......." & i)
                                                trovato = True
                       
                                             'scrivo nel file
                                            File.WriteList(File.DirRootExternal, "Pizza/Registrazioni.txt", ListaRegistrati)
                       
                                            Sviluppatore.ftp.Initialize ("ftp","ftpxxxxxxxxxxxxxxxxxx.org", 21 , "xxxxxxxxxxxxxx", "xxxxxxxxxxxxxxxxx")
                                            Sviluppatore.ftp.PassiveMode = True
              Dim sfu As Object = Sviluppatore.ftp.UpLoadFile(File.DirRootExternal,  "/pizza/Registrazioni.txt",True, "/pizzagrifalapp/Registrazioni.txt" )
                                                Wait For (sfu) FTP_UploadCompleted (ServerPath As String, Success As Boolean)
                                       
                                             Msgbox("Registrazione completata2", "")
                                             StartActivity(Main)
                                        End If
                       
                    End If  
                   
                '    Log(ListaRegistrati(i))
                '    Log(trovato)
                   
                Next          
    trovato = False
   
        Else ' se il file non esiste
   
            For i=0 To 99
               
                ListaRegistrati(i) = "0"
                               
            Next
       
            ListaRegistrati(0) = NomeReg & "|" & CognomeReg & "|" & NumInternoReg  & "|" & EmailReg  & "|" & PasswordReg
       
            'Crea la directory
            File.MakeDir(File.DirRootExternal, "Pizza")
           
            'scrivo nel file che se non c'è me lo crea
            File.WriteList(File.DirRootExternal, "Pizza/Registrazioni.txt", ListaRegistrati)
            Sviluppatore.ftp.Initialize ("ftp","xxxxxxxxxxxxxxxx.org", 21 , "xxxxxxxxxxxxxx", "xxxxxxxxxxxxxxxxxxxx")
            Sviluppatore.ftp.PassiveMode = True
            Dim sfu As Object = Sviluppatore.ftp.UpLoadFile(File.DirRootExternal,  "/pizza/Registrazioni.txt",True, "/pizzagrifalapp/Registrazioni.txt" )
            Wait For (sfu) FTP_UploadCompleted (ServerPath As String, Success As Boolean)
                                       
       
            Msgbox("Registrazione completata1", "")
            StartActivity(Main)
   
    End If
   
Else  
     Pulisce
     Msgbox("Codice Azienda, Errato!!!", "ERRORE!!")
   
   
End If  
   
End Sub


Sub email
   
    'funziona per inviare e-mail
    SMTP1.Initialize("smtp.gmail.com", 465, "xxxxxxxxxxxxxxxx@gmail.com","xxxxxxxxxxxxxx","SMTP")
    SMTP1.UseSSL = True
    SMTP1.To.Add(EditEmail.Text)
    SMTP1.Subject = "Numero di verifica"
    SMTP1.Body = "Numero di verifica e-mail dell'app SPEEDY PIZZA" & "  " & numVerifica
    SMTP1.Send
    inviata = True
   
End Sub

Sub Pulisce
   
    EditAzienda.Text = ""
    EditCognome.Text = ""
    EditNome.Text =  ""
    EditNumInterno.Text =  ""
    EditPassword.text =  ""
    EditEmail.Text = ""
   
   
End Sub

Sub FTP_UploadCompleted (ServerPath As String, Success As Boolean)
   
    Log(ServerPath & " UP Success=" & Success)
    If Success = False Then Log(LastException.Message)
   
End Sub

Sub FTP_DownloadCompleted (ServerPath As String, Success As Boolean)
   
    Log(ServerPath & " DOW Success=" & Success)
    If Success = False Then Log(LastException.Message)
   
End Sub

'questo serve a modificare la grandezza del testo nella label
Sub SetLabelSize(lbl As Label, txt As String)
    Dim dt As Float
    Dim limit = 0.5 As Float
    Dim h As Int
 
    lbl.Text = txt
    lbl.TextSize = 72
    dt = lbl.TextSize
    h = Main.stu.MeasureMultilineTextHeight(lbl, txt)
    Do While dt > limit Or h > lbl.Height
        dt = dt / 2
        h = Main.stu.MeasureMultilineTextHeight(lbl, txt)
        If h > lbl.Height Then
            lbl.TextSize = lbl.TextSize - dt
            lbl.TextSize = lbl.TextSize - 1 'ho aggiunto questo meno 1 se no a volte la scritta era grande e non si leggeva
        Else
            lbl.TextSize = lbl.TextSize + dt
            lbl.TextSize = lbl.TextSize - 1 'ho aggiunto questo meno 1 se no a volte la scritta era grande e non si leggeva
        End If
    Loop
End Sub
   

'questo serve a modificare la grandezza del testo nel bottone
Sub SetButtonTextSize(lbl As Button, txt As String)
    Dim dt As Float
    Dim limit = 0.5 As Float
    ' Dim limit = 1 As Float
    Dim h As Int
 
    lbl.Text = txt
    lbl.TextSize = 72
    dt = lbl.TextSize
    h = Main.stu.MeasureMultilineTextHeight(lbl, txt)
    Do While dt > limit Or h > lbl.Height
        dt = dt / 2
        h =Main.stu.MeasureMultilineTextHeight(lbl, txt)
        If h > lbl.Height Then
            lbl.TextSize = lbl.TextSize - dt
            lbl.TextSize = lbl.TextSize - 2 'ho aggiunto questo meno 2 se no era grande e andava fuori dal bottone
        Else
            lbl.TextSize = lbl.TextSize + dt
            lbl.TextSize = lbl.TextSize - 2 'ho aggiunto questo meno 2 se no era grande e andava fuori dal bottone
        End If
    Loop
End Sub



Sub conferma_Click
   
    If numVerifica <> num.Text Then
       
        Msgbox("Verifica E-mail Errata!!!", "ERRORE!!")
        Activity.Finish
       
    End If
   
   
End Sub
 
Last edited:

udg

Expert
Licensed User
Dopo i WaitFor fai un check sul boolean Success prima di proseguire. In caso di errore gestisci quello (in genere maiuscole/minuscole, errata digitazione di dir o file e cose del genere, ma anche timeout o problemi di rete). A quel punto puoi dedicarti alla questione Panel (se si verifica ancora; non ho controllato tutto il codice)
Ad occhio, ci vedo qualcosa che non torna negli IF concatenati; prova ad identarli correttamente per essere certo che seguano le tue intenzioni.
 
Last edited:

GIS

Active Member
Licensed User
il programma funzionava. poi ho voluto mettere il controllo della email e ho aggiunto il panel.... e da allora ho avuto problemi col panel aggiunto. per quanto riguarda il waitFor con annessi upload e download funzionano. l unica cosa su ho notato non passano dalla sub del uploadcomplete e downloadcomplete perché ciò messo un log ma non visualizza niente. Quello che non capisco come sia possibile... a meno che waitfor non funga. che palle sti problemi ti fanno perdere un botto di tempoooooooo
 

udg

Expert
Licensed User
Wait For (sf) FTP_DownloadCompleted (ServerPath As String, Success As Boolean)
Con un'istruzione scritta in questo modo NON va più nella procedura separata come accadeva prima che fosse introdotto il WaitFor, quindi ciò che vedi è normale.
In pratica è come se qui dicessi "non proseguire con il codice seguente se prima non hai ricevuto l'evento DownloadComplete).
Senza il WaitFor il codice proseguiva con le istruzioni successive e poi , in modo asincrono veniva eseguita la sub DownloadComplete dove decidevi cosa fare in funzione del risultato.
Diciamo che così hai maggior controllo.
 

GIS

Active Member
Licensed User
ciao. Stasera ho sistemato tutto. C'erano dei piccole inesattezze nei percorsi dei upload e download. Ho sistemato tutto ho eliminato un bel.po di codice che nn serviva. Cmq il problema rimane con sto cavolo di panel. ho provato a cambiarli nome a cancellare il panel e rifarlo. Ho provato a spostarlo in vari punti del listato ma il risultato non cambia. Sto cavolo di panel si visualizza ma il programma continua imperterrito fino alla fine. Assurdo mai capitato una cosa del genere. Non da errore da nessuna parte perciò non saprei come risolvere. Di solito ricevi degli errori e allora riesci a risolvere ma cosi per me è impossibile. Assurdo. cmq le sub del wait for e cioè
sub FTP_upLoadeCompleted
end sub
non ci andava percio ho.spostato il controllo della variabile success subito dopo con un bel ciclo if.... percio sono riuscito a capire che cerano degli errori nei percorsi..... adesso come ho detto all inizio funge tutto l'unico problema rimane il.panel.... Se mi dici riesci a guardarci al listato ti metto l'ultimo aggiornato
B4X:
#Region  Activity Attributes
    #FullScreen:  True
    #IncludeTitle:  False
#End Region

Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.

End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.
   
    Dim myImagine As Bitmap
   
    Private accountEmail As Label
    Private accountPassword As Label
    Private CodAzienda As Label
    Private Cognome As Label
    Private Nome As Label
    Private TitoloAccount As Label
    Private NumInterno As Label
    Private TitoloAccount As Label
    Private NumInterno As Label
   
    Private EditAzienda As EditText
    Private EditCognome As EditText
    Private EditEmail As EditText
    Private EditNome As EditText
    Private EditPassword As EditText      
    Private EditNumInterno As EditText
    Private OkRegistrazione As Button
    Private SfondoAccount As ImageView
   
    Private conferma As Button
    Private num As EditText
    Private tit As Label
    Private SfondoVerifica As Panel
   
    Dim SMTP1 As SMTP
    Dim ListaRegistrati(100) As String
    Dim numVerifica As Long
    Dim inviata As Boolean = False
   
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    Activity.LoadLayout("Account")
   
    SfondoVerifica.Visible = False
   
    SetLabelSize(TitoloAccount,"REGISTRAZIONE")
   
    myImagine.Initialize(File.DirAssets,"Blue.png")
    OkRegistrazione.SetBackgroundImage(myImagine)

   
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub
Sub OkRegistrazione_Click  
   
   
   
   
    EditCognome.Text =  EditCognome.Text.ToUpperCase
    EditNome.Text =  EditNome.Text.ToUpperCase
    EditEmail.Text = EditEmail.Text.ToUpperCase
   
   
   
   
   
    numVerifica = Rnd(100000,999999)
   
   
   
    SalvaAccount(EditNome.Text, EditCognome.Text, EditNumInterno.Text, EditEmail.Text, EditPassword.text)

   
   
End Sub

Sub SalvaAccount( NomeReg As String, CognomeReg As String, NumInternoReg As String, EmailReg As String, PasswordReg As String)
   
        Dim List1 As List
   
       
If EditAzienda.Text = "1234" Then  
   
       
       
       
          If File.Exists(File.DirRootExternal,  "Pizza") Then
             
            Else
                File.MakeDir(File.DirRootExternal, "Pizza")
         End If
           
           
    Sviluppatore.ftp.Initialize ("ftp","ftp.XXXXXXXXXXXXXXXXXX.org", 21 , "XXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXX")
        Sviluppatore.ftp.PassiveMode = True
        Dim sf As Object = Sviluppatore.ftp.DownloadFile("pizzagrifalapp/Registrazioni.txt", False, File.DirRootExternal,  "pizza/Registrazioni.txt" )
        Wait For (sf) FTP_DownloadCompleted (ServerPath As String, Success As Boolean)
        Log(ServerPath & " , Success=" & Success)
        If Success = False Then
            Log(LastException.Message)
            Msgbox("File non copiato sul cell", "")
        Else
            Msgbox("File copiato sul cell", "")
        End If
       
       
       
            List1 = File.ReadList(File.DirRootExternal, "Pizza/Registrazioni.txt")
               
                For ii = 0 To 99
                ListaRegistrati(ii) = List1.Get(ii)
                   
                Next
                    Dim trovato As Boolean
                    trovato = False
                       
                For i = 0 To 99
                   
                    ListaRegistrati(i) = List1.Get(i)
                   
                    Dim stringArray() As String = Regex.Split("\|",ListaRegistrati(i))
       
       
                 If ListaRegistrati(i) <> "0" Then
                'Log(stringArray(3) & "    " & stringArray(4))
               
                         If stringArray(0) = NomeReg And stringArray(1) = CognomeReg   Then
                                             
                           
                                        Msgbox("Cognome e  Nome già Registrati!!!", "ERRORE!!")
                       
                                            Pulisce
                                            trovato =True
                           
                       
                          Else if stringArray(3) = EmailReg Then
                       
                                             Msgbox("E-mail già Registrata!!!", "ERRORE!!")
                       
                                               Pulisce
                                            trovato =True
                       
                       
                         End If
                       
                     Else        
                       
                        If inviata = False Then email
                       
            'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
            'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX          
                                ' CODICE INCRIMINATO      
                       
                sfondoVerifica.Visible = True
               
            'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
            'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  
               
                        OkRegistrazione.Visible = False
                         
                       
                       
                               
                                       If trovato = False And ListaRegistrati(i) = "0" Then
                                               
                                            ListaRegistrati(i) = NomeReg & "|" & CognomeReg & "|" & NumInternoReg  & "|" & EmailReg  & "|" & PasswordReg
                       
                                           ' Log( NomeReg & "|" & CognomeReg & "|" & NumInternoReg  & "|" & EmailReg  & "|" & PasswordReg & "......." & i)
                                                trovato = True
                       
                                             'scrivo nel file
                                            File.WriteList(File.DirRootExternal, "Pizza/Registrazioni.txt", ListaRegistrati)
                       
                                            Sviluppatore.ftp.Initialize ("ftp","ftp.XXXXXXXXXXXXXXXXXX.org", 21 , "XXXXXXXXXXXXX", "XXXXXXXXXXXXXX")
                                            Sviluppatore.ftp.PassiveMode = True
              Dim sfu As Object = Sviluppatore.ftp.UpLoadFile(File.DirRootExternal,  "pizza/Registrazioni.txt",True, "pizzagrifalapp/Registrazioni.txt" )
                                                Wait For (sfu) FTP_UploadCompleted (ServerPath As String, Success As Boolean)
                    Log(ServerPath & " , Success=" & Success)
                    If Success = False Then
                        Log(LastException.Message)
                        Msgbox("File non copiato sul Server", "")
                    Else
                        Msgbox("File copiato sul Server", "")
                    End If
                                             Msgbox("Registrazione completata2", "")
                                             StartActivity(Main)
                                        End If
                       
                    End If  
                   
                '    Log(ListaRegistrati(i))
                '    Log(trovato)
                   
                Next          
    trovato = False
   

Else  
     Pulisce
     Msgbox("Codice Azienda, Errato!!!", "ERRORE!!")
   
   
End If  
    File.Delete(File.DirRootExternal, "pizza/Registrazioni.txt")
   
    SfondoVerifica.Visible = True
   
   
   
   
   
End Sub


Sub email
   
    'funziona per inviare e-mail
    SMTP1.Initialize("smtp.gmail.com", 465, "XXXXXXXXXX@gmail.com","XXXXXXXXX","SMTP")
    SMTP1.UseSSL = True
    SMTP1.To.Add(EditEmail.Text)
    SMTP1.Subject = "Numero di verifica"
    SMTP1.Body = "Numero di verifica e-mail dell'app SPEEDY PIZZA" & "  " & numVerifica
    Dim t as Object = SMTP1.Send
    inviata = True
   Wait For (t) Smtp_MessageSent (Success as Boolean)
Log("e-mail inviata =" & Success

If Success = False then
      Msgbox("Errore invio email","")
Else
       Msgbox("E-mail inviata")
End if

End Sub

Sub Pulisce
   
    EditAzienda.Text = ""
    EditCognome.Text = ""
    EditNome.Text =  ""
    EditNumInterno.Text =  ""
    EditPassword.text =  ""
    EditEmail.Text = ""
   
   
End Sub


'questo serve a modificare la grandezza del testo nella label
Sub SetLabelSize(lbl As Label, txt As String)
    Dim dt As Float
    Dim limit = 0.5 As Float
    Dim h As Int
 
    lbl.Text = txt
    lbl.TextSize = 72
    dt = lbl.TextSize
    h = Main.stu.MeasureMultilineTextHeight(lbl, txt)
    Do While dt > limit Or h > lbl.Height
        dt = dt / 2
        h = Main.stu.MeasureMultilineTextHeight(lbl, txt)
        If h > lbl.Height Then
            lbl.TextSize = lbl.TextSize - dt
            lbl.TextSize = lbl.TextSize - 1 'ho aggiunto questo meno 1 se no a volte la scritta era grande e non si leggeva
        Else
            lbl.TextSize = lbl.TextSize + dt
            lbl.TextSize = lbl.TextSize - 1 'ho aggiunto questo meno 1 se no a volte la scritta era grande e non si leggeva
        End If
    Loop
End Sub
   

'questo serve a modificare la grandezza del testo nel bottone
Sub SetButtonTextSize(lbl As Button, txt As String)
    Dim dt As Float
    Dim limit = 0.5 As Float
    ' Dim limit = 1 As Float
    Dim h As Int
 
    lbl.Text = txt
    lbl.TextSize = 72
    dt = lbl.TextSize
    h = Main.stu.MeasureMultilineTextHeight(lbl, txt)
    Do While dt > limit Or h > lbl.Height
        dt = dt / 2
        h =Main.stu.MeasureMultilineTextHeight(lbl, txt)
        If h > lbl.Height Then
            lbl.TextSize = lbl.TextSize - dt
            lbl.TextSize = lbl.TextSize - 2 'ho aggiunto questo meno 2 se no era grande e andava fuori dal bottone
        Else
            lbl.TextSize = lbl.TextSize + dt
            lbl.TextSize = lbl.TextSize - 2 'ho aggiunto questo meno 2 se no era grande e andava fuori dal bottone
        End If
    Loop
End Sub



Sub conferma_Click
   
    If numVerifica <> num.Text Then
       
        Msgbox("Verifica E-mail Errata!!!", "ERRORE!!")
        Activity.Finish
       
    End If
   
   
End Sub
 
Last edited:

udg

Expert
Licensed User
Sono in viaggio e non posso fare di meglio ora, ma aggiungi waitfor anche dopo smtp.send e gestisci lì l'evento messagesent. Appena potrò riguardero' il tutto. Ci sono imprecisioni e azioni duplicate, direi. Ma intanto con questa modifica vedrai che la situazione cambierà
 

GIS

Active Member
Licensed User
Dim t as Object = SMTP1.Send
inviata =
True
Wait For (t) Smtp_MessageSent (Success as Boolean)
Log("e-mail inviata =" & Success

If Success = False then
Msgbox("Errore invio email","")
Else
Msgbox("E-mail inviata")
End if
Aggiunto......
 

udg

Expert
Licensed User
Ho provato a risistemare un po' il codice utilizzando un editor (quindi non potevo provare nulla né verificare la correttezza 100% della sintassi..).
Ho cambiato il tipo di ListaRegistrazioni da array a List e poco altro, comuqnue ci sono diversi commenti.
Sub Globals
'These global variables will be redeclared each time the activity is created.
'These variables can only be accessed from this module.

Dim myImagine As Bitmap

Private accountEmail As Label
Private accountPassword As Label
Private CodAzienda As Label
Private Cognome As Label
Private Nome As Label
Private TitoloAccount As Label
Private NumInterno As Label
Private TitoloAccount As Label
Private NumInterno As Label

Private EditAzienda As EditText
Private EditCognome As EditText
Private EditEmail As EditText
Private EditNome As EditText
Private EditPassword As EditText
Private EditNumInterno As EditText
Private OkRegistrazione As Button
Private SfondoAccount As ImageView

Private conferma As Button
Private num As EditText
Private tit As Label
Private SfondoVerifica As Panel
Private Posizione As Int = -1

Dim SMTP1 As SMTP
Dim ListaRegistrati As List
Dim numVerifica As Long
Dim inviata As Boolean = False 'serve per evitare invii multipli? altrimenti si può eliminare
End Sub

Sub Activity_Create(FirstTime As Boolean)
'Do not forget to load the layout file created with the visual designer. For example:
Activity.LoadLayout("Account")
SfondoVerifica.Visible = False 'nasconde pannello verifica codice
'Prepara pannello registrazione
SetLabelSize(TitoloAccount,"REGISTRAZIONE")
myImagine.Initialize(File.DirAssets,"Blue.png")
OkRegistrazione.SetBackgroundImage(myImagine)
End Sub

Sub Activity_Resume
End Sub

Sub Activity_Pause (UserClosed As Boolean)
End Sub

'tasto conferma del pannello Registrazione
Sub OkRegistrazione_Click
EditCognome.Text = EditCognome.Text.ToUpperCase
EditNome.Text = EditNome.Text.ToUpperCase
EditEmail.Text = EditEmail.Text.ToUpperCase
If EditAzienda.Text <> "1234" Then
Pulisce
Msgbox("Codice Azienda, Errato!!!", "ERRORE!!")
EditCognome.requestfocus
Else
numVerifica = Rnd(100000,999999) 'può essere spostato dove serve, ovvero prima di invio mail
CheckAccount(EditNome.Text, EditCognome.Text, EditNumInterno.Text, EditEmail.Text, EditPassword.text)
End If
End Sub

'Ritorna True se trova Nome/Cognome oppure Email; altrimenti ritorna False
Sub CheckDatiReg(NomeReg As String, CognomeReg As String, Emailreg As String, Lst As List) As Boolean
For j = 0 To Lst.Size-1
Dim s1 As String = Lst.Get(j)
Dim stringArray() As String = Regex.Split("\|",s1)
If ((stringArray(0) = NomeReg) And (stringArray(1) = CognomeReg)) Then
Msgbox("Cognome e Nome già Registrati!!!", "ERRORE!!")
Pulisce
Return = True
Else if (stringArray(3) = Emailreg) Then
Msgbox("E-mail già Registrata!!!", "ERRORE!!")
Pulisce
Return = True
End If
Next
Return False
End Sub

'Ritorna prima posizione libera in ListaRegistrati; -1 se lista pina
Sub NextPlace (lst As List) As Int
For j = 0 To lst.Size-1
Dim s1 As String = lst.Get(j)
If s1 = "0" Then Return j
Next
Return -1
End Sub

'legge attuale lista utenti registrati da server, verifica che nuova registrazione sia effettivamente nuova
' ed in tal caso invia mail con codice di conefrma
Sub CheckAccount( NomeReg As String, CognomeReg As String, NumInternoReg As String, EmailReg As String, PasswordReg As String)
'crea dir temp; perché non in DirInternal?
If Not(File.Exists(File.DirRootExternal, "Pizza") Then File.MakeDir(File.DirRootExternal, "Pizza")
'preleva lista da server
Sviluppatore.ftp.Initialize ("ftp","ftp.XXXXXXXXXXXXXXXXXX.org", 21 , "XXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXX")
Sviluppatore.ftp.PassiveMode = True
Dim sf As Object = Sviluppatore.ftp.DownloadFile("pizzagrifalapp/Registrazioni.txt", False, File.DirRootExternal, "Pizza/Registrazioni.txt" )
Wait For (sf) FTP_DownloadCompleted (ServerPath As String, Success As Boolean)
Log(ServerPath & " , Success=" & Success)
If Success = False Then
Log(LastException.Message)
Msgbox("File non copiato sul cell", "")
Else
Msgbox("File copiato sul cell", "")
ListaRegistrati = File.ReadList(File.DirRootExternal, "Pizza/Registrazioni.txt")
Dim trovato As Boolean = CheckDatiReg(NomeReg, CognomeReg, EmailReg, ListaRegistrati)
'attenzione: assumiamo che in lista ci sia sempre spazio!!
If Not(trovato) Then
Posizione = NextPlace(ListaRegistrati) 'cerca posizione vuota in lista
If Posizione > -1 Then
'invia email con codice registrazione
If Not(inviata) Then
SMTP1.Initialize("smtp.gmail.com", 465, "XXXXXXXXXX@gmail.com","XXXXXXXXX","SMTP")
SMTP1.UseSSL = True
SMTP1.To.Add(EditEmail.Text)
SMTP1.Subject = "Numero di verifica"
SMTP1.Body = "Numero di verifica e-mail dell'app SPEEDY PIZZA" & " " & numVerifica
Dim t As Object = SMTP1.Send
Wait For (t) Smtp_MessageSent (Success As Boolean)
inviata = Success '"inviata" serve per evitare invii multipli?
Log("e-mail inviata =" & Success)
If Success = False Then Msgbox("Errore invio email","") Else Msgbox("E-mail inviata")
End If
OkRegistrazione.Visible = False 'nasconde primo pannello
SfondoVerifica.Visible = True 'mostra secondo pannello
Else
Log("lista piena!")
End If
Else
Log("utente esistente")
End If
End If
End Sub

'Utente ha ricevuto email ed immesso codice registrazione
Sub Conferma_Click
'check se il codice immesso è uguale a quello inviato; se OK salva dati su server e lancia Main
If numVerifica <> num.Text Then
Msgbox("Verifica E-mail Errata!!!", "ERRORE!!")
Activity.Finish
Else
Dim s2 As String = NomeReg & "|" & CognomeReg & "|" & NumInternoReg & "|" & EmailReg & "|" & PasswordReg
ListaRegistrati.set(Posizione, s2)
'scrivo nel file e aggiorno server
File.WriteList(File.DirRootExternal, "Pizza/Registrazioni.txt", ListaRegistrati)
Sviluppatore.ftp.Initialize ("ftp","ftp.XXXXXXXXXXXXXXXXXX.org", 21 , "XXXXXXXXXXXXX", "XXXXXXXXXXXXXX")
Sviluppatore.ftp.PassiveMode = True
Dim sfu As Object = Sviluppatore.ftp.UpLoadFile(File.DirRootExternal, "Pizza/Registrazioni.txt",True, "pizzagrifalapp/Registrazioni.txt" )
Wait For (sfu) FTP_UploadCompleted (ServerPath As String, Success As Boolean)
Log(ServerPath & " , Success=" & Success)
If Success = False Then
Log(LastException.Message)
Msgbox("File non copiato sul Server", "")
Else
Msgbox("File copiato sul Server", "")
End If
Msgbox("Registrazione completata2", "")
File.Delete(File.DirRootExternal, "Pizza/Registrazioni.txt") 'elimina file temporaneo
StartActivity(Main)
Activity.finish
End If
End Sub


Sub Pulisce
EditAzienda.Text = ""
EditCognome.Text = ""
EditNome.Text = ""
EditNumInterno.Text = ""
EditPassword.text = ""
EditEmail.Text = ""
End Sub
 
Last edited:
  • Like
Reactions: GIS

GIS

Active Member
Licensed User
ciao, grazie. Non chiedevo cosi tanto!!!!! Ho dovuto correggere qualche errorino fare due aggiunte, ma per il resto funziona!!!! Anche se in certi punti non ho capito come funziona ma per il momento non me lo chiedo, ci penserò un'altra volta. Cmq da come è scritto si vede che sei proprio esperto!!!! Tutto lineare.... Grazie non so come ringraziarti.... spero di potermi sdebitare un giorno .....
 

udg

Expert
Licensed User
Mi fa piacere che ora tutto funzioni e quando desideri posso illustrarti meglio i passaggi che non ti sono chiari.
Grazie non so come ringraziarti.... spero di potermi sdebitare un giorno .....
Un mio vecchio professore un giorno disse qualcosa del genere: "Lo farai aiutando qualcun altro così come io ho aiutato te"..se poi mi dovesse arrivare una inaspettata pizza margherita (o mi sto confondendo con un'altra app?)...

udg
 

GIS

Active Member
Licensed User
ahahahah ho in mente un'idea..... ma chissa se avro la fortuna di realizzarla nella mia breve esistenza......
Come si dice: chi vivrà, vedrà........
 

GIS

Active Member
Licensed User
ciao, ho visto adesso provando app nella parte che mi a sistemato ho visto che infondo appare, caricamento dati, ma dove cavolo l'hai messa che nemmeno con cerca la trovo? invisibile hahahah o forse l'ho messo io... non ricordo
 
Last edited:
Top