我有一种方法,在.Designer
的情况下,我可以访问.Controls
并从那里访问 private void DeclareControlsAsMembers(VBComponent form)
{
var designer = form.Designer;
if (designer == null)
{
return;
}
// using dynamic typing here, because not only MSForms could have a Controls collection (e.g. MS-Access forms are 'document' modules).
foreach (var control in ((dynamic)designer).Controls)
{
var declaration = new Declaration(_qualifiedName.QualifyMemberName(control.Name), ...);
OnNewDeclaration(declaration);
}
}
集合:
form.Designer
此方法的问题在于,当主机为MS-Access时,null
为dynamic
,因此该方法会提前返回。
此处的UserForm
广告投放并不是特别有用,似乎我可以投射到{{1}}界面并且“只是工作” - 至少在Excel主机中。
但由于MS-Access'表单没有设计器(???),我如何在MS-Access表单上迭代控件,给定C#代码是一个VBE加载项(即只能轻松访问VBIDE API提供的任何内容)?
答案 0 :(得分:2)
除非表单已打开,否则您无法在Access表单上迭代控件。打开表单,甚至是设计模式,都很昂贵,因为需要呈现控件,并且在Access中,绑定的属性被解析为数据库对象。还有子表格和子报告的问题。
但是,这个VBA代码将获取你的vbComponent,打开表单(如果它在设计模式下还没有打开),然后从vbComponent的Properties集合中返回控件集合。如果表格一开始没有打开,那么它就会关闭。
此代码很容易为Access Reports复制。
Bundle extras = getIntent().getExtras();
String xmlfile = null;
if (extras != null) {
xmlfile = extras.getString("xmlfile");
}
int id = getResources().getIdentifier(xmlfile, "layout", getPackageName());
setContentView(id);
答案 1 :(得分:0)
导出模块(使用可爱的Application.SaveAsText
未记录的功能),并解析内容。 CommandButton
看起来像这样:
Begin CommandButton
OverlapFlags =85
Left =907
Top =793
Width =3118
Height =1304
ForeColor =4210752
Name ="Command0"
Caption ="Command0"
OnClick ="[Event Procedure]"
GUID = Begin
0x925ed6d615e7594c83313637a6d582f4
End
GridlineColor =10921638
LayoutCachedLeft =907
LayoutCachedTop =793
LayoutCachedWidth =4025
LayoutCachedHeight =2097
BackColor =15123357
BorderColor =15123357
HoverColor =15652797
PressedColor =11957550
HoverForeColor =4210752
PressedForeColor =4210752
WebImagePaddingLeft =2
WebImagePaddingTop =2
WebImagePaddingRight =1
WebImagePaddingBottom =1
End
您可以检索所有控件的Name
属性(以及您喜欢的任何其他属性)的值,甚至可以判断OnClick
是否附加到事件处理程序过程。