Ein INI-Datei erstellen Basic4Android

  • Antworten:30
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 178

27.11.2012 00:05:58 via Website

Hallo,

ist es mit Basic4Android möglich, im Smartphone eine INI-Datei anzulegen, dies zu schreiben und lesen?
wäre nett wenn mir jemand da ne Beispiel zeigen würde.

Ich rede nicht von eine TXT-Datei :)

Gruß
Frank

— geändert am 27.11.2012 00:07:10

grüße aus Mittelfranken

  • Forum-Beiträge: 33.139

27.11.2012 06:02:50 via App

Was unterscheidet denn Deine Ini-Datei von einer Textdatei?

Herzliche Grüße

Carsten

Ich komm' mir langsam vor wie jemand, der ich bin // #cäthe

  • Forum-Beiträge: 178

27.11.2012 08:36:34 via Website

Hi Carsten,

bei der INI-Datei kann man sehr einfach Zeilen auslesen und Schreiben

Deklaration:
1Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
2Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long

Variable:
1Dim x As String

Ins INI_Datei schreiben
1x = WriteINI(Dateiname$, "Stadtauswahl", "Stadt", ComboBox.Text)


Funktionsaufruf:
1Private Function WriteINI(Dateiname As String, DieSektion As String, _
2 DerEintrag As String, Wert As String) As Long
3 WriteINI = WritePrivateProfileString(DieSektion, DerEintrag, _
4 Wert, Dateiname)
5End Function


Und so sieht dann die Zeile in der INI Datei aus.
1[Stadtauswahl]
2Stadt=Berlin

Beim Lesen und Schreiben wird immer als erstes nach den Schlüsselwörtern in der eckigen Klamern gesucht und die Zeile dadrunter dann entweder beim schreiben überschrieben oder beim Lesen, gelesen.

das kann man mit einem TXT-Datei zwar machen aber nciht mit den Deklarationen und Funktionen. Den für die Settings ist nun mal die INI-Datei sehr gut geeignet.

Gruß
Frank

— geändert am 27.11.2012 08:38:00

grüße aus Mittelfranken

  • Forum-Beiträge: 178

27.11.2012 14:08:32 via Website

Hallo,

jetzt habe ich über den Link, den du gepostest hast ein Beispiel gefunden.

1' ************************************************
2' * *
3' * db2000 - INI Ver.4.7.0.3 *
4' * writing & reading for [INI]tialization files *
5' * *
6' * by Massimo Mascalchi *
7' * massimo.mascalchi@db2000web.net *
8' * www.2ms-it.com - www.db2000web.net *
9' * *
10' ************************************************
11' * HISTORY ------------------------------------ *
12' * 12/09/1986 - created in Clipper *
13' * 03/02/1988 - adapted for QuickBasic *
14' * 18/10/2006 - " " Basic4ppc *
15' * -------------------------------------------- *
16' * 26/11/2010 - " " Basic4android *
17' * -------------------------------------------- *
18' ************************************************
19
20'Activity module
21Sub Process_Globals
22 'These global variables will be declared once when the application starts.
23 'These variables can be accessed from all modules.
24
25End Sub
26
27Sub Globals
28 'These global variables will be redeclared each time the activity is created.
29 'These variables can only be accessed from this module.
30
31End Sub
32
33Sub Activity_Create(FirstTime As Boolean)
34
35 Dim r As String
36
37 wrINI(File.DirRootExternal, "test.ini", "SESSION 1", "Code", "00001")
38 wrINI(File.DirRootExternal, "test.ini", "SESSION 1", "Name", "db2000")
39 wrINI(File.DirRootExternal, "test.ini", "SESSION 2", "Code", "00002")
40 wrINI(File.DirRootExternal, "test.ini", "SESSION 2", "Name", "Basic4ppc")
41
42 r = rdINI(File.DirRootExternal, "test.ini", "SESSION 1", "Code", "")
43 Msgbox(r, "db2000 file .INI ")
44 r = rdINI(File.DirRootExternal, "test.ini", "SESSION 1", "Name", "")
45 Msgbox(r, "test file .INI")
46 r = rdINI(File.DirRootExternal, "test.ini", "SESSION 2", "Code", "")
47 Msgbox(r, "test file .INI")
48 r = rdINI(File.DirRootExternal, "test.ini", "SESSION 2", "Name", "")
49 Msgbox(r, "test file .INI")
50
51End Sub
52
53Sub Activity_Resume
54
55End Sub
56
57Sub Activity_Pause (UserClosed As Boolean)
58
59End Sub
60
61#Region ***** ROUTINE DI SUPPORTO ALLA GESTIONE DEI FILE .INI *****
62
63#Region ***** LETTURA *****
64' *** legge un valore all'interno di un file .INI ***
65Sub rdINI(directory As String, fileINI As String, session As String, key As String, default As String)
66
67 Dim value As String ' valore della chiave
68 Dim rSESSION As String ' riga contenente il nome della sessione
69 Dim flgSESSION As Boolean ' flag di supporto alla sessione (True = trovata)
70 Dim rKEY As String ' riga contenente il nome e il valore della chiave
71 Dim rdTEXT As TextReader ' oggetto stream per la lettura del file
72 Dim p As Int '
73 Dim k As String '
74
75 ' assegna il valore di default:
76 value = default
77
78 ' verifica se il file esiste:
79 If File.Exists(directory, fileINI) = True Then
80 ' inizializza le variabili di controllo in uso:
81 rSESSION = ""
82 flgSESSION = False
83 rKEY = ""
84 ' apre il file .INI in lettura:
85 rdTEXT.Initialize(File.OpenInput(directory, fileINI))
86 ' lettura del file .INI riga per riga:
87 rSESSION = rdTEXT.ReadLine '.Trim
88 Do While rSESSION <> Null
89 ' se la stringa letta non è vuota:
90 If rSESSION <> "" Then
91 ' individua la sessone a cui la chiave appartiene:
92 If rSESSION.CompareTo("[" & session & "]") = 0 Then
93 ' la sessione è stata individuata:
94 flgSESSION = True
95 ' continua la lettura del file .INI riga per riga per individuare la chiave:
96 rKEY = rdTEXT.ReadLine
97 Do While rKEY <> Null
98 ' se la stringa letta non è vuota:
99 If rKEY <> "" Then
100 ' rileva il nome della chiave:
101 p = rKEY.IndexOf("=")
102 If p > -1 Then
103 If rKEY.SubString2(0, 0) <> "[" Then
104 k = rKEY.SubString2(0, p)
105 ' se il nome la chiave letta corrisponde al nome della chiave da rilevare:
106 If key.CompareTo(k) = 0 Then
107 ' assegna il valore della chiave trovata:
108 value = rKEY.SubString(p + 1)
109 Exit
110 End If
111 End If
112 End If
113 End If
114 ' esegue una nuova lettura:
115 rKEY = rdTEXT.ReadLine
116 Loop
117 End If
118 End If
119 If flgSESSION = True Then
120 ' la sessione è stata trovata, interrompi la ricerca (esci dal loop):
121 Exit
122 Else
123 ' la sessione non è stata trovata, continua nelle letture:
124 rSESSION = rdTEXT.ReadLine
125 End If
126 Loop
127 ' chiude il file .INI:
128 rdTEXT.Close
129 End If
130
131 Return value
132
133End Sub
134#End Region
135
136#Region ***** SCRITTURA *****
137' *** scrive o aggiorna un valore all'interno del file .INI ***
138Sub wrINI(directory As String, fileINI As String, session As String, key As String, value As String)
139
140 Dim nr As Int ' numero delle righe lette dal file .INI
141 Dim flgSESSION As Boolean ' flag di supporto alla sessione (True = trovata)
142 Dim flgKEY As Boolean ' flag di supporto alla chiave (True = trovata)
143 Dim rdTEXT As TextReader ' oggetto stream per la lettura del file .INI
144 Dim wrTEXT As TextWriter ' oggetto stream per la scrittura del file .INI
145 Dim rowtxt As String ' riga di testo in lettura/scrittura
146 Dim rKEY As String ' riga contenente il nome e il valore della chiave
147 Dim p As Int '
148 Dim k As String '
149
150 If File.Exists(directory, fileINI) = True Then ' verifica se il file .INI esiste...
151 ' inizializza le variabili di controllo in uso:
152 nr = 0
153 flgSESSION = False
154 flgKEY = False
155 ' apre il file .INI in lettura:
156 rdTEXT.Initialize(File.OpenInput(directory, fileINI))
157 ' apre un file .INI temporaneo in scrittura:
158 wrTEXT.Initialize(File.OpenOutput(directory, "ini.tmp", False))
159 ' lettura del file .INI riga per riga...
160 rowtxt = rdTEXT.ReadLine
161 ' loop per trovare la chiave nella sessione indicata:
162 Do While rowtxt <> Null
163 ' incrementa il contatore delle letture:
164 nr = nr + 1
165 If rowtxt <> "" Then ' se non si è raggiunta la fine del file .INI origine aperto in lettura...
166 If rowtxt.SubString2(0, 0) = "[" Then ' si tratta di una sessione...
167 If flgSESSION = False Then ' verifica se si tratta della sessione da individuare...
168 If rowtxt.CompareTo("[" & session & "]") = 0 Then
169 ' la sessione è stata individuata:
170 flgSESSION = True
171 End If
172 If nr > 1 Then ' se la sessione da scrivere è successiva al primo in elenco...
173 ' inserisce una riga vuota per migliorare la lettura del file:
174 wrTEXT.WriteLine("")
175 End If
176 wrTEXT.WriteLine(rowtxt) ' scrive la sessione trovata senza apportare modifiche...
177 Else
178 ' la sessione è cambiata...
179 flgSESSION = False
180 If flgKEY = False Then
181 ' ma non è stata trovata la chiave associata alla sessione...
182 wrTEXT.WriteLine(key & "=" & value) ' scrive la chiave e il suo valore come nuovi...
183 flgKEY = True
184 wrTEXT.WriteLine("") ' inserisce una riga vuota per migliorare la lettura del file...
185 wrTEXT.WriteLine(rowtxt) ' scrive la sessione trovata successiva a quella della chiave appena scritta...
186 Exit ' la ricerca della chiave è terminata, esci dal loop...
187 Else
188 wrTEXT.WriteLine("") ' inserisce una riga vuota per migliorare la lettura del file...
189 wrTEXT.WriteLine(rowtxt) ' scrive la sessione trovata senza apportare modifiche...
190 End If
191 End If
192 Else
193 If rowtxt <> "" Then ' esclude le righe vuote e controlla se si tratta di una chiave...
194 ' verifica se si tratta della chiave da individuare:
195 p = rowtxt.IndexOf("=")
196 If p > -1 AND flgSESSION = True Then ' se è una chiave associata alla sessione...
197 k = rowtxt.SubString2(0, p) ' estrae il nome della chiave...
198 If key.CompareTo(k) = 0 Then ' se il nome la chiave letta nel file .INI corrisponde al nome della chiave da individuare...
199 flgKEY = True ' la chiave è stata individuata...
200 wrTEXT.WriteLine(key & "=" & value) ' scrive la chiave con il relativo valore...
201 Exit ' la ricerca della chiave è terminata, esci dal loop...
202 Else
203 ' non si tratta della chiave attesa, scrive la riga letta senza modificarla:
204 wrTEXT.WriteLine(rowtxt)
205 End If
206 Else
207 ' si tratta di una chiave appartenente ad un altra sessione, scrive la riga letta senza modificarla:
208 wrTEXT.WriteLine(rowtxt)
209 End If
210 End If
211 End If
212 End If
213 rowtxt = rdTEXT.ReadLine ' legge una nuova riga dal file .INI origine...
214 Loop
215 ' copia le eventuali righe ancora da leggere dal file .INI origine in quello temporaneo:
216 Do While rowtxt <> Null
217 rowtxt = rdTEXT.ReadLine ' legge la riga dal file .INI origine...
218 If rowtxt <> Null Then ' se non si è raggiunta la fine del file .INI origine aperto in lettura...
219 wrTEXT.WriteLine(rowtxt) ' scrive la riga appena letta nel file .INI temporaneo...
220 End If
221 Loop
222 ' chiude il file .INI usato in lettura:
223 rdTEXT.Close
224 If flgSESSION = False AND flgKEY = False Then ' la sessione e la chiave non sono stati trovati...
225 wrTEXT.WriteLine("") ' inserisce una riga vuota per migliorare la lettura del file...
226 wrTEXT.WriteLine("[" & session & "]") ' scrive l'identificativo della sessione...
227 wrTEXT.WriteLine(key & "=" & value) ' scrive la chiave con il relativo valore...
228 End If
229 wrTEXT.Close ' chiude il file .INI temporaneo usato in scrittura...
230 Else
231 ' il file .INI non esiste quindi lo si crea con la sola sessione e con l'unica chiave:
232 wrTEXT.Initialize(File.OpenOutput(directory, fileINI, False))
233 ' scrive l'identificativo della sessione:
234 wrTEXT.WriteLine("[" & session & "]")
235 ' scrive la chiave con il relativo valore:
236 wrTEXT.WriteLine(key & "=" & value)
237 ' chiude il file .INI:
238 wrTEXT.Close
239 End If
240
241 If File.Exists(directory, "ini.tmp") = True Then ' se il file .INI temporaneo esiste...
242 If File.Exists(directory, fileINI) = True Then ' se esiste il file .INI origine...
243 File.Delete(directory, fileINI) ' lo si elimina...
244 End If
245 ' sostituisce il file .INI originale con quello temporaneo:
246 File.Copy(directory, "ini.tmp", directory, fileINI)
247 ' elimina il file .INI temporaneo:
248 File.Delete(directory, "ini.tmp")
249 End If
250
251End Sub
252#End Region
253
254#End Region

hier ist jetzt aber die Frage, wo genau finde ich in meinem Smartphone die abgelegte ini-datei?
bzw. wie komme ich darein?

gruß

Frank

grüße aus Mittelfranken

  • Forum-Beiträge: 33.139

27.11.2012 15:21:42 via Website

Hi,

ich verstehe die Frage nicht.

In diesem Code stehen doch die Orte...

r = rdINI(File.DirRootExternal, "test.ini", "SESSION 1", "Code", "")

= Datei test.ini liegt im durch File.DirRootExternal maskierten Verzeichnis.

Herzliche Grüße

Carsten

— geändert am 27.11.2012 15:38:40

Ich komm' mir langsam vor wie jemand, der ich bin // #cäthe

  • Forum-Beiträge: 7.733

27.11.2012 15:35:00 via Website

Man kann auch einfach mal ein bissel rumprobieren.... :smug:

B)

if all else fails, read the instructions.

  • Forum-Beiträge: 178

27.11.2012 16:25:25 via Website

genau, aber wie komme ich da rein
DirRootExternal maskierten Verzeichnis wo ist das zu finden?

grüße aus Mittelfranken

  • Forum-Beiträge: 7.733

27.11.2012 16:31:45 via Website

Fr.Google hilft:

"File.DirRootExternal
As the name says: the root directory of the "external" storage
"

Quelle: B4A Files

if all else fails, read the instructions.

  • Forum-Beiträge: 178

27.11.2012 16:54:32 via Website

Ich habe mein Smartphone an den PC über USB angeschlossen.
mir wird zwei Verzeichnisse angezeigt
1. Arbeitsplatz\Xperia T\Interner Speicher
2. Arbeitsplatz\Xperia T\SD-Karte

Dann habe ich mal nach den angelegten INI-Datei gesucht und konnte nichts finden. Auch der Sucfunktion von Browser fand nichts.
Wenn ich aber am Smartphone unter Einstellungen -Speicher-Sonstiges gehe, sehe ich den test.ini datei.

Meine Frage ist, warum kann ich nicht direkt sehen, wenn ich am PC verbunden bin?

Auch der App, den ich immer zum testen drauf installiere, ist nicht zu finden (Bilder,Icon)

gruß
Frank

grüße aus Mittelfranken

  • Forum-Beiträge: 7.733

27.11.2012 17:02:06 via Website

Frank Neumann
Wenn ich aber am Smartphone unter Einstellungen -Speicher-Sonstiges gehe, sehe ich den test.ini datei.

Einstellungen->Speicher->Sonstiges zeigt bei meinen zwei Geräten beides mal den Interner Speicher (/sdcard) ... und sehe ich auch so am PC.

— geändert am 27.11.2012 17:02:33

if all else fails, read the instructions.

  • Forum-Beiträge: 178

27.11.2012 17:22:36 via Website

und wie komme ich in das Verzeichnis DirRootExternal ?
ich möchte dort eine Fertige Text-Datei ablegen und per App aufrufen und lesen.

grüße aus Mittelfranken

  • Forum-Beiträge: 33.139

27.11.2012 17:23:51 via App

Frank Neumann
und wie komme ich in das Verzeichnis DirRootExternal ?
ich möchte dort eine Fertige Text-Datei ablegen und per App aufrufen und lesen.
Welche bei Dir das Dir Root external ist kannst Du Dir doch anzeigen:

Msgbox(File.DirRootExternal, "")

Herzliche Grüße

Carsten

Ich komm' mir langsam vor wie jemand, der ich bin // #cäthe

  • Forum-Beiträge: 178

27.11.2012 17:46:32 via Website

Hi Carsten,

also bei mir wird /mnt/sdcard angezeigt
aber dor finde ich nicht die test.ini Datei

grüße aus Mittelfranken

  • Forum-Beiträge: 33.139

27.11.2012 17:49:01 via App

Frank Neumann
Hi Carsten,

also bei mir wird /mnt/sdcard angezeigt
aber dor finde ich nicht die test.ini Datei
Dort wird sie aber liegen, wenn Du sie dorthin gespeichert hast...

Herzliche Grüße

Carsten

Ich komm' mir langsam vor wie jemand, der ich bin // #cäthe

  • Forum-Beiträge: 178

27.11.2012 17:55:39 via Website

ja die ist da, im smartphone unter eintellungen-speicher-sonstiges ist sie zu sehen
aber wenn ich per usb verbinde und mir das Verzeichnis aufrufe, ist sie nicht zu finden.

komisch :-)

grüße aus Mittelfranken

  • Forum-Beiträge: 33.139

27.11.2012 18:01:57 via App

Frank Neumann
ja die ist da, im smartphone unter eintellungen-speicher-sonstiges ist sie zu sehen
aber wenn ich per usb verbinde und mir das Verzeichnis aufrufe, ist sie nicht zu finden.

komisch :-)
Dann ist Dein Smartphone wahrscheinlich nicht um Dateizugriffsmodus angeschlossen, sondern in so einem komischen Bilderzugriffsmodus.

Aber warum machst Du Dir es so kompliziert?

Du willst Deiner App eine Datei mitgeben?
Dann pack die Datei doch zu Deinem Projekt in das Files Verzeichnis. Dann wird sie automatisch in das Verzeichnis File.DirAssets kopiert, wenn Du die App installierst... Dann rufst Du sie von dort aus auf. Und wenn Du sie editieren und speichern willst, kopierst Du sie zunächst in File.DirInternal. Dieses Verzeichnis ist - im Gegensatz zu File.DirAssets - beschreibbar.

Eine Ini Datei hat sowieso nichts dort zu suchen, wo der User manuell rumbasteln kann...

Herzliche Grüße

Carsten

Ich komm' mir langsam vor wie jemand, der ich bin // #cäthe

  • Forum-Beiträge: 178

27.11.2012 18:23:11 via Website

ich möchte eine combobox bzw. ne listview platzieren und den inhalt aus einer txt-datei aufrufen. das ist alles.
der ini kommt später.

grüße aus Mittelfranken

  • Forum-Beiträge: 33.139

27.11.2012 19:19:34 via Website

Frank Neumann
ich möchte eine combobox bzw. ne listview platzieren und den inhalt aus einer txt-datei aufrufen. das ist alles.
der ini kommt später.
Dann pack' halt die Textdatei in den Files Ordner Deines Projektes.

Oder was hat es für einen Grund, dass die Textdatei irgendwo auf der SD Karte liegen soll?

Herzliche Grüße

Carsten

Ich komm' mir langsam vor wie jemand, der ich bin // #cäthe

  • Forum-Beiträge: 178

27.11.2012 19:26:58 via Website

ok, das habe ich jetzt so weit hin bekommen... allerdings ist mein Listview sehr Transparent, obwohl ich die Alpha auf 255 habe und als color schwarz gewählt habe.

da ne idee warum das so ist?

gruß
frank

grüße aus Mittelfranken