VB2005中如何如对目标程序进行“应用程序用户设置
应用程序的用户自定义设置是VB2005中的新功能。在过去的一些年里,曾在VBCity讨论组多次出现的一大探讨问题就是如何储存用户的选择,包括界面设置和一些需要用户进行输入的数据选择项。在以往的传统VB里,要使用储存设定、读取设定这样的功能需要访问并写入注册表,在需要时从注册表读回数据。
这一方法在VB.NET的所有版本,包括VB2005中仍然适用。虽然这一方法并不难应用,但我认为这方法不能兼具详细性和直观性。于是, Visual Studio 2005的项目属性页在此方面给了一种很好的可应用的可视化特色方法。你可以轻松地通过代码来操纵有效的设置,感谢My.Settings这一方法。
以下的例子是提供给新手入门用的,请先建立一个VB2005窗体应用程序项目,然后一步一步跟我来做My.Settings。
在程序设计之中访问“设置编辑器”
你可以在程序设计时使用“设置编辑器”来设定你想要存储的那些设定值的名称和数据类型,要打开这一编辑器,你可以用你喜欢的方法打开工程项目的属性窗口,比如右键点击工程项目名称并选择“属性”。
或者从菜单栏的“项目”-“XXX(工程项目名称)属性”打开:
工程项目属性中的设置页面,刚打开的时候如下图所示:
创建设置
正如我们所看到的,创建一个新的设置是一件很简单的事情。
设置示范
作为一个示范任务,我们将添加三项新设置。
首先我们将存储一个用户选定的用户名,然后存储一个用户选定的窗体背景颜色,最后我们将允许用户随意的选择并存储他们所要求的窗体大小。
用户名
点击设置表格的第一行,然后 双击第一项的“名称”列(该列默认的是“Setting”)以选中它,然后输入“UserName”以替换原有的“Setting”。
保持“类型”列的默认值“String”和“范围”列的默认值“User”不变。
然后在“值”一栏填入“Anonymous(匿名)”
以下的截图显示了这一步骤完成时的情景:
你应该会注意到,“设置”的设置也显示在编程环境右下角的标准Visual Studio属性窗口内,这些设置也可以通过以往的这种改属性的方法来编辑,这于在刚才的表格中修改是等效的。
窗体背景颜色
在第二行中,我们需要键入一些有关窗体背景颜色的细节以示范不同类型的设置。以下的截图显示了如何进行设置。你可以点击“类型”中的下拉菜单箭头并选择System.Drawing.Color
然后点击“值”内的下拉菜单,使下拉菜单的选择项出现,你可以看到并选择三个选项卡中的某种颜色。
窗体大小
最后,添加第三行,即第三个设置——“FormSize”,“类型”中选择System.Drawing.Size,在“值”中输入你希望的宽度值和高度值。
我故意将窗体大小的值设小以使用户打算改变之并存储这个设置。
应用与储存设置
在窗体上放置控件
在解决方案浏览器上选择默认的Form1并在设计窗口查看它,按下图所示拖放控件到Form1里:
在截图中你可以看到我所使用的控件名称,这些名称将在后面的代码例子中出现,同时我也重命名窗体本身为FrmSettings。
在程序开始时应用设置
最常见的情况是在程序第一次运行时应用所有已存储的设置,而在这一示范中这意味着主窗体FrmSettings在这时候已经加载了。
如你所见,这种情况下我们需要通过使用一些不同的控件在不同的时间里按照我们的设定对控件进行刷新。所以我们不是把下面的代码放在Form Load事件中(之后我们还会重复这一事件的,比如就像Button Click事件),而是简单的把它放在一个程序段中然后在我们需要时调用。以下是代码:
Private Sub ApplyTheSettings()
' Get the Settings and apply them:
'取设置值并应用之
With My.Settings
Me.BackColor = .FormColor
Me.Size = .FormSize
txtUserName.Text = .UserName
End With
End Sub
现在,你可以在Form Load事件过程中调用它:
Private Sub frmSettings_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
ApplyTheSettings()
End Sub
具有罗列用途的ComboBox
下一段程序代码不是进行设置的有关代码的一部分,但这是一个在ComboBox中罗列所有已知的程序可用颜色的简便方法,你只需要将代码复制粘贴到Form Load事件中。
Dim ColorChoice As String
For Each ColorChoice In [Enum].GetNames(GetType(KnownColor))
Me.cboColors.Items.Add(ColorChoice)
Next
改变设定值
如果你现在运行了这一项目,你将看到TextBox显示了默认的用户名“Anonymous”,以及ComboBox罗列了所有的已知程序颜色。下一步我们将编写代码来实现用户在ComboBox中选择颜色,窗体的背景颜色按照用户选定的颜色改变。重复一下,这只是一个相当基础的不涉及设置的相关程序片断。
Private Sub cboColors_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cboColors.SelectedIndexChanged
' Apply the chosen color as the Form's BackColor
'应用所选颜色到窗体的背景颜色
Me.BackColor = Color.FromName(cboColors.Text)
End Sub
试着运行一下这个项目,输入一个不同的用户名以及在ComboBox中选择一个不同的颜色,窗体的背景颜色也会因此而改变。要注意到,在这个操作中,My.Settings并没有被改变,也就是说,它并不会在设置中自动更新你所改变的值。为了确认是不是这样,你可以停止(关闭)正在运行的工程项目,然后马上按下F5键再次运行它,正如你所看到的,你所改变的值并没有被储存,你的用户名仍然是Anonymous,窗体背景颜色仍然是相当不令人兴奋的Olive Drab。
储存设置
储存你的设置并不难。每一个在开始时你标记的名称(UserName, FormColor and FormSize)都储存在属性的My.Settings里,就像一个结果一样,当你输入:
My.Settings.
在窗体的代码窗口中出现的智能提示列表已经出现了那三个属性。
你可以提供给用户对设置的选择,可以是一个按钮,或者像这个例子一样,用CheckBox,写这篇文章的目的就在于教会你编写代码来自动储存用户名和窗体背景颜色的设置,同时也提供给用户是否储存窗体的大小设置。
大多数情况下,启动这段代码的合理时机是在将要关闭窗体时,通常也就是要关闭整个应用程序时。在VB2005中,可以使用FormClosing事件。请看如下代码:
Private Sub frmSettings_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
' When the form closes save the user Settings
'当窗体关闭时储存用户设定
With My.Settings
.FormColor = Me.BackColor
' If user wants to save current size:
'如果用户想储存窗口大小
If Me.chkSaveSize.Checked Then .FormSize = Me.Size
' If there is a name in the name textbox:
'如果用户名Textbox里有名字
If txtUserName.Text.Length > 0 Then .UserName = txtUserName.Text
End With
End Sub
这段程序无条件的储存窗体背景颜色设定,尽可能长地储存TextBox内的用户名(如果你不介意用户名是一个空字符串,你可以移走If部分语句),最后,如果用户选中CheckBox来要求存储窗体大小值,那么它也会被储存进去。
你可以创建一系列的设置,不仅限于一个窗体。比方说,你可以使工程项目中所有的窗体都应用你设置的FormColor,也可以指定义其中一个来应用这一设置;你还可以为不同的窗体储存不同的背景颜色,还可以只对工程项目中一部分窗体都储存相同的背景颜色。这已经涵盖了所有你需要的应用程序设置功能。
重新载入和重新设定
重新载入
“重新载入”这一方法非常有用,尤其是在用户在决定他们最喜欢的设置之前需要试验不同的设置比如颜色、大小等等的时候。调用这种方法的同时,最近进行存储的设置将被应用,在我们这个例子中,这将应用上次应用程序关闭时所存储的设置值。
以下代码放在“重新载入”按钮的Click事件中,这将重置所有没有储存的设置为上一次保存的状态。
Private Sub btnReload_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnReload.Click
' This uses the most recent set of user saved Settings
'这将应用用户上一次保存的设置结果
My.Settings.Reload()
' NB. You still need to refresh the controls by applying the values
' as you did on Form Load
'重申,你应用新的设置值后仍然需要刷新控件,就像你的Form Lord事件一样
ApplyTheSettings()
End Sub
如你所看到的以上代码注释段,当设置值改变时,你仍然需要重新执行一次。也就是说,Reload方法本身将重新把设置值载入内存,但它不会自动应用到程序中——即我们的例子中的窗体背景颜色、窗体大小和用户名。
这可以使得当你只需要重新载入一部分已经存储的设定但并非全部载入设定值成为可能,因此实际上大多数情况下这往往是一件好事。对此虽然有很多种不同的解决方案,但最常见的是你要制作一种二选一形式的设置以便应用(或者说只应用一部分设定)以及只需要对一部分你需要改变的控件重新赋值的情况。我确定你也同样意识到你也可以用如下办法解决:
储存那些你不打算重新载入的设置值到一个临时变量中
应用重新载入这一方法
撤销重新载入所带来的改变并用临时变量的值来对设定重新赋值
这可以使你的编程工作中尽可能的将一系列设定值的变化过程造成的整个工程项目的混乱达到最小。
重新设定设置
为了不与“重新载入”混淆,“重新设定”方法是将设置还原为你开发项目时最初的那个设定值。这一操作将最初设定值写入内存中,以下的代码将它们全部应用。以上有关如何应用新值的探讨与Reset方法仍然有关,我们还是使用上面的例子中的工作区。
以下代码写在Reset按钮的事件中,就像我们编写Reload时一样:
Private Sub btnReset_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnReset.Click
' Restore the original Settings and apply them
'重置原始设置值并将之应用
My.Settings.Reset()
ApplyTheSettings()
End Sub
请注意,当你执行Reset方法时,最初原始的设定值会被自动存储并替换用户上一次存储的设置值。也就是说,以前用户设置的设置值会被最初的原始值所覆盖掉。如果你还不明白这是什么意思,那么试着多运行几次我们的例子,然后用一下Reload按钮,之后再用Reset按钮,再多运行几次后再次用Reload按钮,你应该就会明白我的意思。
Summary
摘要
This article is intended to be a first pass at using My.Settings which is aimed at VB 2005 Beginners. It is of course possible to drill down far deeper into this topic and hopefully I will be able to cover this in a later article.
这篇文章是特意写给第一次使用My.Settings的VB2005新手们的。当然关于此我们还有很多更深入的东西可供探讨,之后我将对此撰写更深入的文章。
For the time being though, you now have the means to create, save, edit and access a whole range of Settings for your VB 2005 projects. I hope you find this introduction to the subject to be useful to you.
通过这次学习,你已经学会创建、储存、编辑以及访问一系列的VB2005工程项目中的设置,我衷心希望这篇简单的有针对性的介绍性文章能帮到你。