Создание элемента управления ActiveX QRCode для MS Access: свойство источника элемента управления - PullRequest
0 голосов
/ 11 ноября 2018

Я хотел внедрить QR-код для Access2010 и обнаружил, что https://github.com/yas78/QRCodeLibVBA. Ссылка на XLAM из Access не работает, и я не хотел вставлять все модули непосредственно в Access, поскольку это делает проект беспорядочным. Поэтому я решил создать файл OCX, используя древний VB6, так как это был самый простой способ объединить все биты в один простой объект.

Наконец, я создал OCX, у которого есть несколько ключевых свойств: DataString - строка для отображения, ByteModeCharsetName, ErrorCorrectionLevel, ForeRGB и BackRGB, также есть методы Refresh , Cls и события OnClick и OnDblClick

Он отлично работает в приложениях VB6 + листы Excel + формы Excel, но ведет себя странно в формах Access, отчетах и ​​т. Д.

Все выглядит так, как и следовало ожидать в Excel: Excel printscreen

Вот так это выглядит в Access: MS Access printscreen

  • Пользовательские свойства отображаются на вкладке «Другое», но они вообще не предлагаются в редакторе VBA! Однако он компилируется при вводе вручную.
  • Управление изменением размера ведет себя странно
  • События элемента управления, такие как OnClick, не отображаются на вкладке «Лист свойств»

Вот мои вопросы:

  1. Отличаются ли элементы управления доступом от других офисных приложений?
  2. Какого черта свойства скрыты в редакторе?
  3. Как "переместить" некоторые свойства на другие вкладки (категории), например, ForeRGB на вкладку Формат (как обычно для текстовых полей и т. Д.)?
  4. Как создать ControlSource объекты (на вкладке ДАННЫЕ), которые могут быть напрямую связаны с набором записей без использования VBA? Таким образом, я надеюсь, что я мог бы использовать контроль и для непрерывных форм. На самом деле это самый важный вопрос.
  5. Несколько советов по изменению размера? (не важно)

Я думаю, что я довольно близок к своей цели, но я застрял в этой точке. Я знаю, что VB6 устарел, но после прочтения Создание пользовательских элементов управления для MS Access 2010 VB6 кажется легким выбором. Есть ли альтернатива написанию OCX?

РЕДАКТИРОВАТЬ: Окончательный рабочий контроль доступен здесь https://github.com/Combinatix/QRCodeAX

Ответы [ 3 ]

0 голосов
/ 11 ноября 2018

Чтобы ответить на ваши вопросы один за другим:

  1. Да. Элементы управления ActiveX в Access, безусловно, отличаются от других приложений Office.

    В Access есть один общий CustomControl элемент управления, который инкапсулирует все элементы управления ActiveX и предлагает набор по умолчанию событий, свойств и методов для любого элемента управления, таких как свойства границ, метод запроса и ввод событие.

    Доступ к объекту инкапсулируемого элемента управления можно получить с помощью CustomControl.Object proprty

  2. Эти свойства не отображаются, поскольку вы ссылаетесь на пользовательский элемент управления в общем смысле и получаете только свойства для него.

    Чтобы получить нужный объект, используйте следующее:

    Dim qrObj As QRCode
    Set qrObj = QR.Object
    
  3. Это просто невозможно, расположение вкладок определяется Access

  4. Также невозможно. Элемент управления ActiveX должен включать эти функции, а этот - нет. Как правило, использование элементов управления ActiveX в непрерывных подчиненных формах для отображения чего-то различного для каждой строки трудно или невозможно

  5. Изменение размера внешнего элемента управления, а затем вызов CustomControl.SizeToFit обычно должны работать

Некоторые вещи, которые я считаю невозможными , конечно, могут быть достигнуты путем изменения исходного кода элемента управления ActiveX.

0 голосов
/ 11 ноября 2018

Для 4. попробуйте установить DataBindingBehavior вашего элемента управления на vbSimpleBound, чтобы скалярное свойство (ControlSource в вашем случае) можно было связать с помощью свойств DataSource и DataMember.

Для 3. используйте меню Tools->Procedure Attributes..., выберите ControlSource в поле Имя, разверните Advanced>> и выберите Данные в Property Category поле со списком. Вы можете сделать то же самое через Обозреватель объектов (F2) . Найдите элемент управления, щелкните правой кнопкой мыши свое свойство / метод (должно быть полужирный ) и выберите Properties... параметр контекстного меню. Это работает с методами и является более универсальным, чем Tools->Procedure Attributes... подход.

0 голосов
/ 11 ноября 2018

Совершенно другой и гораздо менее громоздкий подход заключается в создании QR-кода онлайн и загрузке его для отображения в (связанном) элементе управления изображением.

Я написал статью об отображении онлайн-изображений:

Показывать картинки прямо с URL-адресов в формах и отчетах Access

Некоторый код, конечно, необходим, но гораздо меньше, чем тот, на который вы ссылаетесь на 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

и это сработало сразу:

Sample

Полный код можно найти на GitHub: VBA.PictureUrl

...