Seite 1 von 2

Unicode Preference (anstelle der Ascii/ UTF8-PB-Befehle)

Verfasst: 23.02.2007 21:28
von PMV
Da die Preferencebefehle der PB-Lib nicht im Unicode-Modus
funktionieren, bzw. nur Ascii-Dateien erstellen und lesen können, hab ich
mir das ganze System nach Programmiert. Dabei sind zwei Versionen
entstanden. Beide haben Macros, welche die Include anstelle der
normalen Preferencebefehle von PB ersetzten können, aber nicht müssen.

Nachtrag: Ich hab grad in der Hilfe gelesen, das im
Unicodemodus UTF8-Dateien erstellt und gelesen werden (können)!


Die erste ist eine abgespeckte Version die im prinzip nichts weiter als wie
ein Wrapper fungiert zu den File-Befehlen, welche Preference-Dateien
lesen und erstellen kann. Es gibt hier keine Suchfunktion.

Edit: (25.02.07)
Fixed: ExaminePreferenceGroups() und ExaminePreferenceKeys() als Macro vergessen
Fixed: NextPreferenceKey() gab immer am ende der Datei 0 zurück, auch wenn noch 1 Key gefunden wurde
Fixed: NextPreferenceKey() hat die Dateizeiger nicht zurück gesetzt, wenn eine Gruppenzeile eingelesen wurde
Edit: (01.03.07)
Fixed: wenn CreatePreference()/ CreateFPreference() UTF8 oder UTF16 als Format übergeben wurde, wurde ein Fehler angezeigt
Edit: (23.08.07)
Fixed: Beim Einlesen/ Durchlaufen der Keys wurden auch Leerzeilen berücksichtigt

Code: Alles auswählen

; PureBasic V4.02
; © 2007 by PMV
; FastUnicodePreference.pbi
; Datum: 23.08.2007

; !#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#
; !#!#                                                                        !#!#
; !#!#  Hinweiß:                                                              !#!#
; !#!#  setze die Konstante #UseFUnicodePreferenceAsPB vor dem 'Includieren'  !#!#
; !#!#  der Datei auf #False, um die Befehle neben den PB-Befehlen zu nutzen  !#!#
; !#!#                                                                        !#!#
; !#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#

CompilerIf Defined(UseFUnicodePreferenceAsPB, #PB_Constant) = #False
  #UseFUnicodePreferenceAsPB = #True
CompilerEndIf

Structure PMV_FPreference
  Format.l
  File.l
  Start.l
  GroupName.s
  ExamineGroups.l
  KeyName.s
  KeyValue.s
  ExamineKeys.l
EndStructure
Global PMV_FPreference.PMV_FPreference

Procedure PMV_CloseFPreferences()
  With PMV_FPreference
    If \File
      CloseFile(\File)
      \GroupName = ""
      \KeyName = ""
      \KeyValue = ""
      \ExamineKeys = #False
      \ExamineGroups = #False
      \File = #False
    EndIf
  EndWith
EndProcedure

Procedure PMV_ReadFPreferences(Filename$)
  With PMV_FPreference
    If \File
      PMV_CloseFPreferences()
    EndIf
    
    \File = ReadFile(#PB_Any, Filename$)
    If \File
      \Format = ReadStringFormat(\File)
      If \Format = #PB_Ascii Or \Format = #PB_UTF8 Or \Format = #PB_Unicode
        \Start = Loc(\File)
        ProcedureReturn #True
      EndIf
      CloseFile(\File)
      \File = #False
    EndIf
    ProcedureReturn #False
  EndWith
EndProcedure


Procedure PMV_ExamineFPreferenceGroups()
  If PMV_FPreference\File
    If Loc(PMV_FPreference\File) <> PMV_FPreference\Start
      FileSeek(PMV_FPreference\File, PMV_FPreference\Start)
    EndIf
    PMV_FPreference\ExamineGroups = #True
  Else
    PMV_FPreference\ExamineGroups = #False
  EndIf
  ProcedureReturn PMV_FPreference\ExamineGroups
EndProcedure

Procedure PMV_NextFPreferenceGroup()
  Protected Line.s, Pos.l
  With PMV_FPreference
    If \ExamineGroups
      While Not Eof(\File)
        Line = Trim(ReadString(\File, \Format))
        If Left(Line, 1) = "["
          Pos = FindString(Line, "]", 1)
          If Pos 
            \GroupName = Mid(Line, 2, Pos - 2) 
          Else
            \GroupName = Right(Line, Len(Line) - 1)
          EndIf
          ProcedureReturn #True
        EndIf
      Wend
    EndIf
    \GroupName = ""
    \ExamineGroups = #False
    ProcedureReturn #False
  EndWith  
EndProcedure

Procedure PMV_ExamineFPreferenceKeys()
  With PMV_FPreference
    If \File
      If Eof(\File)
        FileSeek(\File, 0)
      EndIf
      \ExamineKeys = #True
    Else
      \ExamineKeys = #False
    EndIf
    ProcedureReturn \ExamineKeys
  EndWith
EndProcedure

Procedure PMV_NextFPreferenceKey()
  Protected Line.s, Pos.l, Loc.l = 0
  
  With PMV_FPreference
    If \ExamineKeys
      While Not Eof(\File)
        Loc = Loc(\File)
        Line = Trim(ReadString(\File, \Format))
        If Left(Line, 1) = "["
          \ExamineKeys = #False
          \KeyName = ""
          \KeyValue = ""
          FileSeek(\File, Loc)
          Break
        ElseIf Line And Left(Line, 1) <> ";"
          Pos = FindString(Line, "=", 1)
          If Not Pos 
            \KeyName = Line
          Else
            \KeyName = RTrim(Left(Line, Pos - 1))
            \KeyValue = LTrim(Right(Line, Len(Line) - Pos))
          EndIf
          ProcedureReturn #True
        EndIf
      Wend
      If Eof(\File) : \ExamineKeys = #False : EndIf
    Else
      \KeyName = ""
      \KeyValue = ""
    EndIf
    ProcedureReturn \ExamineKeys
  EndWith  
EndProcedure

Procedure PMV_CreateFPreferences(Filename$, Format=0)
  With PMV_FPreference
    If \File
      PMV_CloseFPreferences()
    EndIf

    If Format And (Format <> #PB_Ascii And Format <> #PB_UTF8 And Format <> #PB_Unicode)
      ProcedureReturn #False
    EndIf
  
    \File = CreateFile(#PB_Any, Filename$)
    If \File
      If Format
        \Format = Format
      Else
        CompilerIf #PB_Compiler_Unicode
          \Format = #PB_Unicode
        CompilerElse
          \Format = #PB_Ascii
        CompilerEndIf
      EndIf
      WriteStringFormat(\File, \Format)
      ProcedureReturn #True
    EndIf
    ProcedureReturn #False
  EndWith
EndProcedure

CompilerIf #UseFUnicodePreferenceAsPB
  Macro OpenPreferences(Filename)
    PMV_ReadFPreferences(Filename)
  EndMacro
  
  Macro CreatePreferences(Filename, Format=0)
    PMV_CreateFPreferences(Filename, Format)
  EndMacro
  
  Macro NextPreferenceGroup()
    PMV_NextFPreferenceGroup()
  EndMacro
  
  Macro NextPreferenceKey()
    PMV_NextFPreferenceKey()
  EndMacro
  
  Macro ClosePreferences()
    PMV_CloseFPreferences()
  EndMacro
  
  Macro PreferenceGroupName()
    PMV_FPreference\GroupName
  EndMacro
  
  Macro PreferenceKeyName()
    PMV_FPreference\KeyName
  EndMacro
  
  Macro PreferenceKeyValue()
    PMV_FPreference\KeyValue
  EndMacro
  
  Macro PreferenceGroup(GroupName)
    WriteStringN(PMV_FPreference\File, "[" + GroupName + "]", PMV_FPreference\Format)
  EndMacro
  
  Macro PreferenceComment(Comment)
    WriteStringN(PMV_FPreference\File, "; " + Comment, PMV_FPreference\Format)
  EndMacro
  
  Macro ExaminePreferenceGroups()
    PMV_ExamineFPreferenceGroups()
  EndMacro
  
  Macro ExaminePreferenceKeys()
    PMV_ExamineFPreferenceKeys()
  EndMacro
  
  Macro WritePreferenceLong(Keyword,Value)
    WriteStringN(PMV_FPreference\File, Keyword + " = " + Str(Value), PMV_FPreference\Format)
  EndMacro
  Macro WritePreferenceString(Keyword,Value)
    WriteStringN(PMV_FPreference\File, Keyword + " = " + Value, PMV_FPreference\Format)
  EndMacro
  Macro WritePreferenceQuad(Keyword,Value)
    WriteStringN(PMV_FPreference\File, Keyword + " = " + StrQ(Value), PMV_FPreference\Format)
  EndMacro
  Macro WritePreferenceDouble(Keyword,Value)
    WriteStringN(PMV_FPreference\File, Keyword + " = " + StrD(Value), PMV_FPreference\Format)
  EndMacro
  Macro WritePreferenceFloat(Keyword,Value)
    WriteStringN(PMV_FPreference\File, Keyword + " = " + StrF(Value), PMV_FPreference\Format)
  EndMacro
  
CompilerElse

  Macro PMV_FPreferenceGroupName()
    PMV_FPreference\GroupName
  EndMacro
  
  Macro PMV_FPreferenceKeyName()
    PMV_FPreference\KeyName
  EndMacro
  
  Macro PMV_FPreferenceKeyValue()
    PMV_FPreference\KeyValue
  EndMacro
  
  Macro PMV_FPreferenceGroup(GroupName)
    WriteStringN(PMV_FPreference\File, "[" + GroupName + "]", PMV_FPreference\Format)
  EndMacro
  
  Macro PMV_FPreferenceComment(Comment)
    WriteStringN(PMV_FPreference\File, "; " + Comment, PMV_FPreference\Format)
  EndMacro
  
  Macro PMV_WriteFPreferenceLong(Keyword,Value)
    WriteStringN(PMV_FPreference\File, Keyword + " = " + Str(Value), PMV_FPreference\Format)
  EndMacro
  Macro PMV_WriteFPreferenceString(Keyword,Value)
    WriteStringN(PMV_FPreference\File, Keyword + " = " + Value, PMV_FPreference\Format)
  EndMacro
  Macro PMV_WriteFPreferenceQuad(Keyword,Value)
    WriteStringN(PMV_FPreference\File, Keyword + " = " + StrQ(Value), PMV_FPreference\Format)
  EndMacro
  Macro PMV_WriteFPreferenceDouble(Keyword,Value)
    WriteStringN(PMV_FPreference\File, Keyword + " = " + StrD(Value), PMV_FPreference\Format)
  EndMacro
  Macro PMV_WriteFPreferenceFloat(Keyword,Value)
    WriteStringN(PMV_FPreference\File, Keyword + " = " + StrF(Value), PMV_FPreference\Format)
  EndMacro
CompilerEndIf
Die zweite Version hat den vollen Funktionsumfang, ist dafür wesentlich
langsamer und ich hab sie auch nicht sonderlich optimiert ^_^. Allerdings
sind die Preference-Befehle eh nicht gerade für Zeit-Kritische Programme
zu gebrauchen und so langsam ists nu auch nicht <) . Ach ja, ich hab
versucht das Verhalten von PB nach zu ahmen ... aber sicher gibs
Situationen, wo sich die PB-Befehle anders verhalten. Einfach bescheid
sagen :D ... oder direkt die neue Version hier online stellen. :mrgreen:

Code: Alles auswählen

; PureBasic V4.02
; © 2007 by PMV
; UnicodePreference.pbi
; Datum: 23.08.2007

; !#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!
; !#!#                                                                        !#!#
; !#!#  Hinweis:                                                              !#!#
; !#!#  setze die Konstante #UseUnicodePreferenceAsPB vor dem 'Includieren'   !#!#
; !#!#  der Datei auf #False, um die Befehle neben den PB-Befehlen zu nutzen  !#!#
; !#!#                                                                        !#!#
; !#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!#

CompilerIf Defined(UseUnicodePreferenceAsPB, #PB_Constant) = #False
  #UseUnicodePreferenceAsPB = #True
CompilerEndIf

Structure PMV_PreferenceLine
  Typ.b    ;0 = Group (mit *NextGroup);1 = Key (mit Value) ; 2 = Commend
  Name.s
  ;StructureUnion ;weg lassen, da PB nicht damit klar kommt (Stand PB4.02)
    Value.s  
    *NextGroup 
  ;EndStructureUnion
EndStructure
Global NewList PMV_PreferenceLine.PMV_PreferenceLine()

Structure PMV_Preference
  *KeyElement.PMV_PreferenceLine   ; aktuelles KeyElement
  *GroupElement.PMV_PreferenceLine ; aktuelles GroupElement
  Format.l                         ; Dateiformat der Preference
  Change.b                         ; 0 = keine Änderung ;1 = Änderung
  Filename.s                       ; Filename der aktuellen Preferencedatei
  NewGroup.s                       ; eine neue Gruppe soll erstellt werden
EndStructure
Global PMV_Preference.PMV_Preference

Procedure PMV_ClosePreferences()
  Protected File.l
  With PMV_PreferenceLine()
    If PMV_Preference\Change
      File = CreateFile(#PB_Any, PMV_Preference\Filename)
      If File
        WriteStringFormat(File, PMV_Preference\Format)
        ForEach PMV_PreferenceLine()
          Select \Typ
            Case 0 ;Group
              WriteStringN(File, "[" + \Name + "]", PMV_Preference\Format)
            
            Case 1 ;Key
              WriteStringN(File, \Name + " = " + \Value, PMV_Preference\Format)
              
            Case 2 ;Comment
              WriteStringN(File, "; " + \Name, PMV_Preference\Format)
          EndSelect
        Next
        CloseFile(File)
      EndIf
      PMV_Preference\Change = #False
    EndIf
    ClearList(PMV_PreferenceLine())
    PMV_Preference\Filename = ""
    PMV_Preference\Format = 0
  EndWith
EndProcedure

Procedure PMV_OpenPreferences(Filename$)
  Protected Pos.l, Line.s, File.l, *LastGroup.PMV_PreferenceLine
  With PMV_Preference
    If \Change And \Filename
      PMV_ClosePreferences()
    EndIf
    \Change = #False
    \Filename = ""
    \NewGroup = ""
    \KeyElement = #False
    \GroupElement = #False
    ClearList(PMV_PreferenceLine())
    
    File = OpenFile(#PB_Any, Filename$)
    If File
      \Format = ReadStringFormat(File)
      If \Format = #PB_Ascii Or \Format = #PB_UTF8 Or \Format = #PB_Unicode
        While Not Eof(File)
          Line = Trim(ReadString(File, PMV_Preference\Format))
          If Left(Line, 1) = "["
            AddElement(PMV_PreferenceLine())
            PMV_PreferenceLine()\Typ = 0
            If *LastGroup
              *LastGroup\NextGroup = @PMV_PreferenceLine()
            EndIf
            *LastGroup = @PMV_PreferenceLine()
            Pos = FindString(Line, "]", 1)
            If Pos 
              PMV_PreferenceLine()\Name = Mid(Line, 2, Pos - 2) 
            Else
              PMV_PreferenceLine()\Name = Right(Line, Len(Line) - 1)
            EndIf
          ElseIf Left(Line, 1) = ";"
            AddElement(PMV_PreferenceLine())
            PMV_PreferenceLine()\Typ = 2
            PMV_PreferenceLine()\Name = LTrim(Right(Line, Len(Line) - 1))
          ElseIf Line
            AddElement(PMV_PreferenceLine())
            PMV_PreferenceLine()\Typ = 1
            Pos = FindString(Line, "=", 1)
            If Not Pos 
              PMV_PreferenceLine()\Name = Line
            Else
              PMV_PreferenceLine()\Name = RTrim(Left(Line, Pos - 1))
              PMV_PreferenceLine()\Value = LTrim(Right(Line, Len(Line) - Pos))
            EndIf
          EndIf
        Wend
        CloseFile(File)
        \Filename = Filename$
        ProcedureReturn #True
      EndIf
      CloseFile(File)
    EndIf
    ProcedureReturn #False
  EndWith
EndProcedure

Procedure PMV_ExaminePreferenceGroups()
  PMV_Preference\KeyElement = #False
  If CountList(PMV_PreferenceLine())
    PMV_Preference\GroupElement = 1
    ProcedureReturn #True
  EndIf
  PMV_Preference\GroupElement = #False
  ProcedureReturn #False
EndProcedure

Procedure PMV_ExaminePreferenceKeys()
  If CountList(PMV_PreferenceLine())
    If PMV_Preference\GroupElement
      PMV_Preference\KeyElement = 1
      ProcedureReturn #True
    EndIf
  EndIf
  PMV_Preference\KeyElement = #False
  ProcedureReturn #False
EndProcedure

Procedure PMV_NextPreferenceGroup()
  With PMV_Preference
    If \GroupElement
      If \GroupElement = 1
        ResetList(PMV_PreferenceLine())
        While NextElement(PMV_PreferenceLine())
          If PMV_PreferenceLine()\Typ = 0 ; Group
            \GroupElement = @PMV_PreferenceLine()
            ProcedureReturn #True
          EndIf
        Wend
      Else
        If \GroupElement\NextGroup
          \GroupElement = \GroupElement\NextGroup
          ProcedureReturn #True
        EndIf
      EndIf
    EndIf
    \KeyElement = #False
    \GroupElement = #False
    ProcedureReturn #False
  EndWith
EndProcedure

Procedure.s PMV_PreferenceGroupName()
  If PMV_Preference\GroupElement > 1
    ProcedureReturn PMV_Preference\GroupElement\Name
  EndIf
  ProcedureReturn ""
EndProcedure

Procedure PMV_NextPreferenceKey()
  If PMV_Preference\KeyElement
    If PMV_Preference\KeyElement = 1
      ChangeCurrentElement(PMV_PreferenceLine(), PMV_Preference\GroupElement)
    Else
      ChangeCurrentElement(PMV_PreferenceLine(), PMV_Preference\KeyElement)
    EndIf
    While NextElement(PMV_PreferenceLine())
      If PMV_PreferenceLine()\Typ = 1 ; Key
        PMV_Preference\KeyElement = @PMV_PreferenceLine()
        ProcedureReturn #True
      ElseIf PMV_PreferenceLine()\Typ = 0 ; Group
        Break
      EndIf
    Wend
  EndIf
  PMV_Preference\KeyElement = #False
  ProcedureReturn #False
EndProcedure

Procedure.s PMV_PreferenceKeyName()
  If PMV_Preference\KeyElement > 1
    ProcedureReturn PMV_Preference\KeyElement\Name
  EndIf
  ProcedureReturn ""
EndProcedure

Procedure.s PMV_PreferenceKeyValue()
  If PMV_Preference\KeyElement > 1
    ProcedureReturn PMV_Preference\KeyElement\Value
  EndIf
  ProcedureReturn ""
EndProcedure

Macro PMV_WritePreference__(Type, Format, Str=)
  Procedure PMV_WritePreference#Type(Keyword$, Value#Format)
    If PMV_Preference\NewGroup
      LastElement(PMV_PreferenceLine())
      AddElement(PMV_PreferenceLine())
      PMV_PreferenceLine()\Typ = 0 ; Group
      PMV_PreferenceLine()\Name = PMV_Preference\NewGroup
      PMV_Preference\NewGroup = ""
      PMV_Preference\GroupElement = @PMV_PreferenceLine()
      While PreviousElement(PMV_PreferenceLine())
        If PMV_PreferenceLine()\Typ = 0
          PMV_PreferenceLine()\NextGroup = PMV_Preference\GroupElement
          Break
        EndIf
      Wend
    EndIf

    If PMV_Preference\GroupElement > 1
      ChangeCurrentElement(PMV_PreferenceLine(), PMV_Preference\GroupElement)
    Else
      ResetList(PMV_PreferenceLine())
    EndIf
    
    PMV_Preference\Change = #True
  
    While NextElement(PMV_PreferenceLine())
      If PMV_PreferenceLine()\Typ = 1 ; Key
        If PMV_PreferenceLine()\Name = Keyword$
          PMV_PreferenceLine()\Value = Str#(Value)
          ProcedureReturn
        EndIf
      ElseIf PMV_PreferenceLine()\Typ = 0 ; Group
        PreviousElement(PMV_PreferenceLine())
        Break
      EndIf
    Wend
    
    AddElement(PMV_PreferenceLine())
    PMV_PreferenceLine()\Typ = 1
    PMV_PreferenceLine()\Name = Keyword$
    PMV_PreferenceLine()\Value = Str#(Value)
  EndProcedure
EndMacro
PMV_WritePreference__(String,.s)
PMV_WritePreference__(Long,.l,Str)
PMV_WritePreference__(Quad,.q,StrQ)
PMV_WritePreference__(Float,.f,StrF)
PMV_WritePreference__(double,.d,StrD)

Macro PMV_ReadPreference__(Type, Format, Val=)
  Procedure#Format PMV_ReadPreference#Type#(Keyword$, DefaultValue#Format)
    If PMV_Preference\GroupElement > 1
      ChangeCurrentElement(PMV_PreferenceLine(), PMV_Preference\GroupElement)
    Else
      ResetList(PMV_PreferenceLine())
    EndIf
    
    While NextElement(PMV_PreferenceLine())
      If PMV_PreferenceLine()\Typ = 1 ; Key
        If PMV_PreferenceLine()\Name = Keyword$
          ProcedureReturn Val#(PMV_PreferenceLine()\Value)
        EndIf
      ElseIf PMV_PreferenceLine()\Typ = 0 ; Group
        Break
      EndIf
    Wend
    
    ProcedureReturn DefaultValue#Format
  EndProcedure
EndMacro
PMV_ReadPreference__(String,$)
PMV_ReadPreference__(Long,.l, Val)
PMV_ReadPreference__(Quad,.q,ValQ)
PMV_ReadPreference__(Float,.f,ValF)
PMV_ReadPreference__(double,.d,ValD)

Procedure PMV_PreferenceCommant(Comment$)
  AddElement(PMV_PreferenceLine())
  PMV_PreferenceLine()\Typ = 2 ; Comment
  PMV_PreferenceLine()\Name = Comment$
EndProcedure

Procedure PMV_PreferenceGroup(GroupName$)
  Protected *Group.PMV_PreferenceLine
  ForEach PMV_PreferenceLine()
    If PMV_PreferenceLine()\Typ = 0 ; Group
      *Group = @PMV_PreferenceLine()
      Break
    EndIf
  Next
  If *Group
    Repeat
      If *Group\Name = GroupName$
        PMV_Preference\GroupElement = *Group
        ProcedureReturn #True
      EndIf
      *Group = *Group\NextGroup
    Until Not *Group
  EndIf
  PMV_Preference\NewGroup = GroupName$
  ProcedureReturn #False
EndProcedure

Procedure PMV_CreatePreferences(Filename$, Format=0)
  Protected File.l
  
  With PMV_Preference
    If \Change And \Filename
      PMV_ClosePreferences()
    EndIf
    \Change = #False
    \Filename = ""
    \NewGroup = ""
    \KeyElement = #False
    \GroupElement = #False
    ClearList(PMV_PreferenceLine())

    If Format And (Format <> #PB_Ascii And Format <> #PB_UTF8 And Format <> #PB_Unicode)
      ProcedureReturn #False
    EndIf
  
    File = CreateFile(#PB_Any, Filename$)
    If File
      CloseFile(File)
      \Filename = Filename$
      If Format
        \Format = Format
      Else
        CompilerIf #PB_Compiler_Unicode
          \Format = #PB_Unicode
        CompilerElse
          \Format = #PB_Ascii
        CompilerEndIf
      EndIf
      ProcedureReturn #True
    EndIf
    ProcedureReturn #False
  EndWith
EndProcedure

Procedure PMV_RemovePreferenceGroup(GroupName$)
  Protected *Group.PMV_PreferenceLine, *LastGroup.PMV_PreferenceLine
  ForEach PMV_PreferenceLine()
    If PMV_PreferenceLine()\Typ = 0 ; Group
      *Group = @PMV_PreferenceLine()
      Break
    EndIf
  Next
  If *Group
    Repeat
      If *Group\Name = GroupName$
        ChangeCurrentElement(PMV_PreferenceLine(), *Group)
        PMV_Preference\GroupElement = *Group
        If *Group = PMV_Preference\GroupElement
          PMV_Preference\GroupElement = *Group\NextGroup
          PMV_Preference\KeyElement = #False
        EndIf
        *LastGroup\NextGroup = *Group\NextGroup
        *Group = *Group\NextGroup
        DeleteElement(PMV_PreferenceLine())
        PMV_Preference\Change = #True
        While NextElement(PMV_PreferenceLine())
          If @PMV_PreferenceLine() = *Group
            ProcedureReturn
          EndIf
          DeleteElement(PMV_PreferenceLine())
        Wend
      EndIf
      *LastGroup = *Group
      *Group = *Group\NextGroup
    Until Not *Group
  EndIf
EndProcedure

Procedure PMV_RemovePreferenceKey(Name$)
  With PMV_Preference
    If \GroupElement
      If \GroupElement = 1
        ResetList(PMV_PreferenceLine())
        While NextElement(PMV_PreferenceLine())
          If PMV_PreferenceLine()\Typ = 0 ; Group
            Break
          EndIf
        Wend
      Else
        ChangeCurrentElement(PMV_PreferenceLine(), \GroupElement)
      EndIf  
     
      While NextElement(PMV_PreferenceLine())
        If PMV_PreferenceLine()\Typ = 1 ; Key
          If PMV_PreferenceLine()\Name = Name$
            If \KeyElement = @PMV_PreferenceLine()
              \KeyElement = #False
            EndIf
            DeleteElement(PMV_PreferenceLine())
            PMV_Preference\Change = #True
            ProcedureReturn
          ElseIf PMV_PreferenceLine()\Typ = 0 ; Group
            ProcedureReturn
          EndIf
        EndIf
      Wend
    EndIf
  EndWith
EndProcedure

CompilerIf #UseUnicodePreferenceAsPB
  Macro ClosePreferences()
    PMV_ClosePreferences()
  EndMacro
  Macro OpenPreferences(Filename)
    PMV_OpenPreferences(Filename)
  EndMacro
  Macro ExaminePreferenceGroups()
    PMV_ExaminePreferenceGroups()
  EndMacro
  Macro ExaminePreferenceKeys()
    PMV_ExaminePreferenceKeys()
  EndMacro
  Macro NextPreferenceGroup()
    PMV_NextPreferenceGroup()
  EndMacro
  Macro NextPreferenceKey()
    PMV_NextPreferenceKey()
  EndMacro
  Macro PreferenceGroupName()
    PMV_PreferenceGroupName()
  EndMacro
  Macro PreferenceKeyName()
    PMV_PreferenceKeyName()
  EndMacro
  Macro PreferenceKeyValue()
    PMV_PreferenceKeyValue()
  EndMacro
  Macro PreferenceCommant(Commant)
    PMV_PreferenceCommant(Commant)
  EndMacro
  Macro PreferenceGroup(GroupName)
    PMV_PreferenceGroup(GroupName)
  EndMacro
  Macro CreatePreferences(Filename,Format=0)
    PMV_CreatePreferences(Filename,Format)
  EndMacro
  Macro RemovePreferenceGroup(GroupName)
    PMV_RemovePreferenceGroup(GroupName)
  EndMacro
  Macro RemovePreferenceKey(Name)
    PMV_RemovePreferenceKey(Name)
  EndMacro
  Macro WritePreferenceString(Keyword, Value)
    PMV_WritePreferenceString(Keyword, Value)
  EndMacro
  Macro WritePreferenceLong(Keyword, Value)
    PMV_WritePreferenceLong(Keyword, Value)
  EndMacro
  Macro WritePreferenceQuad(Keyword, Value)
    PMV_WritePreferenceQuad(Keyword, Value)
  EndMacro
  Macro WritePreferenceFload(Keyword, Value)
    PMV_WritePreferenceFload(Keyword, Value)
  EndMacro
  Macro WritePreferenceDouble(Keyword, Value)
    PMV_WritePreferenceDouble(Keyword, Value)
  EndMacro
  Macro ReadPreferenceString(Keyword, DefaultValue)
    PMV_ReadPreferenceString(Keyword, DefaultValue)
  EndMacro
  Macro ReadPreferenceLong(Keyword, DefaultValue)
    PMV_ReadPreferenceLong(Keyword, DefaultValue)
  EndMacro
  Macro ReadPreferenceQuad(Keyword, DefaultValue)
    PMV_ReadPreferenceQuad(Keyword, DefaultValue)
  EndMacro
  Macro ReadPreferenceFloat(Keyword, DefaultValue)
    PMV_ReadPreferenceFloat(Keyword, DefaultValue)
  EndMacro
  Macro ReadPreferenceDouble(Keyword, DefaultValue)
    PMV_ReadPreferenceDouble(Keyword, DefaultValue)
  EndMacro
CompilerEndIf
Und damit jeder mal konkrete Zahlen sieht, hier nen kleines
Konsolenprogramm, welches die jeweiligen Zeitmessungen ausspuckt.
(Auf langsamen Rechnern eventuell die Werte erst mindern :lol: )

Code: Alles auswählen

#GroupSize = 300
#KeySize = 1000


EnableExplicit
Define.s GroupName, KeyName$, Key
Define.l Time, Group, KeyValue, Result

OpenConsole()

PrintN("  Gruppen: " + Str(#GroupSize) + "  Keys: " + Str(#KeySize))

PrintN("")
CompilerIf #PB_Compiler_Unicode
  PrintN("Unicode-Execute")
  PrintN("")
  PrintN(" PB-Preference-Befehle (UTF-8):")
CompilerElse
  PrintN("ASCII-Execute")
  PrintN("")
  PrintN(" PB-Preference-Befehle:")
CompilerEndIf

Print(" Preference erstellen ... ")
Time = ElapsedMilliseconds()
If CreatePreferences("Test.ini")
  For Group = 0 To #GroupSize
    PreferenceGroup(Str(Group))
    For KeyValue = 0 To #KeySize
      KeyName$ = Str(KeyValue) + " Times"
      WritePreferenceLong(KeyName$, KeyValue)
    Next
  Next
  ClosePreferences()
  PrintN(Str(ElapsedMilliseconds() - Time))
Else
  PrintN("Fehler")
EndIf
End
Print(" Preference oeffnen ... ")
Time = ElapsedMilliseconds()
If OpenPreferences("Test.ini")
  Time = ElapsedMilliseconds() - Time
  PrintN(Str(Time))
  
  Print(" Preference auslesen ... ")
  Time = ElapsedMilliseconds()
  ExaminePreferenceGroups()
  While NextPreferenceGroup()
    GroupName.s = PreferenceGroupName()
    ;Debug "[" + GroupName + "]"
    ExaminePreferenceKeys()
    While NextPreferenceKey()
      Key.s =  PreferenceKeyName() + " = " + PreferenceKeyValue()
      ;Debug Key
    Wend
  Wend
  Time = ElapsedMilliseconds() - Time
  PrintN(Str(Time))
  
  Print(" Preference schliessen ... ")
  Time = ElapsedMilliseconds()
  ClosePreferences()
  Time = ElapsedMilliseconds() - Time
  PrintN(Str(Time))
Else
  PrintN("Fehler")
EndIf

Print(" Preference durchsuchen ... ")
If OpenPreferences("Test.ini")
  Time = ElapsedMilliseconds()
  For Group = -1 To #GroupSize + 1
    If PreferenceGroup(Str(Group))
      For KeyValue = 0 To #KeySize
        KeyName$ = Str(KeyValue) + " Times"
        Result = ReadPreferenceLong(KeyName$, -1)
      Next
    EndIf
  Next
  Time = ElapsedMilliseconds() - Time
  ClosePreferences()
  PrintN(Str(Time))
Else
  PrintN("Fehler")
EndIf

IncludeFile "UnicodePreference.pbi"
PrintN("")
PrintN(" Unicode-Preference-Befehle:")
Print(" Preference erstellen ... ")
Time = ElapsedMilliseconds()
If CreatePreferences("Test.ini")
  
  For Group = 0 To #GroupSize
    PreferenceGroup(Str(Group))
    For KeyValue = 0 To #KeySize
      KeyName$ = Str(KeyValue) + " Times"
      WritePreferenceLong(KeyName$, KeyValue)
    Next
  Next
  ClosePreferences()
EndIf
PrintN(Str(ElapsedMilliseconds() - Time))

Print(" Preference oeffnen ... ")
Time = ElapsedMilliseconds()
If OpenPreferences("Test.ini")
  Time = ElapsedMilliseconds() - Time
  PrintN(Str(Time))
  
  Print(" Preference auslesen ... ")
  Time = ElapsedMilliseconds()
  ExaminePreferenceGroups()
  While NextPreferenceGroup()
    GroupName.s = PreferenceGroupName()
    ;Debug "[" + GroupName + "]"
    ExaminePreferenceKeys()
    While NextPreferenceKey()
      Key.s =  PreferenceKeyName() + " = " + PreferenceKeyValue()
    Wend
  Wend
  Time = ElapsedMilliseconds() - Time
  PrintN(Str(Time))
  
  Print(" Preference schliessen ... ")
  Time = ElapsedMilliseconds()
  ClosePreferences()
  Time = ElapsedMilliseconds() - Time
  PrintN(Str(Time))
Else
  PrintN("Fehler")
EndIf


Print(" Preference durchsuchen ... ")
If OpenPreferences("Test.ini")
  Time = ElapsedMilliseconds()
  For Group = -1 To #GroupSize + 1
    If PreferenceGroup(Str(Group))
      For KeyValue = 0 To #KeySize
        KeyName$ = Str(KeyValue); + " Times"
        Result = ReadPreferenceLong(KeyName$, -1)
        ;Debug KeyName$ + " = " + Str(Result)
      Next
    EndIf
  Next
  Time = ElapsedMilliseconds() - Time
  ClosePreferences()
  PrintN(Str(Time))
Else
  PrintN("Fehler")
EndIf


#UseFUnicodePreferenceAsPB = #False
IncludeFile "FastUnicodePreference.pbi"

PrintN("")
PrintN(" FastUnicode-Preference-Befehle:")
Print(" Preference erstellen ... ")
Time = ElapsedMilliseconds()
If PMV_CreateFPreferences("Test.ini")
  For Group = 0 To #GroupSize
    PMV_FPreferenceGroup(Str(Group))
    For KeyValue = 0 To #KeySize
      KeyName$ = Str(KeyValue) + " Times"
      PMV_WriteFPreferenceLong(KeyName$, KeyValue)
    Next
  Next
  PMV_CloseFPreferences()
  PrintN(Str(ElapsedMilliseconds() - Time))
Else
  PrintN("Fehler")
EndIf


Print(" Preference oeffnen ... ")
Time = ElapsedMilliseconds()
If Not PMV_ReadFPreferences("Test.ini")
  PrintN(" Fehler")
Else
  Time = ElapsedMilliseconds() - Time
  PrintN(Str(Time))
  
  Print(" Preference auslesen ... ")
  Time = ElapsedMilliseconds()
  PMV_ExamineFPreferenceGroups()
  While PMV_NextFPreferenceGroup()
    GroupName.s = PMV_FPreferenceGroupName()
    ;Debug "[" + GroupName + "]"
    PMV_ExamineFPreferenceKeys()
    While PMV_NextFPreferenceKey()
      Key.s = PMV_FPreferenceKeyName() + " = " + PMV_FPreferenceKeyValue()
      ;Debug Key
    Wend
  Wend
  Time = ElapsedMilliseconds() - Time
  PrintN(Str(Time))
  
  Print(" Preference schliessen ... ")
  Time = ElapsedMilliseconds()
  PMV_CloseFPreferences()
  Time = ElapsedMilliseconds() - Time
  PrintN(Str(Time))
EndIf

PrintN("")
PrintN(" ... fertig")
Input()
CloseConsole()
MFG PMV

Verfasst: 24.02.2007 03:31
von Kaeru Gaman
Hinschwarz:

hinweisen schreibt man mit einem 's', nicht mit zweien.

Verfasst: 24.02.2007 16:00
von PMV
/:-> ... ich war der festen überzeugung, es würde mit ß geschrieben /:->

^^danke

MFG PMV

Verfasst: 25.02.2007 17:48
von PMV
Wofür hab ich eigentlich getestet? /:->

Fixed: ExaminePreferenceGroups() und ExaminePreferenceKeys() als Macro vergessen
Fixed: NextPreferenceKey() gab immer am ende der Datei 0 zurück, auch wenn noch 1 Key gefunden wurde
Fixed: NextPreferenceKey() hat die Dateizeiger nicht zurück gesetzt, wenn eine Gruppenzeile eingelesen wurde

MFG PMV

Verfasst: 01.03.2007 04:07
von PMV
Ich hab grad mal per Zufall die Hilfe von PB durchforstet, nennt es
Langweile :lol: ... und was les ich? Die PB- Preference-Dateien erstellen
im Unicode-Modus UFT8 Dateien /:-> ... auf die Idee bin ich natürlich
garnicht gekommen ... :freak: ... aber es stimmt :shock:

^^naja ... damit hat sich das ganze hier dann wohl erledigt.
Aber wer gerne 2 Preference-Dateien gleichzeitig verwenden will, könnte
dann eventuell doch was mit anfangen :lol: ... so wie ich, doch nicht
ganz umsonnst das ganze hier :roll:

Ahja ... hab noch nen Fehler gefunden:
Fixed: wenn CreatePreference()/ CreateFPreference() UTF8 oder UTF16 als Format übergeben wurde, wurde ein Fehler angezeigt

MFG PMV

Verfasst: 01.03.2007 08:00
von ts-soft
Das stand schon in der Readme zur Beta von PB4. Hab mir nur gedacht,
Du wirst schon Wissen wofür es nütze ist :mrgreen:

Verfasst: 01.03.2007 16:50
von PMV
ts-soft hat geschrieben:Das stand schon in der Readme zur Beta von PB4. Hab mir nur gedacht,
Du wirst schon Wissen wofür es nütze ist :mrgreen:
^^Selbst wenn ichs da gelesen hab, hab ichs schon lange wieder
vergessen. Zumal ich mich damals nicht für Unicode interessierte ... wie
man merkt beschäftige ich mich erst seit ner Wochen damit /:-> und hab
mich auf die Aussage in der Hilfe zu den Preference-Befehlen verlassen.
Naja Andre hat PN und bin sicher, er wird das dann nachholen^^
Ich denke, viele andere werden das auch nicht gewusst haben :wink:

^^Aber die Preference-Befehle kommen mit UTF16 nicht klar, somit hat
es doch nen sinn ... fals jemand unbedingt dieses Format braucht <)

MFG PMV

Verfasst: 21.08.2007 10:22
von IngolfZ
PMV hat geschrieben:Aber die Preference-Befehle kommen mit UTF16 nicht klar, somit hat
es doch nen sinn ... fals jemand unbedingt dieses Format braucht <)
MFG PMV
Und damit sich auch mal jemand meldet, genau das brauche ich. Danke dafür :allright:

Mir ist jedoch eine Sache aufgefallen, die noch nicht ganz rund ist.
Wenn man mit ExaminePreferenceKeys eine Gruppe durchforstet, werden auch Leerzeilen aus der Ini-Datei geliefert (Len(PreferenceKeyName()) = 0).
Für meinen Anwendungsfall kann ich mir helfen, indem ich diese leeren Strings "aussortiere".

Verfasst: 21.08.2007 16:24
von PMV
oh ... da hab ich wohl noch ne Abfrage beim Einlesen vergessen, naja,
sind ja nur 7 Zeichen mehr im Code :lol:

Ich habs nicht getestet, aber da es keine weltbewegende Änderung war,
sollte es auch ohne gehen, sonnst fang ich an an mir zu zweifeln /:->

Danke fürs melden.

Edit: Natürlich gehts nicht ... war ja klar :? /:->

MFG PMV

Verfasst: 22.08.2007 07:56
von IngolfZ
Sorry, wenn ich dich jetzt an dir selbst zweifeln lasse, aber deine Korrektur funktioniert leider nicht. :?

Ich musste erst mal den "Alt-Code" mit deinem neuen Code vergleichen, um herauszufinden, was du gemacht hast.

Die erweiterte Abfrage

Code: Alles auswählen

ElseIf Line
in PMV_OpenPreferences(Filename$) kommt zu spät. Du hast vorher, unabhängig vom Inhalt der Ini-Zeile mit

Code: Alles auswählen

AddElement(PMV_PreferenceLine())
ein Element angelegt, das aber leer bleibt.

Ich habe das Thema folgendermaßen "gelöst":

Code: Alles auswählen

    File = OpenFile(#PB_Any, Filename$) 
    If File 
      \Format = ReadStringFormat(File) 
      If \Format = #PB_Ascii Or \Format = #PB_UTF8 Or \Format = #PB_Unicode 
        While Not Eof(File) 
; Anpassung IZ 20070821
;           AddElement(PMV_PreferenceLine()) 
          Line = Trim(ReadString(File, PMV_Preference\Format)) 
          If Len(Line) = 0
            Continue ; bei Leerzeile kein neues Element anlegen
          EndIf 
; Ende Anpassung IZ 20070821
          AddElement(PMV_PreferenceLine()) ; Element nur anlegen, wenn es keine Leerzeile ist
          If Left(Line, 1) = "[" 
            PMV_PreferenceLine()\Typ = 0 
            If *LastGroup 
Ach so, ich sollte vielleicht noch erwähnen, wie meine ini aufgebaut ist:

Code: Alles auswählen

Einige Kommentarzeilen
Leerzeile(n)
Gruppen-Name
einige Schlüssel (gegliedert durch Leerzeilen)
Leerzeile(n)
Gruppen-Name usw
Bei diesem Aufbau wird nicht einmal der erste Gruppen-Name erkannt. :cry: