Remember to save settings per user, and not globally! There's nothing so annoying for a user not to be able to set specific options only for that specific account of his. eg: If you don't do that and if your little brother signs in he will also be using the very same settings and can change them to whatever he likes. There is nothing so annoying to reset all the settings each time because your bro messed them up (or have set them in the way you don't like).
The user's email is giving in the Initialize() function, so that can be used to create a subkey to save the settings for that user only.
(same story goes for when you save stuff in a INI file instead)
------------------------------------------------------------
Looking at your code, the bugs are not because of the "not to do for a plugin" list, but because your own code is buggy:
quote:
Originally posted by Heffy
Instead of trying to fix the problem, I'll just move over to using the registry for saving settings.
code:
Public Function InitVars()
(...)
ini = regQuery_A_Key(HKEY_LOCAL_MACHINE, "SOFTWARE\Patchou\MsgPlus2", "PluginDir")
ini = iniSettings + "\Freedom.ini"
sWry = GetFromINI("Settings", "Wry", "False", ini)
End Function
You've nowhere defined the variable iniSettings. Because of that it will always be empty. And thus your ini file will be created/read from the current hard drive in the main root; "\Freedom.ini" (eg: if C is the current hard drive being used then "c:\Freedom.ini" will be read).
To avoid such errors (using non declared variables)
always include the line "Option Explicit" as the very first line in every module, form, class, etc...
Also you've defined the global variable sWry as a boolean! So if you assign something to the variable it should be a boolean and not a string. Otherwise you will produce errors!
To fix the bug:
code:
Public Function InitVars()
(...)
ini = regQuery_A_Key(HKEY_LOCAL_MACHINE, "SOFTWARE\Patchou\MsgPlus2", "PluginDir")
ini = ini + "\Freedom.ini"
sWry = GetFromINI("Settings", "Wry", "False", ini) = "True"
End Function
Though it doesn't check if the registry key exists or not. So you need to add that too and/or define a default directory. Otherwise, in that situation, the variable 'ini' will still be "\Freedom.ini" in the end and you still would get problems.
------------------------------------------------------------
code:
Private Sub cmdDone_Click()
frmConfig.Hide
Unload frmConfig
spam = GetFromINI("Settings", "Wry", "False", ini)
If spam = "True" Then
chkWry.Value = 1
Else
chkWry.Value = 0
End If
End Sub
That routine is useless.
You nowhere use the global variable 'spam' for anything, so why reading it from the INI file?
Besides the routine being useless, the first line 'frmConfig.Hide' is also useless as you unload the form right after.
Besides that, the unload line is again counteracted by the use of 'chkWry.Value'. Whenever you use a reference to a control on a form which is not yet loaded or already unloaded, the form will be reloaded again (which is rather very logical because otherwise the reference would be invalid)! In other words, if you want to unload a form, do it as the very last thing in the procedure.
Besides that the IF THEN ELSE can be written in 1 line very in a very short way.
So besides that setting the chkWry checkbox is useless because you unload the form (and thus will loose such settings anyways), the routine can/should be written like:
code:
Private Sub cmdDone_Click()
spam = GetFromINI("Settings", "Wry", "False", ini)
chkWry.Value = abs(spam = "True")
Unload frmConfig
End Sub
And because you wont do anything with the 'spam' variable anywhere else in your project, it can/should be shortenend to:
code:
Private Sub cmdDone_Click()
Unload frmConfig
End Sub
------------------------------------------------------------
code:
If IsNumeric(sCommandArg) Then
sRoll = Int(Rnd * sCommandArg) + 1
sSides = sCommandArg
Else
sCommandArg is defined as a string! Therefor 'Rnd * sCommandArg' will produce an error.
code:
Else
sRoll = Int(Rnd * 6) + 1
sSides = 6
End If
sSides is defined as a string! Therefor 'sSides = 6' will produce an error.
------------------------------------------------------------
code:
spam = regQuery_A_Key(HKEY_LOCAL_MACHINE, "SOFTWARE\Patchou\MsgPlus2", "PluginDir")
Instead of using this API registry function (with all the problems it can cause) to get the plugin directory (if it exists at all!!!!), simply use 'App.Path' to get the directory where the plugin is located (this is afterall the plugin direcotry):
code:
spam = App.Path
If you do this you wont need to rely on (potential buggy) registry reading and you wont have problems when the regisrty can't be accessed, etc etc.
------------------------------------------------------------
etc...
Lots of other comments and stuff are added in the fixed files which I'll attach later on...
PS: If you do use the registry to save settings, do not forget to remove all the settings if you uninstall the plugin. If you use an ini file for settings don't forget to remove it also when uninstalling (same with the wav sound).
EDIT: Attached is the fixed source, compare each procedure in every module with your original code to see where the bugs were.