使用同一数据库中的代码,表单和数据,我想知道为Microsoft Access应用程序设计一套测试的最佳实践是什么(比如Access 2007).
测试表单的主要问题之一是,只有少数控件具有hwnd句柄,而其他控件只能获得一个焦点,这使得自动化非常不透明,因为您无法获取表单上的控件列表.
有经验可以分享吗?
我一直在尝试向VBA客户端公开和触发事件.到目前为止,在VBA客户端,事件已暴露,我看到方法事件处理方法已添加到我的模块类,但VBA事件处理方法不会触发.出于某种原因,调试事件时为null.同步修改我的代码也没有帮助.
为了记录,我已经检查了其他SO问题,但他们没有帮助.
任何好的答案将不胜感激.
[ComVisible(true)]
[Guid("56C41646-10CB-4188-979D-23F70E0FFDF5")]
[ClassInterface(ClassInterfaceType.None)]
[ComSourceInterfaces(typeof(IWebEvents))]
[ProgId("MyAssembly.MyClass")]
public class MyClass : ServicedComponent, IMyClass
{
public string _address { get; private set; }
public string _filename { get; private set; }
[DispId(4)]
public void DownloadFileAsync(string address, string filename)
{
_address = address;
_filename = filename;
System.Net.WebClient wc = new System.Net.WebClient();
Task.Factory.StartNew(() => wc.DownloadFile(_address, _filename))
.ContinueWith((t) =>
{
if (null != this.OnDownloadCompleted)
OnDownloadCompleted();
});
}
public event OnDownloadCompletedEventHandler OnDownloadCompleted;
}
[ComVisible(false)]
public delegate void OnDownloadCompletedEventHandler();
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IWebEvents
{ …Run Code Online (Sandbox Code Playgroud) 由于VBA中的新项目,我从VB.NET转移,说实话,不知道如何在这里处理对象类.我想要达到的是比较不同类对象模块之间的对象.
例如
class Employee
属性:Name,Age
point是:比较Name两个Employees之间的s
类:员工和经理
的观点是:比较Name从员工用Name的经理
我知道如何在VB.NET中,但如何比较VBA中不同类模块对象的属性?
如果对象包含在集合中,那么该对象是否仍然可以将事件引发到父类?
显然,您可以告诉子类对父类的引用,然后在子类中的父类中调用公共方法,但这会导致循环引用,据我所知它会使它成为垃圾收集器永远不会摆脱任何一个对象.
细节:我有两个类,一个是名为clsPerson的人,另一个是名为clsPeople的自定义集合类.clsPerson有一个名为Selected的公共布尔属性.如果选择了更改,我会调用一个事件SelectedChange.那时,我需要在clsPeople做点什么.如何在自定义集合类clsPeople中捕获事件?person类可以从People的范围之外更改,否则我会查看另一个解决方案.
<<Class clsPerson>>
Private pSelected as boolean
Public Event SelectedChange()
Public Property Let Selected (newVal as boolean)
pSelected = newVal
RaiseEvent SelectedChange
End Property
Public Property Get Selected as boolean
Selected = pSelected
End Property
<<Class clsPeople>>
Private colPeople as Collection
' Item set as default interface by editing vba source code files
Public Property Get Item(Index As Variant) As clsPerson
Set Item = colPeople.Item(Index)
End Property
' New Enum set to -4 to enable for ... each …Run Code Online (Sandbox Code Playgroud) 我正在使用Word开发VBA项目,并且在使用实现另一个类的类时遇到了处理事件的问题.
我定义了一个空类,IMyInterface:
Public Sub Xyz()
End Sub
Public Event SomeEvent()
Run Code Online (Sandbox Code Playgroud)
还有一个MyClass实现上述的类:
Implements IMyInterface
Public Event SomeEvent()
Public Sub Xyz()
' ... code ...
RaiseEvent SomeEvent
End Sub
Private Sub IMyInterface_Xyz()
Xyz
End Sub
Run Code Online (Sandbox Code Playgroud)
如果我创建第三个类,则OtherClass声明一个具有接口类类型的成员变量:
Private WithEvents mMy As IMyInterface
Run Code Online (Sandbox Code Playgroud)
并尝试使用实现类的实例初始化此变量:
Set mMy = New MyClass
Run Code Online (Sandbox Code Playgroud)
我得到一个运行时错误'459':该组件不支持这组事件.
此错误消息的MSDN页面指出:
"您尝试将WithEvents变量与不能用作指定事件集的事件源的组件一起使用.例如,您可能正在沉没对象的事件,然后创建另一个实现第一个对象的对象.你可能认为你可以从实现的对象中吸收事件,这不是自动的情况.Entruments只实现方法和属性的接口."
以上几乎总结了我正在尝试做的事情.措辞,"这不是自动的情况",而不是"这是不可能的",似乎表明我需要做一些手工工作才能让它工作,但它没有告诉我什么!有人知道这是否可以在VBA中使用?
我正在尝试创建一个类来处理 Access 中的多个控制事件。这是为了避免重复键入多行相同的代码。
我已遵循下一页上的答案,但进行了一些调整以使其适合 Access 而不是 Excel。
我的班级代码如下:
Option Compare Database
Public WithEvents ct As Access.CommandButton 'Changed object type to something recognised by Access
Public Sub ct_Click()
MsgBox ct.Name & " clicked!"
End Sub
Run Code Online (Sandbox Code Playgroud)
我的表单代码如下:
Option Compare Database
Private listenerCollection As New Collection
Private Sub Form_Load()
Dim ctItem
Dim listener As clListener
For Each ctItem In Me.Controls
If ctItem.ControlType = acCommandButton Then 'Changed to test whether control is a Command Button
Set listener = New clListener
Set listener.ct = …Run Code Online (Sandbox Code Playgroud)