ACCESS的窗体写保护开关

笑虾 2008-09-11 06:34:43
我做了一个记录库存进出的ACCESS文件.
为了防止在录单或查看时不小心改到原有已录的记录,所以想做一个写保护开关.
主窗体是单据信息,子窗体是单据明细.
我写的VBA如下,一然后一些相关的事件中进行调用如:
写保护开关 True
写保护开关 False
但总有时会不灵.我不知道哪里的问题,请帮我看下.谢谢
另外我用的方法是否有问题,是否有更好的方法.谢谢


Public Sub 写保护开关(kg As Boolean)
On Error GoTo 写保护开关_Err

If (kg = True) Then
Forms![信息录入].明细录入.Locked = True
Forms![信息录入].AllowAdditions = False
Forms![信息录入].AllowDeletions = False
Forms![信息录入].AllowEdits = False
'MsgBox "写保护开 ", , "警告"
ElseIf (kg = False) Then
Forms![信息录入].AllowAdditions = True
Forms![信息录入].AllowDeletions = True
Forms![信息录入].AllowEdits = True
Forms![信息录入].明细录入.Locked = False
Forms![信息录入].写保护.Value = True
'MsgBox "写保护关 ", , "警告"
End If

写保护开关_Exit:
Exit Sub

写保护开关_Err:
MsgBox Error$
Resume 写保护开关_Exit

End Sub
...全文
250 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
笑虾 2008-10-29
  • 打赏
  • 举报
回复
已经解决
核心代码:

For Each ctl In Me.Controls
If ctl.Name <> "Check8" And ctl.ControlType <> acLabel Then
If Me.Check8 = True Then

ctl.Locked = True
Else
ctl.Locked = False
End If
End If
Next
End Sub
笑虾 2008-10-08
  • 打赏
  • 举报
回复
莫急啊兄弟们,我看到回帖了,但是现在手上活多,一阵忙完了再研究.
哈哈
yeeyuu 2008-10-02
  • 打赏
  • 举报
回复
不好意思,忘了说明Check8是KG
yeeyuu 2008-10-02
  • 打赏
  • 举报
回复
Private Sub Check8_Click()
Dim ctl As Control
'Dim f As Form
For Each ctl In Me.Controls
If ctl.Name <> "Check8" And ctl.ControlType <> acLabel Then
If Me.Check8 = True Then

ctl.Locked = True
Else
ctl.Locked = False
End If
End If
Next
End Sub

Private Sub Form_Current()
Dim ctl As Control
'Dim f As Form
For Each ctl In Me.Controls
If ctl.Name <> "Check8" And ctl.ControlType <> acLabel Then
ctl.Locked = True

End If
Next
If Me.NewRecord Then '如果是新建状态就可以编辑(将勾取消)
Me.Check8 = False
Else
Me.Check8 = True
End If

Call Check8_Click

End Sub
changechange 2008-09-29
  • 打赏
  • 举报
回复
dim ctl as control
dim f as form
for each ctl in f.controls
if ctl是你要锁定的控件 then
ctl.locked=true
end if
next

直接在窗体的更新前事件里面编程,将所有的更改 CANCEL 掉即可。
这个能给个列子吗?来点代码
具体如何操作
谢谢
-------
窗体 beforeupdate 事件中编程。
if 是否要只读=true then
cancel=true
end if
笑虾 2008-09-29
  • 打赏
  • 举报
回复
能给代码吗?
这样说,我不是不知道如何才好啊.
如果是"设定所有的控件为锁定"是否要一个一个的手动列出控件,还有可以动态的取得控件的ID然后用FOR设置?
"设定所有的控件为锁定"

Forms![信息录入].明细录入.Locked = True
Forms![信息录入].AllowAdditions = False
Forms![信息录入].AllowDeletions = False
Forms![信息录入].AllowEdits = False
最终的效果应该是一样的吧? 有哪些细微的不同么? 比如说引起像我现在遇到的这种不灵的情况?


直接在窗体的更新前事件里面编程,将所有的更改 CANCEL 掉即可。
这个能给个列子吗?来点代码
具体如何操作
谢谢
changechange 2008-09-29
  • 打赏
  • 举报
回复
方法很多
设定所有的控件为锁定也可以
或者
直接在窗体的更新前事件里面编程,将所有的更改 CANCEL 掉即可。
笑虾 2008-09-28
  • 打赏
  • 举报
回复
问题还是不有解决,最近这龙体欠安,去吊针了.

今天在公司而且有空所以接着想这个问题.

1楼的方法不行, 只要我一点组合框就提示"当前无记录"

2楼的信息录入窗体当然是打开了,组合框就是在信息录入窗体上的.

6楼的 "写保护开关"写在这些地方
( "单号选择"就是那个组合框,我在组合框中选相应的单号,此单就变成当前记录.)

Private Sub 单号选择_GotFocus()
写保护开关 False
End Sub

Private Sub 单号选择_LostFocus()
写保护开关 True
End Sub

Private Sub Form_Open(Cancel As Integer)
写保护开关 True
End Sub

Private Sub 下一条_Click()
On Error GoTo Err_下一条_Click

DoCmd.GoToRecord , , acNext
写保护开关 Forms![信息录入].写保护.Value

Exit_下一条_Click:
Exit Sub

Err_下一条_Click:
MsgBox Err.Description
Resume Exit_下一条_Click

End Sub
Private Sub 上一条_Click()
On Error GoTo Err_上一条_Click

DoCmd.GoToRecord , , acPrevious
写保护开关 Forms![信息录入].写保护.Value

Exit_上一条_Click:
Exit Sub

Err_上一条_Click:
MsgBox Err.Description
Resume Exit_上一条_Click

End Sub

Private Sub 首记录_Click()
On Error GoTo Err_首记录_Click


DoCmd.GoToRecord , , acFirst

Exit_首记录_Click:
Exit Sub

Err_首记录_Click:
MsgBox Err.Description
Resume Exit_首记录_Click

End Sub
Private Sub 尾记录_Click()
On Error GoTo Err_尾记录_Click


DoCmd.GoToRecord , , acLast

Exit_尾记录_Click:
Exit Sub

Err_尾记录_Click:
MsgBox Err.Description
Resume Exit_尾记录_Click

End Sub

Private Sub 添加记录_Click()
On Error GoTo Err_添加记录_Click

写保护_btn_Click
DoCmd.GoToRecord , , acNewRec

Exit_添加记录_Click:
Exit Sub

Err_添加记录_Click:
MsgBox Err.Description
Resume Exit_添加记录_Click

End Sub


在第一次打开窗体时,下列事件将按以下的顺序发生:
Open → Load → Resize → Activate → Current
写在Open中应该也能达到效果吧?


笑虾 2008-09-15
  • 打赏
  • 举报
回复
"写保护开关"
写在窗体的载入事件用参数 True 调用,以保证当窗体打开时,单据信息.写保护字段为True的记录为保护状态。
(单据信息.写保护字段 对应该的就是 “Forms![信息录入].写保护.Value = True”)
别外在记录的“上一条”“下一条”“第一条”“最后一条”这个几按钮的单击事中调用:
写保护开关 Forms![信息录入].写保护.Value

还有就是上面5楼时说过的:

出现问题的情况是我在主窗体设置了一个组合框,里面数据引用当前存在的单号,然后我可以通过这个组合框跳到指定的一单中。
我首先在组合框获得焦点时调用: 写保护开关 False
然后就可以操作组合框了,选好一条记录后。
我会在组合框失去焦点时调用: 写保护开关 True
好像刚开始的时候效果和我想的一样,但后来不知道怎么得就失灵了。

谢谢

ewang11 2008-09-14
  • 打赏
  • 举报
回复
同意3楼的说法

另"写保护开关" 写在什么事件中?
需在current事件调用
笑虾 2008-09-13
  • 打赏
  • 举报
回复
三楼说的对:
写保护的开关来源于此:
Forms![信息录入].写保护.Value = True
这是个文件框他的数据源对应的是“单据信息”表中的一个字段“写保护”

至于这句:
'Forms![信息录入].明细录入.Locked = True '没必要,窗体都禁止编揖了,控件就再禁就多余
我觉得你说的是有道理的,但是现在我这里会出有时灵时不灵的情况。
当不灵时有这句的话,子窗体还是可以被保护的,但主窗体已经没有保护了。

当我要进行保护时是这样调用的,KG取值应该没错:
写保护开关 True

别外在浏览上一条记录下一记录的按钮上加上了:
写保护开关 Forms![信息录入].写保护.Value
(进行上下浏览时没有出现问题)

出现问题的情况是我在主窗体设置了一个组合框,里面数据引用当前存在的单号,然后我可以通过这个组合框跳到指定的一单中。
我首先在组合框获得焦点时调用: 写保护开关 False
然后就可以操作组合框了,选好一条记录后。
我会在组合框失去焦点时调用: 写保护开关 True
好像刚开始的时候效果和我想的一样,但后来不知道怎么得就失灵了。

我家里没电脑,要上班时去公司才能进行调试,前几位朋友的建议我看到了,谢谢。


testfor0009 2008-09-13
  • 打赏
  • 举报
回复
up
baije130 2008-09-12
  • 打赏
  • 举报
回复
If (kg = True) Then 'KG是如何取值的?
'Forms![信息录入].明细录入.Locked = True '没必要,窗体都禁止编揖了,控件就再禁就多余
Forms![信息录入].AllowAdditions = False
Forms![信息录入].AllowDeletions = False
Forms![信息录入].AllowEdits = False
'MsgBox "写保护开 ", , "警告"
ElseIf (kg = False) Then
Forms![信息录入].AllowAdditions = True
Forms![信息录入].AllowDeletions = True
Forms![信息录入].AllowEdits = True
'Forms![信息录入].明细录入.Locked = False
Forms![信息录入].写保护.Value = True '这句不明白,你的KG是否来源于此?
'MsgBox "写保护关 ", , "警告"
End If


你的问题还是要查KG的来源,建议先调试KG传回值是不是正确的
wwwwb 2008-09-12
  • 打赏
  • 举报
回复
信息录入窗体是否打开,在什么情况下不灵?
fzcheng 2008-09-11
  • 打赏
  • 举报
回复
Forms![信息录入].REQUERY
后面都加个这条语句看下

7,714

社区成员

发帖
与我相关
我的任务
社区描述
Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点。
社区管理员
  • Access
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧