Office中国论坛/Access中国论坛

标题: [高6]禁止或隐藏窗体上所有控件 [打印本页]

作者: tmtony    时间: 2004-5-17 20:39
标题: [高6]禁止或隐藏窗体上所有控件
可以遍历窗体上所有控件来禁止或隐藏它,但如果窗体上有控件获得焦点,则当前获得焦点的控件无法禁止和隐藏,请提供使用API或非API两个解决办法。我使用了一个平时大家不常用的属性和docmd命令来巧妙实现的。想看看有没有其它思路?

要求解决办法比较通用,能适合各种特殊情况。

[此贴子已经被作者于2004-5-17 12:39:00编辑过]


作者: hi-wzj    时间: 2004-5-17 20:59
不明白,若所有控件都不显示,那显示窗体的目的又为何?
作者: tmtony    时间: 2004-5-17 21:03
呵呵,只是举个例子,可以再改良功能 例如:根据权限 隐藏或禁止指定tag属性的控件或隐藏某个节里的所有控件主要是实现如果隐藏和禁止获得焦点的控件
作者: hi-wzj    时间: 2004-5-17 21:04
简单一点的就是用代码控制窗体页眉页脚和主体的可见性,就是了,不须遍历所有控件。
作者: goodidea    时间: 2004-5-17 22:44
Private Sub Command10_Click()

On Error Resume Next

    DoCmd.RunCommand acCmdSelectRecord

    For Each ctl In Me.Controls

        ctl.Enabled = False

        Debug.Print ctl.Name

    Next

End Sub


作者: hi-wzj    时间: 2004-5-17 23:04
建立一个高度为零的文本框,将焦点转移到该文本框上,再控制原文本框的可见性就是了。
作者: tmtony    时间: 2004-5-18 03:23
以下是引用goodidea在2004-5-17 14:43:45的发言:

Private Sub Command10_Click()

On Error Resume Next

    DoCmd.RunCommand acCmdSelectRecord

    For Each ctl In Me.Controls

        ctl.Enabled = False

        Debug.Print ctl.Name

    Next

End Sub

呵呵,所见略同,我的方法也是如此
作者: tmtony    时间: 2004-5-18 03:33
以下是引用hi-wzj在2004-5-17 15:04:03的发言:

建立一个高度为零的文本框,将焦点转移到该文本框上,再控制原文本框的可见性就是了。



此法可行,只是通用性不是很强.
作者: tmtony    时间: 2004-5-18 03:34
做好的模块:Option Compare Database

Option Explicit

Public Enum tAcSetType

    tAcSetEnable = 0    '设置可用属性

    tAcSetVisible = 1   '设置可见属性

    tAcSetEnableandVisible = 2  '设置可见及可用属性 其它不可见即不可用,可忽略

End Enum'===============================================================================

'-函数名称:         SetEnableOrVisible

'-功能描述:         设置指定窗体指定切内控件的可见性和可用属性,包括设置已获得焦点的控件

'-输入参数说明:     参数1:rfrm Form 指定的窗体对象

'                   参数2:rastSetType tAcSetType 设置方式

'                   参数2:rblnValue Boolean 设置的值

'                   参数2(可选):rblnIncludeFocusControl Boolean 是否包括获得焦点的控件

'                   参数2(可选):rsecSection AcSection 指定的节,如果不指定,则设置窗体内所有控件

'-返回参数说明:     无

'-使用语法示例:     SetEnableOrVisible Me, tAcSetEnableandVisible, False, True, acDetail

'-参考:

'-使用注意:         可能不适用数据表窗体

'-兼容性:           97,2000,XP compatible

'-作者:             王宇虹,改进:王宇虹

'-更新日期:        2004-05-15 ,2004-05-16

'===============================================================================Public Function SetEnableOrVisible(rfrm As Form, rastSetType As tAcSetType, rblnValue As Boolean, Optional rblnIncludeFocusControl As Boolean = False, Optional rsecSection As AcSection = 99) As Boolean    Dim ctr As Control

    Dim objFormOrSection As Object

    On Error GoTo Err_SetEnableOrVisible   '有错误转到错误处理程序

        

    If rsecSection = 99 Then    '如果没有指定具体的节,则对所有控件进行处理

        Set objFormOrSection = rfrm

    Else                        '否则只对指定的节里面的控件进行处理

        Set objFormOrSection = rfrm.Section(rsecSection)

    End If

   

    '使用一个非常巧妙的办法来设置当前获得焦点控件的可见性,可以将焦点移到其它控件,然后再处理,但比较麻烦

    '也可使用API,但也是比较麻烦,后使用DoCmd.RunCommand acCmdSelectRecord,将焦点移到记录选择器上面就可以了,不用担心与其它控件冲突

    '写一个使用API的方法

    If rblnIncludeFocusControl = True And rblnValue = False Then '如果选择了包括当前获得焦点控件且设置值为否的话

        rfrm.SetFocus

        DoCmd.RunCommand acCmdSelectRecord

    End If

   

    '根据设置类型分别设置对象的可见性及是否可用,注意,有些控件如标签没有可用属性,则忽略继续往下执行.

    Select Case rastSetType

        Case tAcSetEnable

          For Each ctr In objFormOrSection.Controls

            ctr.Enabled = rblnValue

          Next

        Case tAcSetVisible

          For Each ctr In objFormOrSection.Controls

            ctr.Visible = rblnValue

          Next

        Case tAcSetEnableandVisible '如果可见性为否的话,也可考虑不用设置是否可用的属性

          For Each ctr In objFormOrSection.Controls

            ctr.Enabled = rblnValue '可以不用

            ctr.Visible = rblnValue

          Next

    End Select

    SetEnableOrVisible = True   '执行成功,返回结果为True

    Exit Function

   

Err_SetEnableOrVisible:

    SetEnableOrVisible = False  '有部分控件执行错误,返回结果为False,并继续处理后面的控件

    Resume Next

End Function
作者: hi-wzj    时间: 2004-5-18 17:37
佩服佩服,我就没想到将焦点移到记录选择器上,还拘泥在某控件上,我的方法确实不具通用性。
作者: quanli    时间: 2004-6-14 16:56
幸苦,学习学习
作者: kangking    时间: 2005-5-9 23:55
以下是引用tmtony在2004-5-17 19:34:13的发言:


做好的模块:
没有仔细看代码,想问一下,如果在设计时将记录选择器隐藏了,怎么办?[em06]
作者: tmtony    时间: 2005-5-10 17:31
记录选择器隐藏了,还是一样有效的!
作者: chief_first    时间: 2005-5-23 04:27
果然是高手各显神通啊。
作者: 120HYH    时间: 2005-12-1 02:41
我要努力了
作者: xinle    时间: 2006-3-18 03:29
我什么我用这个模块时还会提醒错误呢?
我用的是access 2000[attach]16471[/attach]

作者: qlm    时间: 2006-4-17 21:43
还是高手的代码有东西学呀!
作者: hyk6679961    时间: 2006-4-30 18:55
好东东啊!收下了解
作者: andymark    时间: 2008-3-4 16:20
用API 的EnableWindow 禁止窗体上所有控件也不错,连窗体关闭按钮都禁正了,名符其实的禁止窗体上所有控件
作者: tmtony    时间: 2008-3-4 16:31
呵呵, 那也是, 那是一了百了
作者: xieyimin008    时间: 2008-4-9 11:47
厉害!!
作者: lxh1968    时间: 2008-5-17 00:37
好好学习,天天向上。




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3