为 MS Access 制作 QRCode ActiveX 控件:控件源 属性
Making QRCode ActiveX Control for MS Access: Control Source Property
我想实现一个二维码到Access2010,我找到了https://github.com/yas78/QRCodeLibVBA。从 Access 引用 XLAM 不起作用,我不想将所有模块直接插入到 Access,因为这会使项目变得混乱。
所以我决定使用古老的 VB6 创建一个 OCX 文件,因为它似乎是将所有位一起封装到一个简单对象中的最简单方法。
最后,我制作了一个具有几个关键属性的 OCX:DataString
这是要显示的字符串,ByteModeCharsetName
、ErrorCorrectionLevel
、ForeRGB
和 BackRGB
,还有方法Refresh
、Cls
和事件OnClick
和OnDblClick
它在 VB6 应用程序 + Excel 工作表 + Excel 表单中工作正常,但在 Access 表单、报告等中表现怪异
在 Excel 中一切看起来都像人们所期望的那样:
这是它在 Access 中的样子:
- 自定义属性在 "Other" 选项卡上可见,但在 VBA 编辑器中根本不提供!但是,它在手动输入时会编译。
- 调整控件大小的行为很奇怪
OnClick
控件的事件未显示在 属性 Sheet 的选项卡事件中
这是我的问题:
- 访问控制 "different" 是否优于其他办公应用程序?
- 为什么隐藏在编辑器中的属性?
- 如何 "move" 一些属性到其他选项卡(类别),例如
ForeRGB
到选项卡格式(通常用于文本框等)?
- 如何创建
ControlSource
属性(在 DATA 选项卡上)可以直接绑定到记录集而无需使用 VBA?这样,我希望我也可以在连续表单上使用控件。事实上,这是最重要的问题。
- 调整大小的一些技巧? (不重要)
我想我已经很接近我的目标了,但我被困在了这一点上。我知道 VB6 已过时,但在阅读 Creating Custom Controls for ms access 2010 之后,VB6 似乎是一个简单的选择。编写 OCX 的任何替代方法?
编辑:此处提供最终工作控制 https://github.com/Combinatix/QRCodeAX
一种非常不同且更简单的方法是在线生成 QR 码并下载它们以显示在(绑定的)图片控件中。
我写了一篇关于显示在线图片的文章:
Show pictures directly from URLs in Access forms and reports
当然需要一些代码,但比您提到的 GiHub 上的代码要少得多,尽管要在此处完整列出很多。
它使用此函数检索图像:
' Download (picture) file from a URL of a hyperlink field to a
' (temporary) folder, and return the full path to the downloaded file.
'
' This can be used as the control source for a bound picture control.
' If no Folder is specified, the user's IE cache folder is used.
'
' Typical usage in the RecordSource for a form or report where Id is
' the unique ID and Url is the hyperlink field holding the URL to
' the picture file to be displayed:
'
' - to a cached file where parameter Id is not used:
'
' Select *, UrlContent(0, [Url]) As Path From SomeTable;
'
' - or, where Id is used to create the local file name:
'
' Select *, UrlContent([Id], [Url], "d:\somefolder") As Path From SomeTable;
'
' Then, set ControlSource of the bound picture control to: Path
'
' 2017-05-28. Gustav Brock, Cactus Data ApS, CPH.
'
Public Function UrlContent( _
ByVal Id As Long, _
ByVal Url As String, _
Optional ByVal Folder As String) _
As Variant
Const NoError As Long = 0
Const Dot As String = "."
Const BackSlash As String = "\"
Dim Address As String
Dim Ext As String
Dim Path As String
Dim Result As String
' Strip leading and trailing octothorpes from URL string.
Address = HyperlinkPart(Url, acAddress)
' If Address is a zero-length string, Url was not wrapped in octothorpes.
If Address = "" Then
' Use Url as is.
Address = Url
End If
If Folder = "" Then
' Import to IE cache.
Result = DownloadCacheFile(Address)
Else
If Right(Folder, 1) <> BackSlash Then
' Append a backslash.
Folder = Folder & BackSlash
End If
' Retrieve extension of file name.
Ext = StrReverse(Split(StrReverse(Address), Dot)(0))
' Build full path for downloaded file.
Path = Folder & CStr(Id) & Dot & Ext
If DownloadFile(Address, Path) = NoError Then
Result = Path
End If
End If
UrlContent = Result
End Function
我把这个URL粘贴到一条记录中:
https://chart.googleapis.com/chart?cht=qr&chs=300x300&chl=23457
并且立即生效:
可在 GitHub 找到完整代码:VBA.PictureUrl
一一解答您的问题:
是的。 Access 中的 ActiveX 控件肯定与其他 Office 应用程序中的不同。
在 Access 中,有一个通用的 CustomControl 控件封装了所有 ActiveX 控件,并为任何控件提供了一组默认的事件、属性和方法,例如边框属性、重新查询方法和输入事件。
被封装的控件对象可以通过CustomControl.Object
属性访问
没有显示这些属性,因为您指的是一般意义上的自定义控件,并且只获取它的属性。
要获取您想要的对象,请使用以下命令:
Dim qrObj As QRCode
Set qrObj = QR.Object
显然不可能,选项卡布局由 Access 决定
也不可能。 ActiveX 控件必须包含该功能,而这个不包含。通常,在连续的子窗体中使用 ActiveX 控件来为每一行显示不同的内容很难甚至是不可能的
调整外部控件的大小,然后调用 CustomControl.SizeToFit
通常应该可以正常工作
有些我认为不可能的事情当然可以通过修改ActiveX控件的源代码来实现。
对于 4. 尝试设置控件的 DataBindingBehavior
to vbSimpleBound
以便标量 属性(在您的情况下为 ControlSource
)可以通过 DataSource
和 [=14= 绑定] 属性。
对于3.使用Tools->Procedure Attributes...
菜单,selectControlSource
在Name中展开Advanced>>
和selectData 在 Property Category
组合框中。您可以通过 对象浏览器 (F2) 执行相同的操作。找到您的控件,右键单击您的 property/method(应该是 粗体 )并选择 Properties...
上下文菜单选项。这适用于方法,比 Tools->Procedure Attributes...
方法更通用。
我想实现一个二维码到Access2010,我找到了https://github.com/yas78/QRCodeLibVBA。从 Access 引用 XLAM 不起作用,我不想将所有模块直接插入到 Access,因为这会使项目变得混乱。 所以我决定使用古老的 VB6 创建一个 OCX 文件,因为它似乎是将所有位一起封装到一个简单对象中的最简单方法。
最后,我制作了一个具有几个关键属性的 OCX:DataString
这是要显示的字符串,ByteModeCharsetName
、ErrorCorrectionLevel
、ForeRGB
和 BackRGB
,还有方法Refresh
、Cls
和事件OnClick
和OnDblClick
它在 VB6 应用程序 + Excel 工作表 + Excel 表单中工作正常,但在 Access 表单、报告等中表现怪异
在 Excel 中一切看起来都像人们所期望的那样:
这是它在 Access 中的样子:
- 自定义属性在 "Other" 选项卡上可见,但在 VBA 编辑器中根本不提供!但是,它在手动输入时会编译。
- 调整控件大小的行为很奇怪
OnClick
控件的事件未显示在 属性 Sheet 的选项卡事件中
这是我的问题:
- 访问控制 "different" 是否优于其他办公应用程序?
- 为什么隐藏在编辑器中的属性?
- 如何 "move" 一些属性到其他选项卡(类别),例如
ForeRGB
到选项卡格式(通常用于文本框等)? - 如何创建
ControlSource
属性(在 DATA 选项卡上)可以直接绑定到记录集而无需使用 VBA?这样,我希望我也可以在连续表单上使用控件。事实上,这是最重要的问题。 - 调整大小的一些技巧? (不重要)
我想我已经很接近我的目标了,但我被困在了这一点上。我知道 VB6 已过时,但在阅读 Creating Custom Controls for ms access 2010 之后,VB6 似乎是一个简单的选择。编写 OCX 的任何替代方法?
编辑:此处提供最终工作控制 https://github.com/Combinatix/QRCodeAX
一种非常不同且更简单的方法是在线生成 QR 码并下载它们以显示在(绑定的)图片控件中。
我写了一篇关于显示在线图片的文章:
Show pictures directly from URLs in Access forms and reports
当然需要一些代码,但比您提到的 GiHub 上的代码要少得多,尽管要在此处完整列出很多。
它使用此函数检索图像:
' Download (picture) file from a URL of a hyperlink field to a
' (temporary) folder, and return the full path to the downloaded file.
'
' This can be used as the control source for a bound picture control.
' If no Folder is specified, the user's IE cache folder is used.
'
' Typical usage in the RecordSource for a form or report where Id is
' the unique ID and Url is the hyperlink field holding the URL to
' the picture file to be displayed:
'
' - to a cached file where parameter Id is not used:
'
' Select *, UrlContent(0, [Url]) As Path From SomeTable;
'
' - or, where Id is used to create the local file name:
'
' Select *, UrlContent([Id], [Url], "d:\somefolder") As Path From SomeTable;
'
' Then, set ControlSource of the bound picture control to: Path
'
' 2017-05-28. Gustav Brock, Cactus Data ApS, CPH.
'
Public Function UrlContent( _
ByVal Id As Long, _
ByVal Url As String, _
Optional ByVal Folder As String) _
As Variant
Const NoError As Long = 0
Const Dot As String = "."
Const BackSlash As String = "\"
Dim Address As String
Dim Ext As String
Dim Path As String
Dim Result As String
' Strip leading and trailing octothorpes from URL string.
Address = HyperlinkPart(Url, acAddress)
' If Address is a zero-length string, Url was not wrapped in octothorpes.
If Address = "" Then
' Use Url as is.
Address = Url
End If
If Folder = "" Then
' Import to IE cache.
Result = DownloadCacheFile(Address)
Else
If Right(Folder, 1) <> BackSlash Then
' Append a backslash.
Folder = Folder & BackSlash
End If
' Retrieve extension of file name.
Ext = StrReverse(Split(StrReverse(Address), Dot)(0))
' Build full path for downloaded file.
Path = Folder & CStr(Id) & Dot & Ext
If DownloadFile(Address, Path) = NoError Then
Result = Path
End If
End If
UrlContent = Result
End Function
我把这个URL粘贴到一条记录中:
https://chart.googleapis.com/chart?cht=qr&chs=300x300&chl=23457
并且立即生效:
可在 GitHub 找到完整代码:VBA.PictureUrl
一一解答您的问题:
是的。 Access 中的 ActiveX 控件肯定与其他 Office 应用程序中的不同。
在 Access 中,有一个通用的 CustomControl 控件封装了所有 ActiveX 控件,并为任何控件提供了一组默认的事件、属性和方法,例如边框属性、重新查询方法和输入事件。
被封装的控件对象可以通过
CustomControl.Object
属性访问没有显示这些属性,因为您指的是一般意义上的自定义控件,并且只获取它的属性。
要获取您想要的对象,请使用以下命令:
Dim qrObj As QRCode Set qrObj = QR.Object
显然不可能,选项卡布局由 Access 决定
也不可能。 ActiveX 控件必须包含该功能,而这个不包含。通常,在连续的子窗体中使用 ActiveX 控件来为每一行显示不同的内容很难甚至是不可能的
调整外部控件的大小,然后调用
CustomControl.SizeToFit
通常应该可以正常工作
有些我认为不可能的事情当然可以通过修改ActiveX控件的源代码来实现。
对于 4. 尝试设置控件的 DataBindingBehavior
to vbSimpleBound
以便标量 属性(在您的情况下为 ControlSource
)可以通过 DataSource
和 [=14= 绑定] 属性。
对于3.使用Tools->Procedure Attributes...
菜单,selectControlSource
在Name中展开Advanced>>
和selectData 在 Property Category
组合框中。您可以通过 对象浏览器 (F2) 执行相同的操作。找到您的控件,右键单击您的 property/method(应该是 粗体 )并选择 Properties...
上下文菜单选项。这适用于方法,比 Tools->Procedure Attributes...
方法更通用。