Access数据库

时间:2017-12-28 11:51:15

标签: class events access-vba

我在Access新组中尝试了这个,并获得了超过一百个视图,但没有一个响应,所以我希望它在这里的表现更好。

我试图抓住VBA中的自定义事件。我在网上搜索了无数的资料,研究了我的手册,试验了我能想到的一切,而且成功仍然有点脆弱。

我希望完成的并不是那么复杂,而且它似乎应该是自定义事件例程的理想选择。我有从表格或查询中提供的组合框和列表框的主要表单。用户可以打开各种对话框并执行修改表的操作。当该活动完成后,我想重新查询受任何此类活动影响的框。我过去的做法是设置一个全球性的SourceHasChanged'布尔变量并在从对话框返回时检查其状态。它有效,但有点笨拙,所以我决定尝试用自定义事件替换它。

学习时间和无尽的死胡同尝试和重复最终产生了以下几点代码。他们什么都不做。有一个名为T的表。对话框表单在每次单击“添加”按钮时添加记录。主窗体有另一个按钮,删除表中第一个记录以外的所有记录。每组代码都应该触发一个事件,指示要重新获取列表框。主窗体中的代码没问题,但对话框中的代码拒绝激活StalaSeZmena事件。显然(我认为,无论如何),因为对话框创建了一个新的类模块实例。但是我必须在对话框表单中有一个WithEvents变量。如果我不这样做,我将不得不在主窗体中引用WithEvents变量。要求表单彼此了解很多,这与我认为自定义事件路径要完成的内容完全相反。使用全局状态变量会更容易,更容易混淆。

课程模块[Zmena]

Public WithEvents Udalost As HlaseniZmeny
Private Sub Udalost_StalaSeZmena()
Form_Mane.lstS.Requery
Debug.Print "Requery via class module"
End Sub

课程模块[HlaseniZmeny]

Public Event StalaSeZmena()
Public Sub OhlasitZmenu()
RaiseEvent StalaSeZmena
End Sub

常规模块

Public chg As Zmena

表格代码[鬃毛]

Private WithEvents chgMane As HlaseniZmeny
Private Sub cmdCallDialog_Click()
DoCmd.OpenForm "Dia", acNormal, , , , acDialog
End Sub

Private Sub cmdShrinkT_Click()
CurrentDb.Execute "Delete * From T Where Pole1 <> 'A'"
chgMane.OhlasitZmenu
End Sub

Private Sub Form_Open(Cancel As Integer)
Me.Label1.Caption = Me.SpinButton1.Value
Set chg = New Zmena
Set chgMane = New HlaseniZmeny
Set chg.Udalost = chgMane
End Sub

Private Sub chgMane_StalaSeZmena()
lstS.Requery
Debug.Print "Requery from event on main"
End Sub

表格代码[Dia]

Private WithEvents chgDia As HlaseniZmeny
Private Sub cmdAdd_Click()
CurrentDb.Execute "Insert Into T (Pole1) Values(chr(asc('" & DMax("Pole1", "T", "Pole1") & "')+1))"
Set chgDia = New HlaseniZmeny
Set chg.Udalost = chgDia
chgDia.OhlasitZmenu
Set chgDia = Nothing
End Sub

它功能齐全,但感觉很笨拙,笨重而且根本不直观,比如用我的右脚刮伤我的左耳。类模块具有对主窗体的引用,这违反了封装原则,但我发现无法使对话框窗体激活主窗体中的事件例程。我必须有一个全局变量来链接两个WithEvents变量,或者什么都不起作用,但这也违反了封装。

这真的是这些构造应该如何运作,还是我不小心偶然发现了碰巧运行的Mad-Max版本,但是不是构建这样的程序的正确方法?

0 个答案:

没有答案