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

... 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*

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
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()
PB-LinkedList mal wieder ne eigene schreiben -.-
Danke schon mal für eure mühe

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

MFG PMV