为 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 这是要显示的字符串,ByteModeCharsetNameErrorCorrectionLevelForeRGBBackRGB,还有方法RefreshCls和事件OnClickOnDblClick

它在 VB6 应用程序 + Excel 工作表 + Excel 表单中工作正常,但在 Access 表单、报告等中表现怪异

在 Excel 中一切看起来都像人们所期望的那样:

这是它在 Access 中的样子:

这是我的问题:

  1. 访问控制 "different" 是否优于其他办公应用程序?
  2. 为什么隐藏在编辑器中的属性?
  3. 如何 "move" 一些属性到其他选项卡(类别),例如 ForeRGB 到选项卡格式(通常用于文本框等)?
  4. 如何创建 ControlSource 属性(在 DATA 选项卡上)可以直接绑定到记录集而无需使用 VBA?这样,我希望我也可以在连续表单上使用控件。事实上,这是最重要的问题。
  5. 调整大小的一些技巧? (不重要)

我想我已经很接近我的目标了,但我被困在了这一点上。我知道 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

一一解答您的问题:

  1. 是的。 Access 中的 ActiveX 控件肯定与其他 Office 应用程序中的不同。

    在 Access 中,有一个通用的 CustomControl 控件封装了所有 ActiveX 控件,并为任何控件提供了一组默认的事件、属性和方法,例如边框属性、重新查询方法和输入事件。

    被封装的控件对象可以通过CustomControl.Object属性访问

  2. 没有显示这些属性,因为您指的是一般意义上的自定义控件,并且只获取它的属性。

    要获取您想要的对象,请使用以下命令:

    Dim qrObj As QRCode
    Set qrObj = QR.Object
    
  3. 显然不可能,选项卡布局由 Access 决定

  4. 也不可能。 ActiveX 控件必须包含该功能,而这个不包含。通常,在连续的子窗体中使用 ActiveX 控件来为每一行显示不同的内容很难甚至是不可能的

  5. 调整外部控件的大小,然后调用 CustomControl.SizeToFit 通常应该可以正常工作

有些我认为不可能的事情当然可以通过修改ActiveX控件的源代码来实现。

对于 4. 尝试设置控件的 DataBindingBehavior to vbSimpleBound 以便标量 属性(在您的情况下为 ControlSource)可以通过 DataSource 和 [=14= 绑定] 属性。

对于3.使用Tools->Procedure Attributes...菜单,selectControlSource在Name中展开Advanced>>和selectDataProperty Category 组合框中。您可以通过 对象浏览器 (F2) 执行相同的操作。找到您的控件,右键单击您的 property/method(应该是 粗体 )并选择 Properties... 上下文菜单选项。这适用于方法,比 Tools->Procedure Attributes... 方法更通用。