Синтаксис VBA6 и драйвер OCX принтера OPOS в Access 2007

Я использую принтер OPOS и Access 2007, и я пытаюсь получить доступ к коду VBA, взаимодействующему с драйвером.

Пока у меня есть эта программа VBA6, которую я пытаюсь разжевать в Access VBA:

Form1.frm:

VERSION 5.00
Object = "{CCB90150-B81E-11D2-AB74-0040054C3719}#1.0#0"; "OPOSPOSPrinter.ocx"
Begin VB.Form Step1 
   BorderStyle     =   1  'fixed
   Caption         =   "Step1: ""Hello OPOS"" is printed "
   ClientHeight    =   1590
   ClientLeft      =   45
   ClientTop       =   330
   ClientWidth     =   3795
   LinkTopic       =   "MDIForm1"
   MaxButton       =   0   'False
   MinButton       =   0   'False
   ScaleHeight     =   1590
   ScaleWidth      =   3795
   StartUpPosition =   3  'Windows default value
   Begin VB.CommandButton cmdPrint 
      Caption         =   "Print Now"
      Height          =   450
      Left            =   1155
      TabIndex        =   0
      Top             =   525
      Width           =   1515
   End
   Begin OposPOSPrinter_CCOCtl.OPOSPOSPrinter OPOSPOSPrinter1 
      Left            =   3120
      OleObjectBlob   =   "Step1.frx":0000
      Top             =   960
   End
End
Attribute VB_Name = "Step1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
' Step 1: "Hello OPOS" gets printed

Option Explicit

Private Sub cmdPrint_Click()

'send a string to the printer using method PrintNormal
'vbCrLf is VisualBasic standard newline
    OPOSPOSPrinter1.PrintNormal PTR_S_RECEIPT, "Hello OPOS" + vbCrLf

End Sub


Private Sub Form_Load()

    With OPOSPOSPrinter1
        'open device
        .Open "Unit1"

        'Claim exclusive access
        .ClaimDevice 1000

        'enable the device
        .DeviceEnabled = True
    End With

End Sub


Private Sub Form_Unload(Cancel As Integer)

    With OPOSPOSPrinter1
        'stop device
        .DeviceEnabled = False

        'Release exclusive access
        .ReleaseDevice

        'Done with the printer
        .Close
    End With

End Sub

Также

Этот другой файл включен: OposAll.bas

... как видно из файла проекта VBA:

Type=Exe
Form=Step1.frm
Module=OPOS; ..\..\..\..\Include\OposAll.bas
Object={CCB90150-B81E-11D2-AB74-0040054C3719}#1.0#0; OPOSPOSPrinter.ocx
IconForm="Step1"
Startup="Step1"
HelpFile=""
Title="SamplePrint1"
Command32=""
Name="SamplePrint1"
HelpContextID="0"
CompatibleMode="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
VersionCompanyName="MECS"
CompilationType=0
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=0
Unattended=0
ThreadPerObject=0
MaxNumberOfThreads=1

[MS Transaction Server]
AutoRefresh=1

Мне сложно понять, как перевести это в рабочий код Access VBA.

Мои вопросы могут показаться глупыми, но имейте в виду, что я не знаю ни VBA6, ни Access 2007 VBA. Но работать с версией DLL было довольно просто, и я подумал, что и с этой версией можно справиться.

1) Глупый вопрос: что означает этот фрагмент кода? Инициализирует какой-то объект? Кажется, Access не любит OPOSPOSPrinter1 часть, есть ли другой способ сделать это в Access?

   Begin OposPOSPrinter_CCOCtl.OPOSPOSPrinter OPOSPOSPrinter1
      Left            =   3120
      OleObjectBlob   =   "Step1.frx":0000
      Top             =   960
   End

2) Это, возможно, самый важный вопрос: Есть ли более разумный способ взаимодействия с драйвером OCX из Access 2007 VBA?


person マルちゃん だよ    schedule 18.06.2013    source источник
comment
Вы пробовали добавить его в качестве ссылки? или добавить его как элемент управления ActiveX в форму доступа?   -  person Alex K.    schedule 18.06.2013
comment
Если бы вы могли указать мне, как это сделать с драйвером, это сойдет в качестве ответа. Мои навыки поиска в Google - отстой, или уже слишком поздно, но я не нашел ничего полезного.   -  person マルちゃん だよ    schedule 18.06.2013


Ответы (1)


Как я обнаружил на веб-сайте MS, в Access 2007 вам нужно вызвать диалоговое окно регистрации ActiveX в некоторых непонятный путь:

Open a trusted database, or enable macros in the database.
Press CTRL+G to open the Immediate window.
Type the following code, and then press ENTER.

DoCmd.RunCommand acCmdRegisterActiveXControls

Затем я зарегистрировал свой экзотический элемент управления OCX и внес его в список как OPOS POSPrinter Control 1.13.001 [Public, by CRM/RCS-Dayton].

После этого я добавил недавно зарегистрированный элемент управления из столь же скрытой кнопки Insert ActiveX:

ИМХО сотрудники MS используют бэкдор своей ОС, чтобы обманывать отчаявшихся пользователей, которые пытаются найти что-то на ленте®

Как только элемент управления был добавлен в мою форму, я приступил к добавлению кода для загрузки и выгрузки драйвера:

Private Sub Form_Load()

    With OPOSPOSPrinter1
        'open device
        .Open "Unit1"

        'Claim exclusive access
        .ClaimDevice 1000

        'enable the device
        .DeviceEnabled = True
    End With

End Sub


Private Sub Form_Unload(Cancel As Integer)

    With OPOSPOSPrinter1
        'stop device
        .DeviceEnabled = False

        'Release exclusive access
        .ReleaseDevice

        'Done with the printer
        .Close
    End With

End Sub

Как видите, он вообще не изменился по сравнению с исходной формой VBA6. Да, и этот синтаксис: WITH <resource> (Body) END WITH - это просто VBA-эквивалент C # using или новый try (<autoclosable>) в Java. Итак, когда вы говорите WITH OPOSPOSPrinter1, вы указываете на только что добавленный элемент управления ActiveX. Проверьте имя, выбранное для него Access.

Импортировать opos.bas было несложно, вероятно, потому, что Ribbon® вообще не участвовал в этом процессе. В редакторе кода щелкните правой кнопкой мыши дерево проекта и выберите «Импорт ...». Файлы .bas дословно импортируются как «Модули». Может быть, потому что это просто набор определений переменных.

Команда печати также компилируется без изменений:

Private Sub Command1_Click()
    OPOSPOSPrinter1.PrintNormal PTR_S_RECEIPT, "Hello OPOS" + vbCrLf
End Sub

Я еще не тестировал монструозность, но обещаю, что обновлю, когда соберу отзывы от устройства.

Наконец, чтобы ответить на мой собственный глупый вопрос. Синтаксис в моем вопросе 1) - это способ VBA6 объявления нового элемента управления. Кажется, Access делает это где-то еще.

person マルちゃん だよ    schedule 19.06.2013