会员登录 - 用户注册 - 网站地图 Office中国(office-cn.net),专业Office论坛
当前位置:主页 > 技巧 > Access技巧 > 微软KB > 正文

Access Answers:简单地隐藏您的输入

时间:2009-08-03 09:28 来源:http://msdn.microsoft.com 作者:佚名 阅读:
是否存在这样一种方式:在使用 InputBox 时可以隐藏正在键入的内容,就像键入密码时的情况那样?
遗憾的是,VBA 的内置 InputBox 不具备很多灵活性。用户可以更改它的标题、提示、默认值以及它在屏幕上显示的位置 — 仅此而已。甚至 InputBox 表示 可以支持的某些灵活性,它实际上也不支持:虽然 Help 文件中谈到了提供参数(为 InputBox 指定 Help 文件和 Help 上下文)的功能,但是 access 实际上会忽略这些值,在 InputBox 上不会显示任何 Help 按钮。尽管如此,您尝试执行的操作还是有可能完成的,您必须滚动自己的窗体才行。
创建窗体相当简单,不需要什么帮助。只需要一个带有两个命令按钮(OK 和 Cancel)的简单窗体、一个标签和一个文本框(参见图 1)。按照图 2 所示设置窗体的 Format 属性。

图 1

图 2
打开窗体时,您将发现该窗体与内置 InputBox 基本相同。当然,这还没有完成。首先,在文本框中键入任何内容都不是隐藏的,不符合您的要求,而且获取在文本框中键入的值也不容易。
处理第一种情况(不能隐藏文本框中键入的内容)相当简单:将文本框控件的 InputMask 属性设置为“Password”。只是从窗体返回值稍微复杂一些。
我无意于自夸我的方法最好,但是我使用这个方法确实取得了成功。例如,我可以只创建一个带有预置属性的窗体,不过我还想让它具有更多灵活性:我想让 InputBox 替换窗体上的多种属性具有可编程性。我发现使用类模块可以更好地控制对这些属性的管理。
警告:以下代码未显示窗体的全部可更改属性。检查下载中随附的数据库,可以查看其他内容。此外,由于 access 没有在 InputBox 上实现 Help 按钮,我也将把它忽略掉,尽管希望您自己添加它!
那么,我可以控制 InputBox 的哪些属性呢?显然,我的 InputBox 替换窗体至少需要具有内置 InputBox 的功能,因此我必须能够设置窗体的标题、提示、默认值,以及 x 和 y 的位置。由于该 InputBox 替换窗体的整个意义在于可以通过 InputMask(允许隐藏正在键入的内容)来控制,因此我还希望能够对该属性进行设置。此外,我决定对用于提示的字体和输入的文本进行控制,而且允许单独设置它们的格式。我还考虑通过编程方式更改窗体的颜色。最后,我提供将按钮标题从“OK”和“Cancel”更改为其他可能需要的文本的功能。
将值从 InputBox 替换窗体传递回调用函数的基础是以 Dialog 模式打开窗体。以 Dialog 模式打开窗体意味着,在关闭窗体前不在程序中执行任何进一步处理。通过将窗体写入公共变量(或在本例中,在类中设置属性),我可以确定键入框中的内容。
我之所以创建类 cInputBox,目的仅仅是对前面提到的所有属性进行控制。无论何时,只要创建了这个类,该类就会调用名为 Reset 的子例程,以便将一系列内部模块级变量设置为我需要使用的默认值。(提示:这意味着,如果您不想使用我的默认值,则应该在 Reset 例程中更改代码。)

Public Sub Reset()
mbooPromptFontItalic = False
mbooPromptFontUnderLine = False
mbooTextFontItalic = False
mbooTextFontUnderLine = False
mintPromptFontSize = 8
mintPromptFontWeight = 400
mintTextFontSize = 8
mintTextFontWeight = 400
mlngBackColor= -2147483633
mlngPromptFontColor = 0
mlngTextFontColor = 0
mstrCancelCaption = "Cancel"
mstrDefaultValue = vbNullString
mstrInputMask= vbNullString
mstrOKCaption = "OK"
mstrPrompt = "What value?"
mstrPromptF
mstrTextF
mstrTitle = "Doug Steele's InputBoxReplacement"
mlngXPos = -1
mlngYPos = -1
End Sub

几乎所有的其他类模块都是通过一组属性例程来检索或设置这些变量的代码。例如,当代码读取类的 BackColor 属性时,系统将调用 BackColor 的 Get 例程并将 mlngBackColor 的值返回调用代码。当代码设置类的 BackColor 属性时,系统将调用 BackColor 的 Set 例程并将 mlngBackColor 的值设置为调用代码使用的任何值(该值通过我调用的参数 NewColor 传入):

Public PropertyGetBackColor() As Long
BackColor= mlngBackColor
End Property

Public Property Let BackColor(NewColorAs Long)
mlngBackColor= NewColor
End Property

使用该类时,按照所需方式设置全部属性后,我调用该类的 InputBox 函数,如下所示:
Public Function InputBox() As String

DoCmd.OpenFormFormName:="frmInputBox", _
  WindowMode:=acDialog
InputBox= mstrResponse

End Function

如您所见,InputBox 例程以 Dialog 模式打开窗体。因为我是以 Dialog 模式打开窗体的,所以直到用户单击窗体的 OK 或 Cancel 按钮时,全部处理才会在 OpenForm 行停止。
frmInputBox 窗体的 OK 按钮包含将 mstrResponse 设置为等价于文本框中所键入内容的代码:

Private Sub cmdOk_Click()

gclsInputBox.Response = Me.txtValue
DoCmd.Close

End Sub

SubfrmInputBox 中只有其他“有趣”代码可以从该类读取属性并相应地设置窗体属性:

Private Sub Form_Load()

With Me
  .Detail.BackColor= _
     gclsInputBox.BackColor
  .Caption = gclsInputBox.Title
  With .lblPrompt
    .Caption = gclsInputBox.Prompt


    .FontItalic = gclsInputBox.PromptItalic
    .FontName = gclsInputBox.PromptFontName
    .FontSize = gclsInputBox.PromptSize
    .FontUnderline = _
      gclsInputBox.PromptUnderline
    .FontWeight = gclsInputBox.PromptWeight
    .ForeColor = gclsInputBox.PromptColor
  End With
  .txtValue = gclsInputBox.DefaultValue
  With .txtValue
    .InputMask= gclsInputBox.InputMask
    .FontItalic = gclsInputBox.TextItalic
    .FontName = gclsInputBox.TextFontName
    .FontSize = gclsInputBox.TextSize
    .FontUnderline = gclsInputBox.TextUnderline
    .FontWeight = gclsInputBox.TextWeight
    .ForeColor = gclsInputBox.TextColor
  End With
  .cmdOk.Caption = gclsInputBox.OKCaption
  .cmdCancel.Caption = _
    gclsInputBox.CancelCaption
End With

Me.txtValue.SetFocus

End Sub

那么,如何使用这一代码呢?将窗体 frmInputBox、模块 mdlInputBox 和类模块 cInputBox 从示例数据库复制到您自己的数据库中。在需要调用 InputBox 替换窗体的地方,不要 使用以下代码:

Dim strResponse As String

strResponse = InputBox("Type in a value:", _
  "Testing my input box")
Instead, use code like this:
Dim strResponse As String

SetgclsInputBox= New cInputBox

With gclsInputBox
  .Title = "Testing my input box"
  .Prompt = "Type in a value:"
  .InputMask= "Password"
End With

strResponse = gclsInputBox.InputBox

SetgclsInputBox= Nothing

我承认,此方案有些麻烦,因为它具有 mdlInputBox 中定义的全局变量 gclsInputBox。但它确实可用,不仅可以使您得到类似密码的输入框,还可以得到更多灵活性。
您的解决方案涉及到 Color 和 Font 属性的设置。我如何才能知道哪些值有效?
access 用于 Color 和 Font 信息的值都是标准的 Windows 值。然而,这里有一种较为简单的方法,它比必须键入新的变量名或记住神秘的数字要简单:您可以调用 comdlg32.dll(Windows 随附的)中包括的标准“picker”对话框,(如图 3图 4 所示)。

图 3

图 4
Color Chooser 是这两者之中用法较为简单的一个。首先,必须定义一些常量,然后声明 CHOOSECOLOR 结构和 ChooseColor API:

Private Type CHOOSECOLORSTRUCTURE
lStructSize As Long
hwnd As Long
hInstanceAs Long
rgbResultAs Long
lpCustColors As String
Flags As Long
lCustData As Long
lpfnHookAs Long
lpTemplateNameAs String
End Type

Private Const CC_RGBINIT = &H1

Private Const CC_FULLOPEN = &H2

Private Const CC_PREVENTFULLOPEN = &H4

Private Const CC_SHOWHELP = &H8

Private Const CC_ENABLEHOOK= &H10

Private Const CC_ENABLETEMPLATE = &H20

Private Const CC_ENABLETEMPLATEHANDLE = &H40

Private Const CC_SOLIDCOLOR = &H80

Private Const CC_ANYCOLOR = &H100


Private Declare Function ChooseColor_
Lib "comdlg32.dll" Alias "ChooseColorA" ( _
pChoosecolor As CHOOSECOLORSTRUCTURE _
) As Long

完成此步骤后,还必须做两件事情:初始化结构,然后调用 API。下面是一个典型示例:

Public Function ColorSelector() As Long
Dim lngReturn As Long
Dim typCS As CHOOSECOLORSTRUCTURE

With typCS
  .lStructSize = Len(typCS)
  .hwnd = hWndaccessApp
  .Flags = CC_ANYCOLOR Or CC_RGBINIT
  .lpCustColors = String$(16 * 4, 0)
End With

lngReturn = ChooseColor(typCS)

If lngReturn = 0 Then
  ColorSelector = RGB(255, 255, 255)
Else
  ColorSelector = typCS.rgbResult
End If

End Function

我已经将该函数设置为返回所选颜色的 RGB 值。如果发生错误,则该函数将返回 White(我任意选择的颜色)的 RGB 值。
有人出于好奇,可能想知道可能的 Flag 值。我将这些值列在表 1 中。
表 1. CHOOSECOLOR 结构中 Flag 的有效值。 常量
描述
CC_ANYCOLOR
可以让对话框显示基本颜色设置中的所有可用颜色。
CC_ENABLEHOOK
启用该结构的 lpfnHook 成员中指定的挂接程序。此标志仅用于初始化对话框。
CC_ENABLETEMPLATE
表明 hInstance 和 lpTemplateName 成员指定一个对话框模板来替换默认模板。此标志仅用于初始化对话框。
CC_ENABLETEMPLATEHANDLE
表明 hInstance 成员确定包含预加载对话框模板的数据块。如果指定该标志,则系统忽略 lpTemplateName 成员。此标志仅用于初始化对话框。
CC_FULLOPEN
可以让对话框显示允许用户创建自定义颜色的附加控件。如果未设置该标志,则用户必须单击“Define Custom Color”按钮才能显示自定义颜色控件。
CC_PREVENTFULLOPEN
禁用 Define Custom Color 按钮。
CC_RGBINIT
可以让对话框将在 rgbResult 成员中指定的颜色用作初始颜色选择。
CC_SHOWHELP
可以让对话框显示 Help 按钮。hwndOwner 成员必须指定窗口来接收 HELPMSGSTRING 注册消息,该消息是在用户单击 Help 按钮时由对话框发送的。
CC_SOLIDCOLOR
可以让对话框仅显示基本颜色设置中的纯色。
[/table]值得一提的是,说起颜色,您可能不知道还可以指定预定义值以使用用户的首选项。这些值会通知属性选取用于某个 Windows 设置的值,而不是对某个特定颜色设置属性。我把这些值列在表 2 中。表 2. 系统颜色值。 IntrinsicConstant

描述
vbScrollBars
-2147483648
滚动条颜色
vbDesktop
-2147483647
桌面颜色
vbActiveTitleBar
-2147483646
活动窗口的标题栏颜色
vbInactiveTitleBar
-2147483645
非活动窗口的标题栏颜色
vbMenuBar
-2147483644
菜单背景颜色
vbWindowBackground
-2147483643
窗口背景颜色
vbWindowFrame
-2147483642
窗口框架颜色
vbMenuText
-2147483641
菜单上的文本颜色
vbWindowText
-2147483640
窗口中的文本颜色
vbTitleBarText
-2147483639
标题、大小框和滚动条中的文本颜色
vbActiveBorder
-2147483638
活动窗口的边框颜色
vbInactiveBorder
-2147483637
非活动窗口的边框颜色
vbApplicationWorkspace
-2147483636
多文档界面 (MDI) 应用程序的背景颜色
vbHighlight
-2147483635
控件中所选项的背景颜色
vbHighlightText
-2147483634
控件中所选项的文本颜色
vbButtonFace
-2147483633
命令按钮表面的底纹颜色
vbButtonShadow
-2147483632
命令按钮边缘的底纹颜色
vbGrayText
-2147483631
变灰(已禁用)文本
vbButtonText
-2147483630
普通按钮上的文本颜色
vbInactiveCaptionText
-2147483629
非活动标题中的文本颜色
vb3DHighlight
-2147483628
-D 显示元素的突出显示颜色
vb3DDKShadow
-2147483627
-D 显示元素的最暗阴影颜色
vb3DLight
-2147483626
vb3DHighlight 后的次亮 -D 颜色
vbInfoText
-2147483625
ToolTip 中的文本颜色
vbInfoBackground
-2147483624
ToolTip 中的背景颜色
[table][/table]举例来说,如果您想让窗体的背景显示为用户曾经为 Windows 背景颜色指定的任一颜色,则可以将 BackColor 属性设置为 vbWindowBackground(或 -2147483643),即表 2 中屏幕元素 Window 的值。
对于如何使用这些常量,您还具有一定的灵活性。Windows 系统颜色值仅涉及所列屏幕元素的颜色,而不涉及对象的类型(可以将其分配到该类型)。例如,用户可以将文本框的 BackColor 属性设置为滚动条、桌面或任何其他屏幕元素的 Windows 系统颜色。使用这些值的关键一点是,不管用户的颜色设置如何,这些值始终保持不变。
正如我前面提到的,ChooseFont API 调用不如 ChooseColor 那样简单,部分原因是 ChooseFont 调用不返回单个值。我在此不想重新生成使用 ChooseFont 调用所需的代码,用户可以在下载数据库的 mdlFontPicker 中查看它。函数 FontSelector 期望传递给它一种结构。如果该结构填充了值,则这些值将可用于初始化 Choose Font 对话框。在 FontSelector 运行结束后,用户在对话框中所选的任何值都将通过同一结构传回。

附件

AA200503.rar (110.71 KB)

2008-10-3 05:56, 下载次数: 7

(责任编辑:admin)

顶一下
(0)
0%
踩一下
(0)
0%
推荐内容
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价: