Ini-System

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Silver_Knee

Betreff: Ini-System

BeitragSo, Jan 10, 2010 15:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein Ini-Reader, Editor und Writer.

Variablen auslesen, verändern und abspeichern:
BlitzBasic: [AUSKLAPPEN]
LoadIni("c:\Windows\Datei.ini","MeineINI")
Wert$=GetIniValue("MeineINI","Sektion1","Variable C")
SetIniValue("MeineINI","Sektion1","Variable C",Wert+Wert)
SaveIni("C:\AndereDatei.ini","MeineINI")
FreeIni("MeineINI")


Code: [AUSKLAPPEN]
Function LoadIni(filename$,inifile$="")
Lädt eine Ini-Datei in den Speicher. Mit inifile kann man ihr einen speziellen Namen geben, ansonsten bekommt sie den Dateinamen für die spätere Verwendung.

Function GetIniValue$(inifile$,section$,variablename$)
Liest aus einer bestimmten Datei, aus einer Bestimmten Section eine Variable aus.

Function SetIniValue(inifile$,section$,variablename$,variablevalue$)
Setzt (überschreibt ggf.) eine Variable.

Function SaveIni(filename$,inifile$,add=0)
Speichert eine Datei (inifile) mit einem bestimmte Dateinamen(filename) ab. Wenn add=1 ist wird an eine ggf bestehende Ini-Datei die Werte und Sektionen angehängt.

Function CreateIniFile(inifile$)
Erstellt eine Datei im Speicher (noch nicht auf der Festplatte)

Function AddIniSection(inifile$,section$)
Fügt einer Datei eine Sektion hinzu

Function AddIniVariable(inifile$,section$,variablename$,variablevalue$)
Fügte einer Sektion eine Variable hinzu (überschreibt bestehende Variablen NICHT -> SetIniValue)

Function RemoveIniSection(inifile$,section$,movetosection$="",movetoinifile$="")
Entfernt eine Sektion. Mit movetosection und movetoinifile kann man die Variablen vor dem Löschen in eine andere Sektion bzw in eine andere Sektion einer anderen Datei verschieben.

Function RemoveIniVariable(inifile$,section$,variablename$)
Entfernt eine Variable.

Function FreeIniFile(inifile$,moveto$="")
Entfernt eine Datei aus dem Speicher. Löscht weder Dateien von der Festplatte(-> [[DeleteFile]]), noch speichert es die Werte vorher ab (-> SaveIni). Mit moveto kann man eine Datei angeben, in die die Sektionen mit ihren Variablen vor dem Löschen verschoben werden.
---
Debug(txt$)
Mit dieser Funktion kannst du Fehlermeldungen verarbeiten. Verändere Sie um diese Meldungen anzuzeigen o.ä.

AfterLast(str$,find$)
Mit AfterLast(DateiName,"\") kannst du einen Dateinamen vom Pfad trennen.



BlitzBasic: [AUSKLAPPEN]
Function LoadINI(filename$,inifile$="")
Local file,count,countcount,l$
Local f.TIni_File,s.TIni_Section,v.TIni_Variable
file=ReadFile(filename)
If file=0
Return
EndIf

f=New TIni_File
If inifile$=""
f\sName=AfterLast(filename,"\")
Else
f\sName=inifile
EndIf

f\hFirst=New TIni_Section
count=1
s=f\hFirst
s\sName="[EMPTY]"
While Not Eof(file)
l=ReadLine(file)
Select Mid(l,1,1)
Case "["
s\total=countcount
countcount=0

count=count+1

s.TIni_Section=New TIni_Section
If Right(l,1)="]"
s\sName=Mid(l,2,Len(l)-2)
Else
s\sName=Mid(l,2)
EndIf
Case "#","/",";"
Default
v=New TIni_Variable
If Instr(l,"=")
v\sName=Left(l,Instr(l,"=")-1)
v\sValue=Mid(l,Instr(l,"=")+1)
Else
v\sName=l
EndIf

If s\hFirst=Null
s\hFirst=v
countcount=1
Else
countcount=countcount+1
EndIf
End Select
Wend
f\total=count
End Function

Function GetIniValue$(inifile$,section$,variablename$)
Local f.TIni_File,s.TIni_Section,v.TIni_Variable,count
For f=Each TIni_File
If f\sName=inifile
Exit
EndIf
Next

If f=Null
Debug("INI: File:"+inifile+" not loaded!")
Return
EndIf

s=f\hFirst
For count=1 To f\total
If s\sName=section
Exit
EndIf

s=After s
Next

If count>f\total
Debug("INI: Section "+section+" not found in file "+inifile)
EndIf

v=s\hFirst
For count=1 To s\total
If v\sName=variablename
Return v\sValue
EndIf
v=After v
Next
Debug("INI: Variable "+variablename+" not found in section "+section+" of file "+inifile)
End Function

Function SetIniValue(inifile$,section$,variablename$,variablevalue$)
Local f.TIni_File,s.TIni_Section,count,lastv.TIni_Variable,v.TIni_Variable

For f=Each TIni_File
If f\sName=inifile
Exit
EndIf
Next
If f=Null
Debug("INI: Inifile "+inifile+" not found")
Return
EndIf

s=f\hFirst
For count=1 To f\total
If s\sName=section
Exit
EndIf
s=After s
Next

If count>f\total
Debug("INI: Section "+section+" not found in file "+inifile)
EndIf

s\total=s\total+1

v=s\hFirst
For count=1 To s\total
If v\sName=variablename
v\sValue=variablevalue
Return
EndIf
v=After v
Next
If v<>Null
lastv=Before v
Else
lastv=Last TIni_Variable
EndIf

v=New TIni_Variable
v\sName=variablename
v\sValue=variablevalue

Insert v After lastv
End Function

Function SaveIni(filename$,inifile$,add=0);filename:real filename to save, inifile:internal filename
Local file,f.TIni_File,count,countcount,s.TIni_Section,v.TIni_Variable
If add
file=OpenFile(filename)
If file=0
file=WriteFile(filename)
EndIf
Else
file=WriteFile(filename)
EndIf

For f=Each TIni_File
If f\sName=inifile
Exit
EndIf
Next
If f=Null
Debug("INI: Inifile "+inifile+" not found")
Return
EndIf

s=f\hFirst
For count=1 To f\total
If s\sName<>"[EMPTY]"
WriteLine file,"["+s\sName+"]"
EndIf
v=s\hFirst
For countcount=1 To s\total
WriteLine file,v\sName+"="+v\sValue
v=After v
Next
s=After s
Next
CloseFile file
End Function

Function FreeIniFile(inifile$,moveto$="")
Local file,f.TIni_File,count,countcount,s.TIni_Section,v.TIni_Variable,f2.TIni_File,lasts.TIni_Section

For f=Each TIni_File
If f\sName=inifile
Exit
EndIf
Next
If f=Null
Debug("INI: Inifile "+inifile+" not found")
Return
EndIf

If moveto=""
s=f\hFirst
For count=1 To f\total
v=s\hFirst
For countcount=1 To s\total
v=After v
Delete Before v
Next
s=After s
Delete Before s
Next
Else
For f2=Each TIni_File
If f2\sName=moveto
Exit
EndIf
Next
If f2=Null
Debug("INI: Inifile "+moveto+" not found")
Return
EndIf

s=f2\hFirst
For count=1 To f2\total
s=After s
Next
If s<>Null
lasts=Before s
Else
lasts=Last TIni_Section
EndIf

f2\total=f2\total+f\total

s=f\hFirst
For count=1 To f\total
s=After s
Insert Before s After lasts
Next
EndIf
End Function

Function CreateIniFile(inifile$)
Local f.TIni_File
f=New TIni_File
f\sName=inifile
f\hFirst=New TIni_Section
f\hFirst\sName="[EMPTY]"
f\total=1
End Function

Function AddIniSection(inifile$,section$)
Local f.TIni_File,s.TIni_Section,count,lasts.TIni_Section
For f=Each TIni_File
If f\sName=inifile
Exit
EndIf
Next
If f=Null
Debug("INI: Inifile "+inifile+" not found")
Return
EndIf

f\total=f\total+1

s=f\hFirst
For count=1 To f\total
s=After s
Next
If s<>Null
lasts=Before s
Else
lasts=Last TIni_Section
EndIf

s=New TIni_Section
s\sName=section
Insert s After lasts
End Function

Function AddIniVariable(inifile$,section$,variablename$,variablevalue$)
Local f.TIni_File,s.TIni_Section,count,lastv.TIni_Variable,v.TIni_Variable

For f=Each TIni_File
If f\sName=inifile
Exit
EndIf
Next
If f=Null
Debug("INI: Inifile "+inifile+" not found")
Return
EndIf

s=f\hFirst
For count=1 To f\total
If s\sName=section
Exit
EndIf
s=After s
Next

If count>f\total
Debug("INI: Section "+section+" not found in file "+inifile)
Return
EndIf

s\total=s\total+1

v=s\hFirst
For count=1 To s\total
If v\sName=variablename
Debug("INI: Variable "+variablename+" already exists in section "+section+" of file "+inifile)
Return
EndIf
v=After v
Next
If v<>Null
lastv=Before v
Else
lastv=Last TIni_Variable
EndIf

v=New TIni_Variable
v\sName=variablename
v\sValue=variablevalue

Insert v After lastv
End Function

Function RemoveIniSection(inifile$,section$,movetosection$="",movetoinifile$="")
Local f.TIni_File,s.TIni_Section,count,f2.TIni_File,v.TIni_Variable,s2.TIni_Section,lastv.TIni_Variable

For f=Each TIni_File
If f\sName=inifile
Exit
EndIf
Next
If f=Null
Debug("INI: Inifile "+inifile+" not found")
Return
EndIf

If movetoinifile<>""
For f2=Each TIni_File
If f2\sName=inifile
Exit
EndIf
Next
If f2=Null
Debug("INI: Inifile "+inifile+" not found")
Return
EndIf
Else
f2=f
End If

If movetosection<>""
s=f\hFirst
For count=1 To f\total
If s\sName=section
Exit
EndIf
s=After s
Next

If count>f\total
Debug("INI: Section "+section+" not found in file "+inifile)
Return
EndIf

s2=f2\hFirst
For count=1 To f2\total
If s2\sName=movetosection
Exit
EndIf
s2=After s2
Next

If count>f2\total
Debug("INI: Section "+movetosection+" not found in file "+movetoinifile)
Return
EndIf

v=s2\hFirst
For count= 1 To s2\total
v=After v
Next
If v<>Null
lastv=Before v
Else
lastv=Last TIni_Variable
EndIf

v=s\hFirst
For count= 1 To s\total
v=After v
Insert Before v After lastv
Next

s2\total=s2\total+s\total

If s=f\hFirst
f\hFirst=After s
EndIf
Delete s

f\total=f\total-1
If f\total=0
f\hFirst=New TIni_Section
f\sName="[EMPTY]"
EndIf
Else
s=f\hFirst
For count=1 To f\total
If s\sName=section
Exit
EndIf
s=After s
Next

If count>f\total
Debug("INI: Section "+section+" not found in file "+inifile)
Return
EndIf

v=s\hFirst
For count= 1 To s\total
v=After v
Delete Before v
Next

If s=f\hFirst
f\hFirst=After s
EndIf
Delete s

f\total=f\total-1
If f\total=0
f\hFirst=New TIni_Section
f\sName="[EMPTY]"
EndIf
EndIf
End Function

Function RemoveIniVariable(inifile$,section$,variablename$)
Local f.TIni_File,s.TIni_Section,v.TIni_Variable,count
For f=Each TIni_File
If f\sName=inifile
Exit
EndIf
Next
If f=Null
Debug("INI: Inifile "+inifile+" not found")
Return
EndIf

s=f\hFirst
For count=1 To f\total
If s\sName=section
Exit
EndIf
s=After s
Next

If count>f\total
Debug("INI: Section "+section+" not found in file "+inifile)
Return
EndIf

v=s\hFirst
For count=1 To s\total
If v\sName=variablename
Exit
EndIf
v=After v
Next

If count>s\total
Debug ("INI: Variable "+variablename+" not found in section "+section+" of file "+inifile)
Return
EndIf

If v=s\hFirst
s\hFirst=After v
EndIf
Delete v
s\total=s\total-1

If s\total<1
s\hFirst=Null
s\total=0
EndIf
End Function

Type TIni_File
Field sName$
Field hFirst.TIni_Section
Field total
End Type

Type TIni_Section
Field sName$
Field hFirst.TIni_Variable
Field total
End Type

Type TIni_Variable
Field sName$
Field sValue$
End Type

Function AfterLast$(txt$,find$)
While Not Instr(txt,find)=0
txt=Mid(txt,Instr(txt,find)+Len(find))
Wend
Return txt
End Function

Function Debug(s$)
DebugLog(s$)
End Function


--Version 1.1 Die Ersten Posts beziehen sich auf eine ältere Version
--Version 1.1fix Die Funktionen AfterLast und Debug haben gefehlt
  • Zuletzt bearbeitet von Silver_Knee am Sa, Dez 25, 2010 10:33, insgesamt 2-mal bearbeitet

Goodjee

BeitragSo, Jan 10, 2010 15:12
Antworten mit Zitat
Benutzer-Profile anzeigen
warum return deine loadfunktion nicht einfach das richtige objekt, dann musst du das beim lesen und schreiben nicht suchen?
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

Silver_Knee

BeitragSo, Jan 10, 2010 15:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hätt' ich auch machen können. Ich wollte aber den Anwender keine Types sehen lassen. So ist es einfaher zu bedienen.

Midimaster

BeitragSo, Jan 10, 2010 15:25
Antworten mit Zitat
Benutzer-Profile anzeigen
sehr schöne Idee

Vielleicht könntest Du oben bei den Aufruf-Beispielen auch noch ein Beispiel aufführen, das zeigt, wie man einen Wert in eine INI schreibt.

Außerdem würde ich die DeleteIniFile() eher RemoveIni() oder FinishIni() nennen. Sonst denkt man, da wird die INI-Datei von der Platte entfernt.

Ist denn sichergestellt, dass hineingeschriebene Werte beim Beenden des Programm auch auf die Platte wandern?
 

Well

BeitragSo, Jan 10, 2010 16:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Silver_Knee hat Folgendes geschrieben:
Hätt' ich auch machen können. Ich wollte aber den Anwender keine Types sehen lassen. So ist es einfaher zu bedienen.

Handle und Object?

Silver_Knee

BeitragSo, Jan 10, 2010 16:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Also DeleteIniFile löscht die Ini Datei nur aus dem Speicher.

Ein Beispiel wie man etwas auf die Platte bekommt wäre:

BlitzBasic: [AUSKLAPPEN]
CreateIniFile("MeineINI")
CreateIniSection("MeineINI","Person")
CreateIniVariable("MeineINI","Person","Name","Hans")
SaveIni("Personen\Personen.ini","MeineINI");Speichert MeineINI als Personen\Personen.ini ab
DeleteIniFile("MeineINI");Gibt den Speicher Frei


das wird dann zu einer Datei:
Code: [AUSKLAPPEN]
[Person]
Name=Hans


Ob die hingeschriebenen Werte auf die Platte wandern ist deine Entscheidung. zB könnte man Settings von einem Server laden, die die Setting der User teilweise überschreiben aber sicher nicht abgespeichert werden sollen.

EDIT:
Ich kenne Handle und Object. Hätt ich auch machen können... Bringe wahrscheinlich ein Kompatibles Paket dass das dann unterstützt sozusagen für fortgeschrittene, die können dann mit rückgabewerten jonglieren ohne Hardcoded Strings zu nutzen.

Xeres

Moderator

BeitragSo, Jan 10, 2010 16:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest die Funktion Basic-konsistent FreeIniFile nennen. Wink
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Midimaster

BeitragSo, Jan 10, 2010 17:07
Antworten mit Zitat
Benutzer-Profile anzeigen
ja, das war mir schon klar! Aber schreib's doch noch in den ersten Beitrag rein. Damit es dort jeder sofort finden kann.

Das war mein eigentliches Anliegen.


Die Leute schreiben oft wahnsinnsgute Funktionen. Und die "Anleitung" dazu wird dann miniklein. Dabei ist dieser Teil genauso wichtig. Und es ist der Hauptgarant für häufiges Downloaden. Die Funktionen, die "öffentlich" sind werden genau beschrieben. Die "privaten" Funktionen mit dem kommentar "; only for internal use" kommentiert.

Die Funktionsnamen müssen für Dritte eindeutig sein. Dein Name "DeleteIniFile" ist "leider eindeutig", aber macht eindeutig nicht das, was er vorgibt zu tun. Nenne die Funktion "FinishIni" oder so.

Silver_Knee

BeitragSo, Jan 10, 2010 18:06
Antworten mit Zitat
Benutzer-Profile anzeigen
ok Free hört sich besser an überzeugt. Ich Editiere mal eben den oberen Post

hamZta

Administrator

BeitragSo, Jan 10, 2010 18:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Silver_Knee hat Folgendes geschrieben:
Hätt' ich auch machen können. Ich wollte aber den Anwender keine Types sehen lassen. So ist es einfaher zu bedienen.


Wieso denn nicht? Types sind nunmal Bestandteil der Sprache, wieso sollte man die mit allen Mitteln verschwinden lassen wollen?

Außerdem wäre es direkt mit Objekten wesentlich schneller als jedesmal wieder suchen zu müssen. Finde ich sehr hässlich so!

edit: Und die Bedienung wird dadurch auch nicht einfacher oder sonstwas. Ob ich jetzt einen String oder ein Objekt übergebe verändert nichts an der Schwierigkeit.
Blog.

Silver_Knee

BeitragSo, Jan 10, 2010 19:00
Antworten mit Zitat
Benutzer-Profile anzeigen
So kann man halt einfach alles Hardcoded hinklatschen ohne 2 Variabeln für Datei und Section zu nutzen.

Habe jetzt den Ersten Post editiert. Neue Namen und ne beschreibung für jeden Befehl.

hamZta

Administrator

BeitragSo, Jan 10, 2010 19:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Da definier ich lieber ein paar Variablen mehr und hab dadurch einen enormen Geschwindigkeitsvorteil.

Aber es ist ja dein Code Wink
Blog.

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group