New topic in Off-Topic: 

INI Class for you!

octnix - Mon May 05, 2008 8:40 am

<http://forums.realsoftware.com/viewtopic.php?t=9334>
                                                                                
                                                                                
I didn't know where else to post this so I'm doing it here.  I wrote an INI 
file parser.  It will load and save INI files as standard text files.  Since 
this is in pure REALbasic code, I believe that it is OS independant.  There may 
be bugs, so please post them as you find them.  This class is similar to the 
way Dictionary is used, then again, it is based on Dictionary.

Enjoy!

Save as INI.xml and import into RB.
Code:<?xml version="1.0"?>
<RBProject version="2006r3">
<block type="Module" ID="1200019455">
<ObjName>INI</ObjName>
<ObjContainerID>1977964543</ObjContainerID>
<IsClass>1</IsClass>
<IsInterface>0</IsInterface>
<Compatibility></Compatibility>
<Method>
<ItemName>HasKey</ItemName>
<Compatibility></Compatibility>
<Visible>1</Visible>
<ItemSource>
<TextEncoding>134217984</TextEncoding>
<SourceLine>Function HasKey(aCategory As String, aKey As String) As 
Boolean</SourceLine>
<SourceLine>// Init var.</SourceLine>
<SourceLine>Dim Temp As Dictionary</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Not nil?</SourceLine>
<SourceLine>If Local &lt;&gt; Nil Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Valid category?</SourceLine>
<SourceLine>If Local.HasKey( aCategory ) Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Copy category.</SourceLine>
<SourceLine>Temp = Local.Value( aCategory )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Return Temp.HasKey( aKey )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Return False</SourceLine>
<SourceLine>End Function</SourceLine>
</ItemSource>
<TextEncoding>134217984</TextEncoding>
<AliasName></AliasName>
<ItemFlags>0</ItemFlags>
<IsShared>0</IsShared>
<ItemParams>aCategory As String, aKey As String</ItemParams>
<ItemResult>Boolean</ItemResult>
</Method>
<Method>
<ItemName>HasCategory</ItemName>
<Compatibility></Compatibility>
<Visible>1</Visible>
<ItemSource>
<TextEncoding>134217984</TextEncoding>
<SourceLine>Function HasCategory(aCategory As String) As Boolean</SourceLine>
<SourceLine>// Not nil?</SourceLine>
<SourceLine>If Local &lt;&gt; Nil Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Return Local.HasKey( aCategory )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Return False</SourceLine>
<SourceLine>End Function</SourceLine>
</ItemSource>
<TextEncoding>134217984</TextEncoding>
<AliasName></AliasName>
<ItemFlags>0</ItemFlags>
<IsShared>0</IsShared>
<ItemParams>aCategory As String</ItemParams>
<ItemResult>Boolean</ItemResult>
</Method>
<Method>
<ItemName>Value</ItemName>
<Compatibility></Compatibility>
<Visible>1</Visible>
<ItemSource>
<TextEncoding>134217984</TextEncoding>
<SourceLine>Function Value(aCategory As String, aKey As String, aValue As 
Variant = Nil) As Variant</SourceLine>
<SourceLine>// Init var.</SourceLine>
<SourceLine>Dim Temp As Dictionary</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Not nil?</SourceLine>
<SourceLine>If Local &lt;&gt; Nil Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Have a value?</SourceLine>
<SourceLine>If aValue &lt;&gt; Nil Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// New category?</SourceLine>
<SourceLine>If Not Local.HasKey( aCategory ) Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Create the category.</SourceLine>
<SourceLine>Local.Value( aCategory ) = New Dictionary ( )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Copy category.</SourceLine>
<SourceLine>Temp = Local.Value( aCategory )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Set pair.</SourceLine>
<SourceLine>Temp.Value( aKey ) = aValue</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Update category.</SourceLine>
<SourceLine>Local.Value( aCategory ) = Temp</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Else</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Have category?</SourceLine>
<SourceLine>If Local.HasKey( aCategory ) Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Copy category.</SourceLine>
<SourceLine>Temp = Local.Value( aCategory )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Have key?</SourceLine>
<SourceLine>If Temp.HasKey( aKey ) Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Return Temp.Value( aKey )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Else</SourceLine>
<SourceLine></SourceLine>
<SourceLine>SError( "Invalid key, " + aKey + ", in category, " + aCategory + 
"." )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Else</SourceLine>
<SourceLine></SourceLine>
<SourceLine>SError( "Invalid category, " + aCategory + "." )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Else</SourceLine>
<SourceLine></SourceLine>
<SourceLine>SError( "INI file not loaded." )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Return Nil</SourceLine>
<SourceLine>End Function</SourceLine>
</ItemSource>
<TextEncoding>134217984</TextEncoding>
<AliasName></AliasName>
<ItemFlags>0</ItemFlags>
<IsShared>0</IsShared>
<ItemParams>aCategory As String, aKey As String, aValue As Variant = 
Nil</ItemParams>
<ItemResult>Variant</ItemResult>
</Method>
<Method>
<ItemName>Value</ItemName>
<Compatibility></Compatibility>
<Visible>1</Visible>
<ItemSource>
<TextEncoding>134217984</TextEncoding>
<SourceLine>Sub Value(aCategory As String, aKey As String, Assigns aValue As 
Variant)</SourceLine>
<SourceLine>Call Value( aCategory, aKey, aValue )</SourceLine>
<SourceLine>End Sub</SourceLine>
</ItemSource>
<TextEncoding>134217984</TextEncoding>
<AliasName></AliasName>
<ItemFlags>0</ItemFlags>
<IsShared>0</IsShared>
<ItemParams>aCategory As String, aKey As String, Assigns aValue As 
Variant</ItemParams>
<ItemResult></ItemResult>
</Method>
<Method>
<ItemName>Key</ItemName>
<Compatibility></Compatibility>
<Visible>1</Visible>
<ItemSource>
<TextEncoding>134217984</TextEncoding>
<SourceLine>Function Key(aCategory As String, aIndex As Integer) As 
String</SourceLine>
<SourceLine>// Init var.</SourceLine>
<SourceLine>Dim Temp As Dictionary</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Not nil?</SourceLine>
<SourceLine>If Local &lt;&gt; Nil Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Valid category?</SourceLine>
<SourceLine>If Local.HasKey( aCategory ) Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Copy category.</SourceLine>
<SourceLine>Temp = Local.Value( aCategory )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Within bounds?</SourceLine>
<SourceLine>If aIndex &lt;= Temp.Count - 1 Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Return Temp.Key( aIndex )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Else</SourceLine>
<SourceLine></SourceLine>
<SourceLine>SError( "Key index out of bounds in category, " + aCategory + "." 
)</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Else</SourceLine>
<SourceLine></SourceLine>
<SourceLine>SError( "Invalid category, " + aCategory + "." )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Else</SourceLine>
<SourceLine></SourceLine>
<SourceLine>SError( "INI file not loaded." )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Return ""</SourceLine>
<SourceLine>End Function</SourceLine>
</ItemSource>
<TextEncoding>134217984</TextEncoding>
<AliasName></AliasName>
<ItemFlags>0</ItemFlags>
<IsShared>0</IsShared>
<ItemParams>aCategory As String, aIndex As Integer</ItemParams>
<ItemResult>String</ItemResult>
</Method>
<Method>
<ItemName>Category</ItemName>
<Compatibility></Compatibility>
<Visible>1</Visible>
<ItemSource>
<TextEncoding>134217984</TextEncoding>
<SourceLine>Function Category(aIndex As Integer) As String</SourceLine>
<SourceLine>// Not nil?</SourceLine>
<SourceLine>If Local &lt;&gt; Nil Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Within bounds?</SourceLine>
<SourceLine>If aIndex &gt; Local.Count - 1 Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Return Local.Key( aIndex )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Else</SourceLine>
<SourceLine></SourceLine>
<SourceLine>SError( "Category index out of bounds." )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Else</SourceLine>
<SourceLine></SourceLine>
<SourceLine>SError( "INI file not loaded." )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Return ""</SourceLine>
<SourceLine>End Function</SourceLine>
</ItemSource>
<TextEncoding>134217984</TextEncoding>
<AliasName></AliasName>
<ItemFlags>0</ItemFlags>
<IsShared>0</IsShared>
<ItemParams>aIndex As Integer</ItemParams>
<ItemResult>String</ItemResult>
</Method>
<Method>
<ItemName>SError</ItemName>
<Compatibility></Compatibility>
<Visible>1</Visible>
<ItemSource>
<TextEncoding>134217984</TextEncoding>
<SourceLine>Sub SError(Message As String)</SourceLine>
<SourceLine>// Debugging?</SourceLine>
<SourceLine>If Debug Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Beep.</SourceLine>
<SourceLine>Beep( )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Display error.</SourceLine>
<SourceLine>Call MsgBox( Message, 16, "INI Error" )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Else</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Beep.</SourceLine>
<SourceLine>Beep( )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Display error.</SourceLine>
<SourceLine>Call MsgBox( "An internal error has occurred.", 16, "INI Error" 
)</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Quit.</SourceLine>
<SourceLine>Quit( )</SourceLine>
<SourceLine>End Sub</SourceLine>
</ItemSource>
<TextEncoding>134217984</TextEncoding>
<AliasName></AliasName>
<ItemFlags>33</ItemFlags>
<IsShared>0</IsShared>
<ItemParams>Message As String</ItemParams>
<ItemResult></ItemResult>
</Method>
<Method>
<ItemName>Open</ItemName>
<Compatibility></Compatibility>
<Visible>1</Visible>
<ItemSource>
<TextEncoding>134217984</TextEncoding>
<SourceLine>Function Open(aFile As String, Create As Boolean = False) As 
Boolean</SourceLine>
<SourceLine>// Init var.</SourceLine>
<SourceLine>Dim Handle As TextOutputStream</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Is nil?</SourceLine>
<SourceLine>If Local = Nil Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Create folder item.</SourceLine>
<SourceLine>File = GetFolderItem( aFile )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// File does not exist?</SourceLine>
<SourceLine>If Not File.Exists Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Create file?</SourceLine>
<SourceLine>If Create Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Create it.</SourceLine>
<SourceLine>Handle = File.CreateTextFile( )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Failure?</SourceLine>
<SourceLine>If Handle.LastErrorCode &lt;&gt; 0 Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>SError( "INI file, " + aFile + ", could not be created." 
)</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Return False</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Close the handle.</SourceLine>
<SourceLine>Handle.Close( )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Parse the file.</SourceLine>
<SourceLine>Return Parse( )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Else</SourceLine>
<SourceLine></SourceLine>
<SourceLine>SError( "INI file, " + aFile + ", does not exist." )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Else</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// File readable?</SourceLine>
<SourceLine>If File.IsReadable Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Parse the file.</SourceLine>
<SourceLine>Return Parse( )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Else</SourceLine>
<SourceLine></SourceLine>
<SourceLine>SError( "INI file, " + aFile + ", is not readable." )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Else</SourceLine>
<SourceLine></SourceLine>
<SourceLine>SError( "INI file is opened.  Close first or create new object." 
)</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine>End Function</SourceLine>
</ItemSource>
<TextEncoding>134217984</TextEncoding>
<AliasName></AliasName>
<ItemFlags>0</ItemFlags>
<IsShared>0</IsShared>
<ItemParams>aFile As String, Create As Boolean = False</ItemParams>
<ItemResult>Boolean</ItemResult>
</Method>
<Method>
<ItemName>Parse</ItemName>
<Compatibility></Compatibility>
<Visible>1</Visible>
<ItemSource>
<TextEncoding>134217984</TextEncoding>
<SourceLine>Function Parse() As Boolean</SourceLine>
<SourceLine>// Init vars.</SourceLine>
<SourceLine>Dim aKey        As String</SourceLine>
<SourceLine>Dim aValue     As Variant</SourceLine>
<SourceLine>Dim Contents As String</SourceLine>
<SourceLine>Dim Handle     As TextInputStream</SourceLine>
<SourceLine>Dim Index      As Integer</SourceLine>
<SourceLine>Dim Line         As String</SourceLine>
<SourceLine>Dim Lines()     As String</SourceLine>
<SourceLine>Dim Parts()     As String</SourceLine>
<SourceLine>Dim Temp       As String</SourceLine>
<SourceLine>Dim Temp2     As Dictionary</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Open the file for reading.</SourceLine>
<SourceLine>Handle = File.OpenAsTextFile( )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Handle nil?</SourceLine>
<SourceLine>If Handle = Nil Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>SError( "Unable to open file, " + File.Name + ", for reading." 
)</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Read entire file.</SourceLine>
<SourceLine>Contents = Handle.ReadAll( )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Read errors?</SourceLine>
<SourceLine>If Handle.ReadError Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Close handle.</SourceLine>
<SourceLine>Handle.Close( )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>SError( "Unable to read contents of INI file, " + File.Name + "." 
)</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Return False</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Else</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Close handle.</SourceLine>
<SourceLine>Handle.Close( )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Break lines.</SourceLine>
<SourceLine>Lines = Contents.Split( EndOfLine( ) )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Empty contents.</SourceLine>
<SourceLine>Contents = ""</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Intialize local dictionary.</SourceLine>
<SourceLine>Local = New Dictionary ( )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Loop through the lines.</SourceLine>
<SourceLine>For Index = 0 To UBound( Lines )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Get the line.</SourceLine>
<SourceLine>Line = Lines( Index )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Clean the line.</SourceLine>
<SourceLine>Line = LTrim( Line )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Line not empty?</SourceLine>
<SourceLine>If Line &lt;&gt; "" Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Not a comment?</SourceLine>
<SourceLine>If Line.Left(1) &lt;&gt; ";" Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Category?</SourceLine>
<SourceLine>If Line.Left(1) = "[" Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Copy name.</SourceLine>
<SourceLine>Temp = Line.Replace( "[", "" ).Replace( "]", "" )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Empty name?</SourceLine>
<SourceLine>If Temp = "" Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>SError( "Invalid INI file category, " + File.Name + "." 
)</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Return False</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>ElseIf Temp &lt;&gt; "" Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Split the line.</SourceLine>
<SourceLine>Parts = Line.Split( "=" )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Invalid part count?</SourceLine>
<SourceLine>If UBound( Parts ) &lt; 1 Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>SError( "Invalid INI file key, " + File.Name + "." )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Return False</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Get name.</SourceLine>
<SourceLine>aKey = RTrim( Parts(0) )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Remove name.</SourceLine>
<SourceLine>Parts.Remove(0)</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Get value.</SourceLine>
<SourceLine>aValue = Join( Parts, "=" )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// New category?</SourceLine>
<SourceLine>If Not Local.HasKey( Temp ) Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Create category.</SourceLine>
<SourceLine>Local.Value( Temp ) = New Dictionary ( )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Copy category.</SourceLine>
<SourceLine>Temp2 = Local.Value( Temp )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Add pair.</SourceLine>
<SourceLine>Temp2.Value( aKey ) = aValue</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Update category.</SourceLine>
<SourceLine>Local.Value( Temp ) = Temp2</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Next</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Return True</SourceLine>
<SourceLine>End Function</SourceLine>
</ItemSource>
<TextEncoding>134217984</TextEncoding>
<AliasName></AliasName>
<ItemFlags>33</ItemFlags>
<IsShared>0</IsShared>
<ItemParams></ItemParams>
<ItemResult>Boolean</ItemResult>
</Method>
<Method>
<ItemName>Compile</ItemName>
<Compatibility></Compatibility>
<Visible>1</Visible>
<ItemSource>
<TextEncoding>134217984</TextEncoding>
<SourceLine>Function Compile() As Boolean</SourceLine>
<SourceLine>// Init vars.</SourceLine>
<SourceLine>Dim aCategory As String</SourceLine>
<SourceLine>Dim aKey          As String</SourceLine>
<SourceLine>Dim aValue       As Variant</SourceLine>
<SourceLine>Dim Index        As Integer</SourceLine>
<SourceLine>Dim Index2      As Integer</SourceLine>
<SourceLine>Dim Temp         As Dictionary</SourceLine>
<SourceLine>Dim Write         As TextOutputStream</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Not nil?</SourceLine>
<SourceLine>If Local &lt;&gt; Nil Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Open for writing.</SourceLine>
<SourceLine>Write = File.CreateTextFile( )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Not nil?</SourceLine>
<SourceLine>If Write &lt;&gt; Nil Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Loop through categories.</SourceLine>
<SourceLine>For Index = 0 To Local.Count - 1</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Get category name.</SourceLine>
<SourceLine>aCategory = Local.Key( Index )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Write category name.</SourceLine>
<SourceLine>Write.Write( EndOfLine( ) + "[" + aCategory + "]" + EndOfLine( ) 
)</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Any write errors?</SourceLine>
<SourceLine>If Write.WriteError Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Close file.</SourceLine>
<SourceLine>Write.Close( )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>SError( "Unable to write to file, " + File.Name + "." )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Return False</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Copy category.</SourceLine>
<SourceLine>Temp = Local.Value( aCategory )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Loop through pairs.</SourceLine>
<SourceLine>For Index2 = 0 To Temp.Count - 1</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Get key name.</SourceLine>
<SourceLine>aKey = Temp.Key( Index2 )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Get value.</SourceLine>
<SourceLine>aValue = Temp.Value( aKey )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Write pair.</SourceLine>
<SourceLine>Write.Write( aKey + "=" + aValue + EndOfLine( ) )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Any write errors?</SourceLine>
<SourceLine>If Write.WriteError Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Close file.</SourceLine>
<SourceLine>Write.Close( )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>SError( "Unable to write to file, " + File.Name + "." )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Return False</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Next</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Next</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Close file.</SourceLine>
<SourceLine>Write.Close( )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Return True</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Return False</SourceLine>
<SourceLine>End Function</SourceLine>
</ItemSource>
<TextEncoding>134217984</TextEncoding>
<AliasName></AliasName>
<ItemFlags>33</ItemFlags>
<IsShared>0</IsShared>
<ItemParams></ItemParams>
<ItemResult>Boolean</ItemResult>
</Method>
<Method>
<ItemName>Close</ItemName>
<Compatibility></Compatibility>
<Visible>1</Visible>
<ItemSource>
<TextEncoding>134217984</TextEncoding>
<SourceLine>Function Close() As Boolean</SourceLine>
<SourceLine>// Not nil?</SourceLine>
<SourceLine>If Local &lt;&gt; Nil Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// File exists?</SourceLine>
<SourceLine>If File.Exists Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// File is writeable?</SourceLine>
<SourceLine>If File.IsWriteable Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Return Compile( )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Else</SourceLine>
<SourceLine></SourceLine>
<SourceLine>SError( "INI file, " + File.Name + ", is not writeable." 
)</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Else</SourceLine>
<SourceLine></SourceLine>
<SourceLine>SError( "INI file, " + File.Name + ", does not exist." 
)</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Return False</SourceLine>
<SourceLine>End Function</SourceLine>
</ItemSource>
<TextEncoding>134217984</TextEncoding>
<AliasName></AliasName>
<ItemFlags>0</ItemFlags>
<IsShared>0</IsShared>
<ItemParams></ItemParams>
<ItemResult>Boolean</ItemResult>
</Method>
<Method>
<ItemName>Count</ItemName>
<Compatibility></Compatibility>
<Visible>1</Visible>
<ItemSource>
<TextEncoding>134217984</TextEncoding>
<SourceLine>Function Count(aCategory As String = "") As Integer</SourceLine>
<SourceLine>// Init var.</SourceLine>
<SourceLine>Dim Temp As Dictionary</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Not nil?</SourceLine>
<SourceLine>If Local &lt;&gt; Nil Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Have category?</SourceLine>
<SourceLine>If aCategory &lt;&gt; "" Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Missing category?</SourceLine>
<SourceLine>If Not Local.HasKey( aCategory ) Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Return 0</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Copy category.</SourceLine>
<SourceLine>Temp = Local.Value( aCategory )</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Return Temp.Count</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Else</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Return Local.Count</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Return 0</SourceLine>
<SourceLine>End Function</SourceLine>
</ItemSource>
<TextEncoding>134217984</TextEncoding>
<AliasName></AliasName>
<ItemFlags>0</ItemFlags>
<IsShared>0</IsShared>
<ItemParams>aCategory As String = ""</ItemParams>
<ItemResult>Integer</ItemResult>
</Method>
<Method>
<ItemName>Opened</ItemName>
<Compatibility></Compatibility>
<Visible>1</Visible>
<ItemSource>
<TextEncoding>134217984</TextEncoding>
<SourceLine>Function Opened() As Boolean</SourceLine>
<SourceLine>// Opened?</SourceLine>
<SourceLine>If Local &lt;&gt; Nil Then</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// Yes.</SourceLine>
<SourceLine>Return True</SourceLine>
<SourceLine></SourceLine>
<SourceLine>Else</SourceLine>
<SourceLine></SourceLine>
<SourceLine>// No.</SourceLine>
<SourceLine>Return False</SourceLine>
<SourceLine></SourceLine>
<SourceLine>End If</SourceLine>
<SourceLine>End Function</SourceLine>
</ItemSource>
<TextEncoding>134217984</TextEncoding>
<AliasName></AliasName>
<ItemFlags>0</ItemFlags>
<IsShared>0</IsShared>
<ItemParams></ItemParams>
<ItemResult>Boolean</ItemResult>
</Method>
<Hook>
<ItemName>Untitled</ItemName>
<TextEncoding>134217984</TextEncoding>
<ItemFlags>33</ItemFlags>
<SystemFlags>0</SystemFlags>
<ItemParams></ItemParams>
<ItemResult></ItemResult>
</Hook>
<Property Flags="33" Compatibility="">Local As Dictionary</Property>
<Property Flags="0" Compatibility="">Debug As Boolean = False</Property>
<Property Flags="33" Compatibility="">File As FolderItem</Property>
<ViewBehavior>
<ViewProperty>
<ObjName>Name</ObjName>
<Visible>1</Visible>
<PropertyGroup>ID</PropertyGroup>
<InheritsFrom>Object</InheritsFrom>
</ViewProperty>
<ViewProperty>
<ObjName>Index</ObjName>
<Visible>1</Visible>
<PropertyGroup>ID</PropertyGroup>
<PropertyValue>-2147483648</PropertyValue>
<InheritsFrom>Object</InheritsFrom>
</ViewProperty>
<ViewProperty>
<ObjName>Super</ObjName>
<Visible>1</Visible>
<PropertyGroup>ID</PropertyGroup>
<InheritsFrom>Object</InheritsFrom>
</ViewProperty>
<ViewProperty>
<ObjName>Left</ObjName>
<Visible>1</Visible>
<PropertyGroup>Position</PropertyGroup>
<PropertyValue>0</PropertyValue>
<InheritsFrom>Object</InheritsFrom>
</ViewProperty>
<ViewProperty>
<ObjName>Top</ObjName>
<Visible>1</Visible>
<PropertyGroup>Position</PropertyGroup>
<PropertyValue>0</PropertyValue>
<InheritsFrom>Object</InheritsFrom>
</ViewProperty>
<ViewProperty>
<ObjName>Debug</ObjName>
<PropertyGroup>Behavior</PropertyGroup>
<PropertyValue>False</PropertyValue>
<ItemType>Boolean</ItemType>
</ViewProperty>
</ViewBehavior>
</block>
</RBProject>
                                                                                
        
_________________
Pheera                                  
                                                                                
                                                                                
                                                                                
                                                                                
                                        



-- 
Over 900 classes with 18000 functions in one REALbasic plug-in. 
The Monkeybread Software Realbasic Plugin v8.1. 

&lt;http://www.monkeybreadsoftware.de/realbasic/plugins.shtml&gt;

[email protected]

Reply via email to