Italian Lettura singola riga

Luigi2800

Member
Salve a tutti.
Vorrei leggere una sola riga, diciamo un solo carattere e in base a questo settare una variabile.
Ho un file tipo questo:
B4X:
LOGO2MENU=0
[...]
S2W=0

vorrei settare una variabile, ad esempio S2W e leggere quello che c'è dopo l'uguale, in questo caso 0. Quindi la variabile diventa S2W="Attivo".
Non so se mi spiego...
Grazie
 

LucaMs

Expert
Licensed User
Longtime User
Beh, non proprio chiarissimo :).

Hai un file di testo e vorresti leggere solo una riga di quel file? Se è così, non mi sembra sia possibile.
Puoi leggere tutto il file e cercare la riga che ti serve.

Ci sono diversi modi per farlo:

File.GetText
File.ReadString
File.OpenInput
(puoi guardare l'help che compare dopo il punto o il manuale pdf per i Beginner che trovi qui)

Se poi ci spieghi meglio non il dettaglio, ma lo scopo generale, magari potremo darti qualche consiglio migliore.
 

Luigi2800

Member
Voglio creare un'app per configurare il kernel.
Il kernel, al momento dell'installazione (tramite AROMA) crea un file con delle impostazioni (/system/etc/elementalx.conf). Questo file, contiene tutte le proprietà del kernel, scritte in questa forma:
LOGO2MENU=0
0-disattivato,1-attivato
Io vorrei leggere quello che c'è dopo LOGO2MENU=, cioè 0. Se quello che legge è uguale a 0, allora nel msgbox esce scritto Logo2Menu disattivato, se dopo l'uguale c'è 1, allora nel msgbox esce Logo2Menu attivato.
Spero di essere stato chiaro
Grazie
 

Luigi2800

Member
Cerco di spiegarmi meglio...
La mia app ha un tabhost iniziale, dove sono mostrate le info generali dell'app nella prima tab e nella seconda, la configurazione.
Attualmente ho 2 pulsanti: uno che mostra in un msgbox il file /system/etc/elementalx.conf per intero, l'altro permette di configurarlo.
Il 2° pulsante, apre un'altra attività con un nuovo tab host. Qui ci sono 3 tab: Display, GPU, Varie. in ogni tab c'è un'atlro tabhost.
Nella tab display ci sono le tab: S2W, DT2W e L2M.
Voglio che legga nel file, dopo la voce SWEEP2WAKE= che numero ci sia scritto, e a seconda del numero, impostare una stringa nello spinner
 

LucaMs

Expert
Licensed User
Longtime User
Così?
B4X:
Dim TuaDir As String = ?
Dim TuoNomeFile As String = ?
Dim Voce As String = LeggiVoce(TuaDir, TuoNomeFile, "SWEEP2WAKE")
Log("Voce = " & Voce)

Sub LeggiVoce(Dir As String, FileName As String, Voce As String) As String
    Dim lstTesto As List = File.ReadList(Dir, FileName)
    Dim Riga As String
   
    For i = 0 To lstTesto.Size - 1
        Riga = lstTesto.Get(i)
        If Riga.StartsWith(Voce) Then
            Return Riga.SubString(Riga.IndexOf("=") + 1 )
        End If
    Next
   
    Return ""
End Sub
 

Luigi2800

Member
Esatto :D
Solo che dovrei farlo per più voci...e in base alla variabile Voce, settare nello spinner adatto.
Esempio: la voce è 0, nello spinner ci sarà Attivo, e oltre ad attivo, anche "disattiva" e "solo spegnimento".
Si può fare ?
E si può applicare lo stesso metodo per la scrittura del file ?
Grazie mille
Edit:
Vorrei settare la variabile S2W come stringa e applicargli il valore restituita da Voce.
Questo è il mio codice:
B4X:
Sub Process_Globals
    Dim TuaDir As String = "/system/etc/"
    Dim TuoNomeFile As String = "elementalx.conf"
    Dim Voce As String = LeggiVoce(TuaDir, TuoNomeFile, "LOGO2MENU")
    Dim L2M As String
    If Voce=0 Then
        S2W="L2M: Disattivato"
    Else If Voce=1 Then
        S2W="L2M: Attivato"
    End If   
    Dim Voce As String = LeggiVoce(TuaDir, TuoNomeFile, "SWEEP2WAKE")
    Dim S2W As String
    If Voce=0 Then
        S2W="S2W: Disattivato"
    Else If Voce=1 Then
        S2W="S2W: Attivato"
    Else
        S2W="S2W: Solo spegnimento"
    End If
però, la Sub LeggiVoce, mi dà l'errore:
B4X:
Parsing code.                          Error
Error parsing program.
Error description: Parameter name cannot hide global variable name.
Occurred on line: 169
Sub LeggiVoce(Dir As String, FileName As String, Voce As String) As String
 
Last edited:
D

Deleted member 103

Guest
L'errore significa che non puoi inserire come Parametro nell "Sub LeggiVoce"" una variable globale.

Se ho capito bene quello che vuoi fare tu, allora io farei così:
B4X:
Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.

    Dim TuaDir As String = "/system/etc/"
    Dim TuoNomeFile As String = "elementalx.conf"
    Dim Voce As String
    Dim L2M As String
    Dim S2W As String
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.

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")

    Voce = LeggiVoce(TuaDir, TuoNomeFile, "LOGO2MENU")
    If Voce=0 Then
        L2M ="L2M: Disattivato"
    Else If Voce=1 Then
        L2M ="L2M: Attivato"
    End If
   
    Voce= LeggiVoce(TuaDir, TuoNomeFile, "SWEEP2WAKE")
    If Voce=0 Then
        S2W="S2W: Disattivato"
    Else If Voce=1 Then
        S2W="S2W: Attivato"
    Else
        S2W="S2W: Solo spegnimento"
    End If
End Sub

Sub LeggiVoce(Dir As String, FileName As String, Voce1 As String) As String
    '....
End Sub
 

udg

Expert
Licensed User
Longtime User
Ciao a tutti,

no credete che in un caso come questo lo strumento più adatto sia una map?
Lo chiedo perchè mi sembra di capire che parliate di coppie chiave-valore e nella presentazione dell'oggetto map si fa esplicito riferimento ai settaggi di una app se posti in tale forma.

Umberto
 

udg

Expert
Licensed User
Longtime User
Non l'ho ancora mai utilizzata, ma sembra una soluzione ottimale.
A che serve (o in che contesto si usa) StateManager.SaveSettings?
Vedo che ogni SetSetting() è autonomo nel registrare il suo valore ed esplicitamenete si dice che è inutile farlo seguire da un SaveSettings, quindi quando dovrei usare la versione generica?
 

LucaMs

Expert
Licensed User
Longtime User
Ora non la ricordo di preciso. Sembra anche a me che la descrizione dica che non sia necessario salvare il tutto, dopo aver cambiato un valore, ma, se non ricordo male, il salvataggio effettivo su file avviene solo con SaveSettings.

Probabilmente, intende dire che il valore diventa effettivo per il programma in esecuzione, ma al termine di questa, si deve fare un salvataggio.

(guardo il codice della classe e poi ti do conferma)
 

LucaMs

Expert
Licensed User
Longtime User
Sì, confermo. Se usi soltanto SetSetting, il valore lo puoi rileggere subito in un'altra parte del codice con GetSetting, ma perché si trova nella map, non ancora su disco. Quindi, almeno al termine dell'app, devi salvare.

La descrizione intende dire che non è necessario salvare OGNI volta col comando SaveSettings, ma una sì, alla fine.
 

udg

Expert
Licensed User
Longtime User
Ok, grazie.
Ora ha senso.
 
Top