INI-Dateien unter Windows

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

INI-Dateien unter Windows

Beitrag von ts-soft »

Ich bin gerade dabei meine "Bausteine" für die neue IDE einzurichten. Bei der Gelegenheit sind die folgenden Proceduren entstanden:

Code: Alles auswählen

; Funktionen zum leichten Umgang mit INI-Dateien unter Windows
; 25.08.2005 by TS-Soft

; Löscht einen Key
Procedure IniDelKey(szIniFileName.s, szSectionName.s, szKeyName.s)
  Protected Buffer.l
  If WritePrivateProfileString_(@szSectionName, @szKeyName, #Null, @szIniFileName)
    ProcedureReturn #True
  Else
    FormatMessage_(#FORMAT_MESSAGE_ALLOCATE_BUFFER|#FORMAT_MESSAGE_FROM_SYSTEM,0,GetLastError_(),0,@Buffer,0,0)
    Debug "IniDelKey: " + PeekS(Buffer)
    LocalFree_(Buffer)
    ProcedureReturn #False
  EndIf  
EndProcedure

; Löscht eine Section
Procedure IniDelSection(szIniFileName.s, szSectionName.s)
  Protected Buffer.l
  If WritePrivateProfileString_(@szSectionName, #Null, "", @szIniFileName)
    ProcedureReturn #True
  Else
    FormatMessage_(#FORMAT_MESSAGE_ALLOCATE_BUFFER|#FORMAT_MESSAGE_FROM_SYSTEM,0,GetLastError_(),0,@Buffer,0,0)
    Debug "IniDelSection: " + PeekS(Buffer)
    LocalFree_(Buffer)
    ProcedureReturn #False
  EndIf
EndProcedure

; Liest einen Longwert
Procedure.l IniReadLong(szIniFileName.s, szSectionName.s, szKeyName.s, nDefault.l)
  ProcedureReturn GetPrivateProfileInt_(@szSectionName, @szKeyName, nDefault, @szIniFileName)
EndProcedure

; Liest eine komplette Sektion und gibt diese als String zurück
Procedure.s IniReadSection(szIniFileName.s, szSectionName.s, szSeperator.s)
  Protected BufferSize.l, Result.s, Temp.s, *MEM, Length.l
  If OSVersion() = #PB_OS_Windows_95
    BufferSize = 32767
  Else
    BufferSize = 64000
  EndIf
  *MEM = AllocateMemory(BufferSize)
  Length = GetPrivateProfileSection_(@szSectionName, *MEM, BufferSize, @szIniFileName)
  If Length = -1
    Debug "IniReadSection: more memory needed"
    FreeMemory(*MEM)
    ProcedureReturn ""
  EndIf
  Repeat
    Temp = PeekS(*MEM, Length)
    If Temp
      Result + Temp + szSeperator
      *MEM + Len(Temp) + 1
    EndIf
  Until Temp = ""
  FreeMemory(*MEM)
  ProcedureReturn Result 
EndProcedure

; List eine String
Procedure.s IniReadString(szIniFileName.s, szSectionName.s, szKeyName.s, szDefault.s)
  Protected  ReturnBuffer.s
  ReturnBuffer = Space(1024)
  GetPrivateProfileString_(@szSectionName, @szKeyName, szDefault, @ReturnBuffer, 1024, @szIniFileName)
  ProcedureReturn Trim(ReturnBuffer)
EndProcedure

; Schreibt ein Long
Procedure.l IniWriteLong(szIniFileName.s, szSectionName.s, szKeyName.s, nValue.l)
  Protected Buffer.l
  If WritePrivateProfileString_(@szSectionName, @szKeyName, *Str(nValue), @szIniFileName)
    ProcedureReturn #True
  Else
    FormatMessage_(#FORMAT_MESSAGE_ALLOCATE_BUFFER|#FORMAT_MESSAGE_FROM_SYSTEM,0,GetLastError_(),0,@Buffer,0,0)
    Debug "IniWriteLong: " + PeekS(Buffer)
    LocalFree_(Buffer)
    ProcedureReturn #False
  EndIf
EndProcedure

; Schreibt einen String
Procedure.l IniWriteString(szIniFileName.s, szSectionName.s, szKeyName.s, szValue.s)
  Protected Buffer.l
  If WritePrivateProfileString_(@szSectionName, @szKeyName, @szValue, @szIniFileName)
    ProcedureReturn #True
  Else
    FormatMessage_(#FORMAT_MESSAGE_ALLOCATE_BUFFER|#FORMAT_MESSAGE_FROM_SYSTEM,0,GetLastError_(),0,@Buffer,0,0)
    Debug "IniWriteString: " + PeekS(Buffer)
    LocalFree_(Buffer)
    ProcedureReturn #False
  EndIf
EndProcedure

;Beispiel zur Nutzung von IniReadSection:

String$ = IniReadSection("win.ini", "Mail", "|")
For I = 1 To CountString(String$, "|")
  Debug StringField(String$, I, "|")
Next
Vielleicht kann's ja der eine oder andere gebrauchen
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
mueckerich
Beiträge: 220
Registriert: 13.09.2004 11:33
Wohnort: Am schönsten Flecken der Erde, zwischen PC und Motorrad

Beitrag von mueckerich »

Sag mal, kannst Du Hellsehen. :mrgreen:
Kann ich sehr gut gebrauchen, kommt genau zur richtigen Zeit.

Vielen Dank :allright:
"Wenn Sie glauben, mich verstanden zu haben, dann habe ich mich falsch ausgedrückt" ( Alan Greenspan)
Benutzeravatar
PAMKKKKK
Beiträge: 321
Registriert: 21.04.2005 22:08
Wohnort: Braunschweig
Kontaktdaten:

Beitrag von PAMKKKKK »

Da gibts doch schon die RegINI Userlib von Paul Leischow...
....oder nicht??
Wir Schreiben ein PureBasic Buch.
Auch du kannst mitmachen!
http://www.purearea.net/pb/english/pure ... :Main_Page
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

PAMKKKKK hat geschrieben:Da gibts doch schon die RegINI Userlib von Paul Leischow...
....oder nicht??
1. dies ist keine Lib
2. Die RegINI enthält ja nur 2 Funktionen, für INI's

Ausserdem sind das hier meine Bausteine (Templates) für die neue IDE, deswegen ist ja die Fehlerüberprüfung auch gleich in der Procedure mit drinnen, so das das hinzufügen eines Bausteines genügt und alles funzt (hoffe ich :D )
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
neotoma
Beiträge: 202
Registriert: 13.09.2004 16:16
Kontaktdaten:

Re: INI-Dateien unter Windows

Beitrag von neotoma »

ts-soft hat geschrieben:Vielleicht kann's ja der eine oder andere gebrauchen
Gebrauchen ja !
Aber warum hast Du das einlesen und 'auseinanderpflücken' nicht selbst gemacht ?
Was mir fehlt sind funktionen umd z.B. alle Section-Namen auszulesen, ebenso alle keys einer Section.

Mike
Alle Rechtschreibfehler unterliegen der GPL und dürfen frei kopiert und modifiziert werden.
Antworten