Spanish Cargar archivo txt en List

Matias.Ariel

New Member
Hola foreros, soy Matias de Buenos Aires y estoy realizando mi primer aplicacion en B4A.
Es una aplicacion para solucionarle un poco el trabajo a mi padre. Estuve leyendo muchos post de este foro y tutoriales que econtre por internet y pude avanzar muchisimo con esta aplicacion.
Sólo tengo un problema, ésta aplicacion tiene un List del Type que declare y necesito que se mantenga la informacion en esta lista por mas que se apague el celular. Lo que pense fue crear un archivo de texto con esta lista con cada modificacion que se realice y que al comenzar a correr la aplicacion se cargue la lista con este archivo. No entiendo por que no puedo levantar este archivo en la lista al comienzo.

El codigo que estoy utilizando es el siguiente:

B4X:
Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.

    Type productop(nombre As String,cant1 As Float, obs1 As String, cant2 As Float, obs2 As String, cant3 As Float, obs3 As String, cant4 As Float, obs4 As String, cant5 As Float, obs5 As String, cant6 As Float, obs6 As String)
    Dim ListaTotal As List
    Dim ListViewP As ListView
   
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("LayoutMenu")
    Activity.LoadLayout("LayoutMenuChico")
   
    ListaTotal.Initialize
   
    File.OpenInput(File.DirDefaultExternal, "memoria.txt")
   
    Try
        ListaTotal = File.ReadList(File.DirDefaultExternal, "memoria.txt")
    Catch
        ToastMessageShow("Error al cargar memo",True)
    End Try

Sub GrabarMemo
    File.WriteList(File.DirDefaultExternal, "memoria.txt", ListaTotal)
End Sub

Sub InsertarEnLista(prod As String, cant As Float, obs As String,suc As Int)
   
    Dim pos As Int
    Dim registrop As productop
    Dim registrofinal As productop
    pos = -99
   
    If ListaTotal.Size > 0 Then
        registrop.Initialize
        For i = 0 To  ListaTotal.Size - 1
            registrop = ListaTotal.Get(i)
            If prod = registrop.nombre Then
              registrofinal.Initialize
              registrofinal = registrop
              pos = i
            End If
        Next
    End If
       
    If pos <> -99 Then
   
        If suc = 1 Then
            registrofinal.cant1 = cant
            registrofinal.obs1 = obs
            ListaTotal.Set(pos,registrofinal)
        Else If suc = 2 Then
            registrofinal.cant2 = cant
            registrofinal.obs2 = obs
            ListaTotal.Set(pos,registrofinal)
        Else If suc = 3 Then
            registrofinal.cant3 = cant
            registrofinal.obs3 = obs
            ListaTotal.Set(pos,registrofinal)
        Else If suc = 4 Then
            registrofinal.cant4 = cant
            registrofinal.obs4 = obs
            ListaTotal.Set(pos,registrofinal)
        Else If suc = 5 Then
            registrofinal.cant5 = cant
            registrofinal.obs5 = obs
            ListaTotal.Set(pos,registrofinal)
        Else If suc = 6 Then
            registrofinal.cant6 = cant
            registrofinal.obs6 = obs
            ListaTotal.Set(pos,registrofinal)
        End If
       
    Else 
   
        registrofinal.nombre = prod
        registrofinal.cant1 = 0
        registrofinal.obs1 = ""
        registrofinal.cant2 = 0
        registrofinal.obs2 = ""
        registrofinal.cant3 = 0
        registrofinal.obs3 = ""
        registrofinal.cant4 = 0
        registrofinal.obs4 = ""
        registrofinal.cant5 = 0
        registrofinal.obs5 = ""
        registrofinal.cant6 = 0
        registrofinal.obs6 = ""

        If suc = 1 Then
            registrofinal.cant1 = cant
            registrofinal.obs1 = obs
            ListaTotal.Add(registrofinal)
        Else If suc = 2 Then
            registrofinal.cant2 = cant
            registrofinal.obs2 = obs
            ListaTotal.Add(registrofinal)
        Else If suc = 3 Then
            registrofinal.cant3 = cant
            registrofinal.obs3 = obs
            ListaTotal.Add(registrofinal)
        Else If suc = 4 Then
            registrofinal.cant4 = cant
            registrofinal.obs4 = obs
            ListaTotal.Add(registrofinal)
        Else If suc = 5 Then
            registrofinal.cant5 = cant
            registrofinal.obs5 = obs
            ListaTotal.Add(registrofinal)
        Else If suc = 6 Then
            registrofinal.cant6 = cant
            registrofinal.obs6 = obs
            ListaTotal.Add(registrofinal)   
        End If
       
        ListaTotal.SortType("nombre",True)
       
    End If
   
End Sub

Con este codigo el archivo "memoria.txt" se crea bien, tiene un formato raro con [ ] y cada campo correspondiente al Type que estrableci.
El problema es que al querer levantar el mismo archivo me da un error que no se bien que significa.
Estoy mostrando las partes del codigo que creo son utiles para resolver el problema, si me esta faltando algo por favor me dicen.

PD: Capaz es posible mantener la informacion del List sin hacer todo esto de crear el archivo txt y no se como se hace, si alguien sabe eso podria reemplazar este sistema.

Desde ya les agradezco mucho que me ayuden con este tema puntual para terminar mi aplicaciñon.
Saludos!
 

thader2012

Member
Licensed User
Longtime User
Hola

La lista que usas no almacena texto, almacena una variable de tipo productop, los métodos que usas no son válidos para realizar esa operación debes activar la librería RandomAcessFile(1.51) .

Debes crear una variable para guardar los datos de tipo RandomAccessFile y usar los metodos WriteObject y ReadObject en vez de writeList y ReadList. Esa variable funciona de forma parecida al objeto FILE, exceptuando que hay que inicializarla.

B4X:
Dim f as RandomAccessFile
......
' se inicializa
f.Initialize(Directorio,nombrefichero,False)
.....
'donde se guarda
f.WriteObject(lista,False,0)
f.close
 
Last edited:
Top