Seite 1 von 1

INI-Dateien unter Windows

Verfasst: 25.08.2005 04:57
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

Verfasst: 25.08.2005 07:20
von mueckerich
Sag mal, kannst Du Hellsehen. :mrgreen:
Kann ich sehr gut gebrauchen, kommt genau zur richtigen Zeit.

Vielen Dank :allright:

Verfasst: 25.08.2005 12:48
von PAMKKKKK
Da gibts doch schon die RegINI Userlib von Paul Leischow...
....oder nicht??

Verfasst: 25.08.2005 20:31
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 )

Re: INI-Dateien unter Windows

Verfasst: 26.08.2005 10:49
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