ClearList() -> Error -.-

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

ClearList() -> Error -.-

Beitrag von PMV »

Hi, die blöde Preference-Lib kann (auch laut hilfe) nur Ascii, da ich aber
Unicode nun doch mal in einem Programm verwenden möchte und die
Preference-Befehle dafür sehr praktisch sind, hab ich mir kurzerhand
selber eine geschrieben. Natürlich nicht besonders Optimiert, aber es
klappt. Zumindest fast :lol:

... Ziel ist es, das ganze so funktionieren zu lassen, wie die PB-Befehle,
zumindest annährend. Bin denk ich mal auf dem richtigen weg *lol* ...
die Werte schreib ich in eine Linkedlist ... nur wenn ich die Linkedlist
leeren will, gibs nen Fehler :?

Vielleicht kann einer von euch mir ja helfen ... bitte *anfleh* :cry:

Code: Alles auswählen

; © 2007 by PMV
; UnicodePreference.pbi
; PB 4.02

Structure PMV_PreferenceLine
  Typ.b ;0 = Group ;1 = Key + Value ; 2 = Commend
  StructureUnion
    Group.s
    Key.s
    Comment.s
  EndStructureUnion
  StructureUnion
    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, "[" + \Group + "]", PMV_Preference\Format)
            
            Case 1 ;Key
              WriteStringN(File, \Key + " = " + \Value, PMV_Preference\Format)
              
            Case 2 ;Comment
              WriteStringN(File, "; " + \Comment, PMV_Preference\Format)
          EndSelect
        Next
        CloseFile(File)
      EndIf
      PMV_Preference\Change = #False
    EndIf
    ClearList(PMV_PreferenceLine()) ;-ERROR?
    PMV_Preference\Filename = ""
    PMV_Preference\Format = 0
  EndWith
EndProcedure

Procedure PMV_OpenPreferences(Filename$)
  Protected Pos.l, Line.s, File.l, *LastGroup
  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)
          AddElement(PMV_PreferenceLine())
          Line = Trim(ReadString(File, PMV_Preference\Format))
          If Left(Line, 1) = "["
            PMV_PreferenceLine()\Typ = 0
            If *LastGroup
              PMV_PreferenceLine()\NextGroup = *LastGroup
            EndIf
            *LastGroup = @PMV_PreferenceLine()
            Pos = FindString(Line, "]", 1)
            If Pos 
              PMV_PreferenceLine()\Group = Mid(Line, 2, Pos - 2) 
            Else
              PMV_PreferenceLine()\Group = Right(Line, Len(Line) - 1)
            EndIf
          ElseIf Left(Line, 1) = ";"
            PMV_PreferenceLine()\Typ = 2
            PMV_PreferenceLine()\Comment = LTrim(Right(Line, Len(Line) - 1))
          Else
            PMV_PreferenceLine()\Typ = 1
            Pos = FindString(Line, "=", 1)
            If Not Pos 
              PMV_PreferenceLine()\Key = Line
            Else
              PMV_PreferenceLine()\Key = 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\Group
  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\Key
  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()\Group = 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
      ProcedureReturn
    Else
      If PMV_Preference\GroupElement > 1
        ChangeCurrentElement(PMV_PreferenceLine(), PMV_Preference\GroupElement)
      Else
        ResetList(PMV_PreferenceLine())
      EndIf
    EndIf
    
    PMV_Preference\Change = #True
  
    While NextElement(PMV_PreferenceLine())
      If PMV_PreferenceLine()\Typ = 1 ; Key
        If PMV_PreferenceLine()\Key = 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()\Key = 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()\Key = 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()\Comment = Comment$
EndProcedure

Procedure PMV_PreferenceGroup(GroupName$)
  Protected *Group.PMV_PreferenceLine
  ForEach PMV_PreferenceLine()
    If PMV_PreferenceLine()\Typ = 0 ; Group
      *Group = @PMV_PreferenceLine()
    EndIf
  Next
  If *Group
    Repeat
      If *Group\Group = 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$)
  Protected File.l
  
  With PMV_Preference
    If \Change And \Filename
      PMV_ClosePreferences()
    EndIf
    \Change = #False
    \Filename = ""
    \NewGroup = ""
    \KeyElement = #False
    \GroupElement = #False
    ClearList(PMV_PreferenceLine())
  
    File = CreateFile(#PB_Any, Filename$)
    If File
      CloseFile(File)
      \Filename = Filename$
      \Format = #PB_Unicode
      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()
    EndIf
  Next
  If *Group
    Repeat
      If *Group\Group = GroupName$
        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())
        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()\Key = Name$
            If \KeyElement = @PMV_PreferenceLine()
              \KeyElement = #False
            EndIf
            DeleteElement(PMV_PreferenceLine())
            ProcedureReturn
          ElseIf PMV_PreferenceLine()\Typ = 0 ; Group
            ProcedureReturn
          EndIf
        EndIf
      Wend
    EndIf
  EndWith
EndProcedure


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)
  PMV_CreatePreferences(Filename)
EndMacro
Macro RemovePreferenceGroup(GroupName)
  PMV_RemovePreferenceGroup(GroupName)
EndMacro
Macro RemovePreferenceKey(Name)
  PMV_RemovePreferenceKey(Name)
EndMacro
Macro ReadPreference
  PMV_ReadPreference
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
Geht natürlich noch viel besser ... aber so lang ich die Fehlermeldung
bekomm hab ich so wie so keine lust, weiter drann zu pfeilen -.-
Zumal dieses Zwischenprojekt garnicht geplant war /:->

Naja hier das Programm zum testen:

Code: Alles auswählen

IncludeFile "UnicodePreference.pbi"
Define Time.l, GroupName.s, Key.s
OpenConsole()
Time = ElapsedMilliseconds()
If CreatePreferences("Test.ini")
  For Group = 0 To 10
    PreferenceGroup(Str(Group))
    For KeyValue = 0 To 100
      KeyName$ = Str(KeyValue) + " Times"
      WritePreferenceLong(KeyName$, KeyValue)
    Next
  Next
  ClosePreferences() ;-Error in ClearList()
EndIf
PrintN(Str(ElapsedMilliseconds() - Time))

Time = ElapsedMilliseconds()
If OpenPreferences("Test.ini")
  ExaminePreferenceGroups()
  While NextPreferenceGroup()
    GroupName.s =  "[" + PreferenceGroupName() + "]"
    ;PrintN(GroupName)
    ExaminePreferenceKeys()
    While NextPreferenceKey()
      Key.s =  PreferenceKeyName() + " = " + PreferenceKeyValue()
      ;PrintN(Key)
    Wend
  Wend
  ClosePreferences()
EndIf
Time = ElapsedMilliseconds() - Time
PrintN(Str(Time))
Input()
CloseConsole()
Ich hoffe ich hab da irgend wo nen Fehler ... sonnst müsst ich anstelle der
PB-LinkedList mal wieder ne eigene schreiben -.-

Danke schon mal für eure mühe :D

Edit: mir sind grad die Beta-Libs eingefallen, aber das Problem besteht
weiter :cry:

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Pruefe mal PMV_Preference\NewGroup, also in etwa so :

Code: Alles auswählen

      If PMV_Preference\NewGroup
        PMV_PreferenceLine()\Group = PMV_Preference\NewGroup
      EndIf 
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Wo soll ich das wann prüfen?
Sorry, ich kann dir grad nicht folgen -.-

Das mach ich doch in PMV_WriteStringXYZ(), oder was meinst du?

MFG PMV

Edit: http://www.purebasic.fr/german/viewtopic.php?t=12109
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Antworten