[Gambas-user] Settings: how to get (unknown) Keys?

Benoît Minisini gambas at ...1...
Sat Jul 5 17:41:06 CEST 2014


Le 05/07/2014 14:47, Benoît Minisini a écrit :
> Le 18/06/2014 15:08, wig a écrit :
>>
>> How the get the (unknown keys) from a Settings file?
>>
>>
>> Terminology of Keys and "Slot" for the group of keys in a settings file
>> taken from documentation;
>>
>> This gives the names of the slots:
>>
>>
>>    Dim SettingsToImport As New Settings(User.Home &/
>> ".config/gambas3/gambas3.conf")
>>
>>    Dim sKeySlot As String
>>    Dim iSlotCounter As Integer
>>
>>    For Each sKeySlot In SettingsToImport.Keys
>>      Debug sKeySlot
>>      Inc iSlotCounter
>>    Next
>>    Debug "  - - - - " & iSlotCounter
>>
>>
>> Works fine, gives me all the slotnames, and the count of e.g.23:
>>
>>> Editor
>>> FColorChooser
>>> FConnectionEditor
>> ...
>>> gb.form.mdi/FShortcut
>>> gb.form.mdi/FToolbarConfig
>>> gb.form.mdi/Toolbars/main
>>>     - - - - 23
>>
>> Next step; I want to have the keys themselves.  But how? (assuming I do
>> not know the keynames)
>>
>>
>>    Dim SettingsToImport As New Settings(User.Home &/
>> ".config/gambas3/gambas3.conf")
>>
>>    Dim sKey As String
>>    Dim iKeyCounter As Integer
>>
>>    Dim hSettingsKeys As _Settings_Keys  ' what I found in gb.settings
>> docum.
>>
>>    For Each sKeySlot In SettingsToImport.Keys
>>      Debug sKeySlot
>>      Inc iSlotCounter
>>
>>      hSettingsKeys = SettingsToImport.Keys[sKeySlot]  ' docum says
>> hSettings.Keys [ Parent As String ]
>>
>>      For Each sKeySlot In hSettingsKeys
>>        Inc iKeyCounter
>>        Debug iKeyCounter & ": " & sKey
>>      Next
>>
>>    Next
>>
>>
>>
>> Doesn't crash, doesn't freeze, but gives the output:
>>
>>> Editor
>>> 1: Font
>>> 2: KeywordsUseUpperCase
>>> KeywordsUseUpperCase
>>
>>
>> That's all, it stops.
>>
>> (I want to import a Settings file, not use it for my app itself; I know
>> how to save and use settings for my app).
>>
>> This in Gambas 3.4.1 on OpenSuse 13.1/KDE
>>
>>
>> WiG.
>>
>
> Well, I admit that the Settings interface is weird for that. :-/
>
> For the moment, you can't imbricate enumerations of the Keys property,
> unless you first put all keys in an intermediate string array.
>
> Something like that:
>
> Public Sub GetAllKeys(hSettings As Settings, Optional sParent As String,
> Optional aResult As String[]) As String[]
>
>    Dim aKeys As New String[]
>    Dim sKey As String
>
>    For Each sKey In hSettings[sParent].Keys
>      aKeys.Add(sKey)
>    Next
>
>    If Not aResult Then aResult = New String[]
>
>    For Each sKey In aKeys
>      aResult.Add(sKey)
>      aResult.Insert(GetAllKeys(hSettings, sKey, aResult))
>    Next
>
>    Return aResult
>
> End
>
> Beware, I wrote that code without testing it!
>

I told rubbish... There are only two levels in the keys:

Settings.Keys return a pseudo-collection of settings slots (what is 
between "[" and "]" in the settings file).

Settings.Keys[Key] return a pseudo-collection of real settings keys.

The bug is that enumerating Settings.Keys[Key] breaks the enumeration of 
Settings.Keys.

I fixed that in revision #6365, and will delay the release of 3.5.4 to 
backport the fix!

Regards,

-- 
Benoît Minisini




More information about the User mailing list