Italian Leggere un .txt e visualizzare a schermo

Luigi S

Active Member
Licensed User
Ciao,
apro questo nuovo post per separare le cose e non andare in confusione.

Per leggere il file di testo e fare una lista dei NameModel, su cui cliccando mi apre il NameModel in questione con i relativi Component, uso questo codice

B4X:
#Region  Project Attributes
    #ApplicationLabel: RC Hangar
    #VersionCode: 1
    #VersionName: 0.01
    'SupportedOrientations possible values: unspecified, landscape or portrait.
    #SupportedOrientations: portrait
    #CanInstallToExternalStorage: False
#End Region

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

Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
    'Private rp As RuntimePermissions
   
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.
    Private ListModelView As ListView
    Private addPlusButton As Button
       
    Dim ListModel(100) As String
   
    Type ListViewData (FirstRow As String, SecondRow As String, Picture As Bitmap)
   
    Private ModelViewPanel As Panel
    Private BackModelWiewButton As Button
       
    Dim ModelName As String
    Dim Component1 As String
    Dim Component2 As String
    Dim Component3 As String
    Dim Component4 As String
    Dim Component5 As String
    Dim Component6 As String

    Private ModelnameLabel As Label
    Private Component1Label As Label
    Private Component2Label As Label
    Private Component3Label As Label
    Private Component4Label As Label
    Private Component5Label As Label
    Private Component6Label As Label
   
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("Layout1")
    Activity.LoadLayout("Main")
    Activity.Title = "RC hangar - Models list"
   
'    LoadListModel 'Forse è meglio metterlo in Resume? da testare
   
   

   
    ToastMessageShow("if there are no models here, click on add model button",True)
    'MsgboxAsync("se non ci sono modelli inseriscili cliccando sul pulsante + in basso a destra", "Ecco il tuo Hangar")
End Sub

Sub Activity_Resume
    LoadListModel             'per ora sta in Create da testare
   
    ModelViewPanel.Visible = False
   
End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub



Sub addPlusButton_Click
    StartActivity(AggiungiModello)
End Sub

Sub LoadListModel
   
    ListModelView.Clear
   
    Dim List1 As List
   
    'controllo se esiste il file di testo
    If File.Exists(File.DirRootExternal, "RCHangar/ListModel.txt") Then
        'se il file esiste carico i dati dal file di testo
        List1 =File.ReadList(File.DirRootExternal, "RCHangar/ListModel.txt")
       
        Dim Bitmap1 As Bitmap
       
        For i = 0 To 99
           
            ListModel(i) = List1.Get(i)
            'creo un mini array con tutte le parti della riga esaminata
            Dim stringArray() As String = Regex.Split("\|",ListModel(i))
       
            If ListModel(i) <> "0" Then
           
                Dim lvd As ListViewData
                lvd.Initialize
           
                Bitmap1.Initialize(File.DirAssets, "planeApp.png")
           
                lvd.FirstRow = stringArray(0)
                lvd.SecondRow = "Efficiente/In Manutenzione" 'Lo implementerò successivamente con un boolean
                lvd.Picture = Bitmap1
           
                ListModelView.AddTwoLinesAndBitmap2(lvd.FirstRow,lvd.SecondRow,lvd.Picture, lvd)
                ' imposto i colori
                ListModelView.TwoLinesAndBitmap.Label.TextColor = Colors.RGB(0,0,0)
                ListModelView.TwoLinesAndBitmap.SecondLabel.TextColor = Colors.RGB(254,0,0)
           
                ListModelView.TwoLinesAndBitmap.ItemHeight = 80dip
           
           
           
            End If
       
        Next
       
    End If
   
End Sub

Sub ListModelView_ItemClick (Position As Int, Value As Object)
   
    addPlusButton.Visible = False
   
    Dim ListTemp As List
   
    'controllo se esiste il file di testo
    If File.Exists(File.DirRootExternal, "RCHangar/ListModel.txt") Then
        'se il file esiste carico i dati dal file di testo
        ListTemp =File.ReadList(File.DirRootExternal, "RCHangar/ListModel.txt")
       
    End If
   
    Dim stringTemp As String = ListTemp.Get(Position)
   
    Dim stringArray() As String = Regex.Split("\|",stringTemp)
   
    ModelName = stringArray(0)
    Component1 = stringArray(1)
    Component2 = stringArray(2)
    Component3 = stringArray(3)
    Component4 = stringArray(4)
    Component5 = stringArray(5)
    Component6 = stringArray(6)

    ModelViewPanel.Visible = True
   
    ModelnameLabel.Text = ModelName
    Component1Label.Text = Component1
    Component2Label.Text = Component2
    Component3Label.Text = Component3
    Component4Label.Text = Component4
    Component5Label.Text = Component5
    Component6Label.Text = Component6
End Sub


'Sub ListModelView_ItemClick (Position As Int, Value As Object)
'  
'    addPlusButton.Visible = False
'  
'    Dim ListTemp As List
'  
'    'controllo se esiste il file di testo
'    If File.Exists(File.DirRootExternal, "RCHangar/ListModel.txt") Then
'        'se il file esiste carico i dati dal file di testo
'        ListTemp =File.ReadList(File.DirRootExternal, "RCHangar/ListModel.txt")
'      
'    End If
'  
'    Dim stringTemp As String = ListTemp.Get(Position)
'  
'    Dim stringArray() As String = Regex.Split("\|",stringTemp)
'  
'    ModelName = stringArray(0)
'    If stringArray(0)<>("") Then
'        ModelnameLabel.Text = ModelName
'    Else
'        BackModelWiewButton_Click
'    End If
'  
'    Component1 = stringArray(1)
'    If stringArray(1)<>("") Then
'        Component1Label.Text = Component1
'        Else
'        Component1Label.Text = ""
'    End If
'  
'    Component2 = stringArray(2)
'    If stringArray(2)<>("") Then
'        Component2Label.Text = Component2
'    Else
'        Component2Label.Text = ""
'    End If
'      
'    Component3 = stringArray(3)
'    If stringArray(3)<>("") Then
'        Component3Label.Text = Component3
'    Else
'        Component3Label.Text = ""
'    End If
'      
'    Component4 = stringArray(4)
'    If stringArray(4)<>("") Then
'        Component4Label.Text = Component4
'    Else
'        Component4Label.Text = ""
'    End If
'      
'    Component5 = stringArray(5)
'    If stringArray(5)<>("") Then
'        Component5Label.Text = Component5
'    Else
'        Component5Label.Text = ""
'    End If
'      
'    Component6 = stringArray(6)
'    If stringArray(6)<>("") Then
'        Component6Label.Text = Component6
'    Else
'        Component6Label.Text = ""
'    End If
'
'
'    ModelViewPanel.Visible = True
'  
'
'End Sub



Sub BackModelWiewButton_Click
    ModelViewPanel.Visible = False
    addPlusButton.Visible = True
End Sub

Questo crasha quando clicco su di un NameModel che non possiede tutti i campi compilati.
Commentata c'è una Sub ListModelView_ItemClick con cui ho tentato di ovviare al problema, ma la mia logica non ha dato frutti Crasha comunque.
 

Sagenut

Expert
Licensed User
Longtime User
Quale riga provoca l'errore?
Quale errore ti dà?
Se vuoi riprovare con l'altra Sub modifica i vari
B4X:
If stringArray(0)<>("") Then
in
B4X:
If stringArray(0)<>"" Then
 

Luigi S

Active Member
Licensed User
Questo è lerrore della prima sub

B4X:
*** Service (starter) Create ***
** Service (starter) Start **
** Activity (main) Create, isFirst = true **
** Activity (main) Resume **
main_listmodelview_itemclick (java line: 482)
java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
    at org.tuttovola.RCHangar.main._listmodelview_itemclick(main.java:482)
    at java.lang.reflect.Method.invoke(Native Method)
    at anywheresoftware.b4a.BA.raiseEvent2(BA.java:196)
    at anywheresoftware.b4a.BA$1.run(BA.java:335)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)


Questo è lerrore che dà la seconda sub in cui ho aggiunto il ciclo if

B4X:
*** Service (starter) Create ***
** Service (starter) Start **
** Activity (main) Create, isFirst = true **
** Activity (main) Resume **
main_listmodelview_itemclick (java line: 490)
java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
    at org.tuttovola.RCHangar.main._listmodelview_itemclick(main.java:490)
    at java.lang.reflect.Method.invoke(Native Method)
    at anywheresoftware.b4a.BA.raiseEvent2(BA.java:196)
    at anywheresoftware.b4a.BA$1.run(BA.java:335)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

ma ripeto, succede solo se clicco su di un NameModel a cui non sono riempiti tutti i component
 

Sagenut

Expert
Licensed User
Longtime User
Per risolvere devi mettere uno spazio tra i segni di separazione.
Quindi le stringhe vuote devono essere
B4X:
stringa = " | | | | | | "
o comunque i valori nulli devono essere uno Spazio.
Dovrai trasformare i valori "" in " " in fase di salvataggio.

P.S.= Il perchè di tutto ciò non te lo sò spiegare al momento.
 
Last edited:

Luigi S

Active Member
Licensed User
Si il problema è proprio quello, anche se in realtà non è bastato, ho dovuto aggiungere un | alla fine cosi

B4X:
ListModel.set(i,ModelName.Text &" |"& Component1.text &" |"& Component2.text &" |"& Component3.text &" |"& Component4.text &" |"& Component5.text &" |"& Component6.text &" |")

in questo modo anche se non scrivi nulla in nessun campo no crasha e questo per me è sufficiente, tanto dovrò implementare il "Delete" per cancellare completamente la riga.

Grazie mille!
 
Top