PDA

Vollständige Version anzeigen : Sehr stabiles OPOS OCX


WeinGeist
15.06.2010, 15:57
Hallo Leute,

Vielleicht hat sich schonmal jemand mit den OCX der Hersteller von Barcode-Scanner etc. herumgeärgert. Mich hat es extrem viel Zeit, Geld und Nerven gekostet. Die meisten (imho alle) sind einfach unbrauchbar und extrem buggy. Vor allem im Einsatz mit Access. Abstürze, neuinstallation, neuregistrierungen, neukompilierungen der DB waren an der Tagesordnung.

Anbei eine Sammlung welche A umsonst und B ultrasolide programmiert ist. Habe es nun seit neun Monaten im Einsatz und seither hatten wir keinen einzigen Absturz mehr.

http://monroecs.com/oposccos.htm

Ich selber benutze Symbol DS3478 2D Funkscanner als USB, den Nachfolger DS3578 habe ich noch nicht getestet. Da OPOS standardisiert ist, dürfte es aber eh mit jedem Scanner etc. funktionieren welcher für OPOS vorgesehen ist.

Bei Interesse kann ich eine Klasse in den Code-Bereich stellen, welcher das Teil steuert und auswertet.

Hinweis: Das OCX dient dazu, die HID Emulation der Scanner, die häufig unerwünscht ist, zu umgehen. Damit kann man direkt auf Inputs reagieren. Man kann also nicht mit der Tastatur dazwischen funken. Auch ganze Abläufe lassen sich so mit zbsp. Datenmatrixen automatisieren. Bedienungsfehler dann ziemlich ausgeschlossen.

EDIT:
Für die Scanner braucht man lediglich folgende Files:
- Opos_Constants.dll
- OPOSScanner.ocx

Dann noch registrieren:
regsvr32 Opos_Constants.dll
regsvr32 OPOSScanner.ocx

Grüsse und viel Erfolg

ms4ever
21.06.2010, 17:40
Hallo Leute,

Bei Interesse kann ich eine Klasse in den Code-Bereich stellen, welcher das Teil steuert und auswertet.

Grüsse und viel Erfolg

Hallo WeinGeist,

ich wäre an einer solchen Klasse interessiert. :)

Grüße

quark
13.10.2010, 22:19
Ich wäre auch sehr stark an der Klasse interessiert :)

Wo kann man sie herbekommen ??

WeinGeist
14.10.2010, 08:19
Anbei mal ein Auszug wie man das ungefähr machen kann:
Option Compare Database
Option Explicit


Private WithEvents m_oScanner As OposScanner_CCO.OPOSScanner

Private WithEvents m_oBtnEnable As Access.CommandButton
Private m_oTextBoxStatusOnline As Access.TextBox
Private m_oTextBoxStatusEnabled As Access.TextBox

Private m_sDeviceName As String

Public Event DataEvent()

Private Sub Class_Initialize()
m_sDeviceName = "STI_USBSCANNER"
End Sub

Private Sub Class_Terminate()
Call Dispose
End Sub
Private Sub Dispose()
Call DisposeScanner
Set m_oBtnEnable = Nothing
Set m_oTextBoxStatusOnline = Nothing
Set m_oTextBoxStatusEnabled = Nothing
End Sub

Private Property Get ScannerObj() As OposScanner_CCO.OPOSScanner
If m_oScanner Is Nothing Then
Set m_oScanner = New OposScanner_CCO.OPOSScanner
End If
Set ScannerObj = m_oScanner
End Property
Private Sub DisposeScanner()
If Not m_oScanner Is Nothing Then
Call m_oScanner.ReleaseDevice
Call m_oScanner.Close
End If
Set m_oScanner = Nothing
End Sub

'##### Events #####
Private Sub m_oScanner_DataEvent(ByVal lStatus As Long)
Call SetStatusEnabledDisplay(m_oScanner.DeviceEnabled)
RaiseEvent DataEvent
End Sub
Private Sub m_oBtnEnable_Click()
On Error GoTo ErrorHandler

If Enabled Then
Call DisableScanner
Else
Call EnableScanner
End If

ExitMethod:
On Error GoTo 0
Exit Sub

ErrorHandler:
Call ErrorHandling(Err.Description, Err.Number, "m_oBtnEnable_Click", "Klassenmodul", "clsProgScanner")
Resume ExitMethod
End Sub
'##### Main Prop #####
Public Property Get DeviceName() As String
DeviceName = m_sDeviceName
End Property
Public Property Let DeviceName(ByVal sDeviceName As String)
m_sDeviceName = sDeviceName
End Property

Public Property Get Claimed() As Boolean
Claimed = ScannerObj.Claimed
End Property
Public Property Get Enabled() As Boolean
Enabled = ScannerObj.DeviceEnabled
End Property
Public Property Get Ergebnis()
Ergebnis = ScannerObj.ScanDataLabel
End Property

'##### Main Routines #####
Public Function InnitFormControls(Optional ByRef oBtnEnable As Access.CommandButton, Optional ByRef oDisplayOnline As TextBox, Optional ByRef oDisplayEnabled As TextBox)
If Not oBtnEnable Is Nothing Then
Set m_oBtnEnable = oBtnEnable
m_oBtnEnable.OnClick = "[Event Procedure]"
End If
If Not oDisplayOnline Is Nothing Then
Set m_oTextBoxStatusOnline = oDisplayOnline
End If
If Not oDisplayEnabled Is Nothing Then
Set m_oTextBoxStatusEnabled = oDisplayEnabled
End If
Call SetStatusOnlineDisplay(Claimed)
Call SetStatusEnabledDisplay(Claimed)
End Function

Public Function EnableScanner(Optional ByVal bAutoDisable As Boolean = True) As Long
Dim lErg As Long
ScannerObj.ClearInput
If Not Claimed Then
If OpenScanner <> 0 Then
lErg = 1
End If
Call ClaimScanner
End If
If Claimed Then
ScannerObj.DeviceEnabled = True
ScannerObj.DataEventEnabled = True
ScannerObj.FreezeEvents = False
ScannerObj.DecodeData = True
ScannerObj.AutoDisable = bAutoDisable
lErg = 2
Else
lErg = 3
End If
Call SetStatusEnabledDisplay(ScannerObj.DeviceEnabled)
EnableScanner = lErg
End Function
Public Sub DisableScanner()
ScannerObj.DeviceEnabled = False
Call SetStatusEnabledDisplay(ScannerObj.DeviceEnabled)
End Sub

Public Function OpenScanner() As Long
OpenScanner = ScannerObj.Open(DeviceName)
End Function
Public Function ClaimScanner(Optional ByVal lTimeout As Long = 1000) As Long
Dim lErg As Long
lErg = ScannerObj.ClaimDevice(lTimeout)
Call SetStatusOnlineDisplay(ScannerObj.Claimed)
ClaimScanner = lErg
End Function

'##### Display #####
Private Sub SetStatusOnlineDisplay(ByVal bOnline As Boolean)
If Not m_oTextBoxStatusOnline Is Nothing Then
If bOnline Then
m_oTextBoxStatusOnline.Value = "Online"
m_oTextBoxStatusOnline.BackColor = 65280
Else
m_oTextBoxStatusOnline.Value = "Offline"
m_oTextBoxStatusOnline.BackColor = 255
End If
End If
End Sub
Private Sub SetStatusEnabledDisplay(ByVal bEnabled As Boolean)
If Not m_oTextBoxStatusEnabled Is Nothing Then
If bEnabled Then
m_oTextBoxStatusEnabled.Value = "Enabled"
m_oTextBoxStatusEnabled.BackColor = 65280
Else
m_oTextBoxStatusEnabled.Value = "Disabled"
m_oTextBoxStatusEnabled.BackColor = 255
End If
End If
End Sub


- Das ganze in eine Klasse kopieren
- Da wo man den Scanner braucht, die Klasse referenzieren
- Evtl. Textboxen für Statusanzeigen übergeben --> Zwei Textfelder + 1 Button auf dem Textfeld für Enabled/Disabled.
--> Dient dazu, den Status des Scanners auf dem Formular sofort zu erkennen.

DeviceName ist für die Symbol-Funk-Scanner korrekt, muss aber vor dem enablen natürlich für den jeweiligen Scanner gesetzt werden.

Ist aber natürlich nicht zwingend nötig, man kann auch direkt mit den OPOS-Objekten arbeiten! Ich brauchte nur fast überall die gleichen Befehle, also gebündelt in eine einfache Klasse.

Sascha Trowitzsch
14.10.2010, 12:04
Ganz uneigennützig stelle ich hier auch noch einen Link zum Thema rein:
http://www.access-im-unternehmen.de/index1.php?id=300&BeitragID=687
;-)

Ciao, Sascha

quark
14.10.2010, 20:44
Wie im Betreff VIELEN DANK..

genau das ist das was mir noch gefehlt hat und die Zeit es zu entwickeln gefehlt hat :mrcool:


:grins: :grins: :grins: :grins: :grins: :grins:

WeinGeist
08.12.2011, 18:59
Kleines Update. Setze diverse DS3478 nun schon einige Jahre ein. Absolut problemlos, zuverlässig und sehr robust. Bin immernoch begeistert von dem Teil. Liegt für meinen Geschmack auch deutlich besser in der Hand als die anderen üblichen Verdächtigen. Funktioniert übrigens auch hervorragend über VmWareView und PCoIP-ZeroClients

Die Nörgeleien über deren untaugliches OCX haben auch gefruchtet, die fügen ihrem aktuellen Treiber nun auch die Moenroecs bei. :)

Der 3478 ist leider nicht mehr erhältlich, sondern der Nachfolger DS3578. Hat ein paar nette neue Features wie auf Wunsch vibrieren anstatt piepen. Der wollte aber erstmal rein gar nicht. Mit Hilfe des Supports und etwa drei neuen Firmwares (jedes mal einschicken) und vielen Stunden testen läuft das Teil nun auch.

Wer also den Nachfolger Symbol DS3578 einsetzen möchte (DS3478 ist nicht mehr erhältlich) sollte folgendes beachten:
Schon bei der Bestellung angeben, dass man die aktuellste Firmware möchte, wichtig Craddle und Scanner! Ansonsten hat man dauernd disconnects, mehrfach-Dataevents aufgrund zu kleinem TextPuffer etc. Sehr sehr nervig.

Mit dem PDF im Anhang bekommt man die Firmware raus. Mindestens folgende muss es sein.
STIREV: PAAANS00-004-R00
STIMMC: NBCHMAAH
ScannerFirmware: NBRBEAAB
ScannerFirmware Dat-File: PAAANS00-004-R00

Des weiteren muss der Device Name nicht mehr "STI_USBSCANNER" sondern "SYMBOL_SCANNER" heissen. Ob das auch beim DS3478 funktioniert, kann ich noch nicht sagen. Beim Innit meiner Klasse also entweder den Standardnamen ändern oder vor dem innit die Property DeviceName ändern.

Grund: Wird bis zu diesem Firwmare-Stand ein Gerät mit "STI_USBSCANNER" geöffnet, funktioniert der Scanner genau 1 Scan, dieser wird korrekt übermittelt. Sobald das Gerät disabled wird (Auto oder Man), kann es nicht mehr enabled werden. Er meldet zwar, dass es enabled ist, aber er ist es nicht. Strange aber wird vielleicht noch gefixt.

So steht dem erfolgreichen Gebrauch des neuen Symbols als OPOS-Gerät nix mehr im Wege. Einfach cool was sich mit kleinen Datamtrixen alles für Betriebsabläufe automatisieren lassen. :)

OpaTom
20.12.2011, 20:49
Kann ich mal was kurz abschweifgen und fragen, ob das mit genau diesenm Dateien von Monroe auch schon mal unter WIndows7-64 geschafft hat. Das mit dem Registrieren der Opos-Komponenten von Monroe (so wie in dem Beitrag von Trowitsch).
Ich habe die genannten Komponenten (mit Adminrechten) nach C:\windows\system32 kopiert, sie sind auch da. Nun regsvr32 c:\windows\system32\opos_constants.dll. Es kommt die Fehlermeldung

"Fehler beim Laden des Moduls "c:\windows\system32\opos_constants.dll".
Stellen Sie sicher, dass die Binärdatei am angegebenen Pfad gespeichert ist, oder debuggen Sie die Datei, um Probleme mit der binären Datei oder abhängigen DLL-Dateien auszuschließen.
Das angegebene Modul wurde nicht gefunden."

Aber es ist doch da. ich sehe es.

Ist wahrscheinlich ein grundsätzliches Problem, aber ich habe bislang nichts im web dazu gefunden, was mir hilft.

OpaTom
20.12.2011, 21:05
ich habe es teilweise geschafft, nachdem ich alles nach c:\windows\syswow64 kopiert habe und dort haben sich dann die beiden opos-Komponenten registriert. die gpsbarcode.ocx nicht.
Dasnn habe ich es noch einmal im system32-Ordner versucht. Da klappt es dann mit dem opos_constants.dll, mit dem anderen nicht (Fehler
"Das Modul "OPOSScanner.ocx" wurde geladen, der Aufruf an "DllRegisterServer" ist jedoch mit dem Fehlercode 0x80070005 ..."

das gpsbarcodce.ocx ging kein mal.

Muss / Wie muss man so was verstehen ?

Danke
Thomas

OpaTom
20.12.2011, 21:14
in meinem VMWare Window7-32 funktioniert das alles sofort, aber da will ich nicht arbeiten :-(

WeinGeist
21.12.2011, 07:52
Für meinen Rechner setze ich 64bit Windows 7 ein. Das OCX und die DLL muss - obwohl 32 bit - wie du schon gemerkt hast, nach SysWOW64. Dann registrieren und du kannst ihn problemlos in Access darauf verweisen. Setze das auch so ein. Kann mich allerdings nicht erinnern ob das normal mit regsvr32 registriert habe oder via Kombatibilitätsmodus. Eigentlich dürfte das nicht nötig sein.

GPSBarcode kann ich nicht sagen, keine Erfahrungen. Setze ActiveBarcode ein.

OpaTom
25.12.2011, 19:36
nach langem hin und her funktioniert es, aber leider habe ich mir auch nicht gemerkt, womit es denn nun genau wirklich funktioniert hat:-(

WeinGeist
28.03.2012, 18:42
Anbei kurz eine Erweiterung für einen globalen Scanner. Schafft einem einige Probleme vom Hals.

Neue Features:
- Scanner wird nur noch einmal pro Anwendung geladen und nicht in einem jedem Formular neu, Formularaufrufe werden sehr deutlich beschleunigt.
- beliebig viele Formulare/Instanzen können mit Scannersteuerung gleichzeitig geöffnet sein.
- Scanner-Events kommen nur jeweils im aktiven Formular an
- Scanner-Status wird für jedes Formular Zwischengespeichert, es kann also zwischen Forms hin und hergewechselt werden und Scanner wird automatisch auf den Status gesetzt, welchen er beim verlassen hatte.

Benötigte Klassen:
Klasse: clsProgScannerGlobal
Option Compare Database
Option Explicit

Private WithEvents m_oScanner As OposScanner_CCO.OPOSScanner

Private m_sDeviceName As String
Private m_lSenderWindow As Long

Public Event DataEvent(lSenderWindow As Long)
Public Event StatusDisplayUpd(bStatusOnline As Boolean, bStatusEnabled As Boolean)

Private Sub Class_Initialize()
m_sDeviceName = "SYMBOL_SCANNER" '"STI_USBSCANNER"
End Sub

Private Sub Class_Terminate()
Call Dispose
End Sub
Private Sub Dispose()
Call DisposeScanner
End Sub

Private Property Get ScannerObj() As OposScanner_CCO.OPOSScanner
If m_oScanner Is Nothing Then
Set m_oScanner = New OposScanner_CCO.OPOSScanner
End If
Set ScannerObj = m_oScanner
End Property
Private Sub DisposeScanner()
If Not m_oScanner Is Nothing Then
Call m_oScanner.ReleaseDevice
Call m_oScanner.Close
End If
Set m_oScanner = Nothing
End Sub

'##### Events #####
Private Sub m_oScanner_DataEvent(ByVal lStatus As Long)
'Debug.Print ScannerObj.ScanData
'Debug.Print ScannerObj.ScanDataLabel

RaiseEvent StatusDisplayUpd(m_oScanner.Claimed, m_oScanner.DeviceEnabled)
RaiseEvent DataEvent(SenderWindow)
End Sub



'##### Sender Window: Sollte jeweils beim aktivieren/Fokuserhalt des Formulars gesetzt werden + evtl andere einstellungen wie Enabled etc.
Public Property Get SenderWindow() As Long
SenderWindow = m_lSenderWindow
End Property
Public Property Let SenderWindow(ByVal lSenderWindow As Long)
m_lSenderWindow = lSenderWindow
End Property


'##### Main Prop #####
Public Property Get DeviceName() As String
DeviceName = m_sDeviceName
End Property
Public Property Let DeviceName(ByVal sDeviceName As String)
m_sDeviceName = sDeviceName
End Property

Public Property Get Claimed() As Boolean
Claimed = ScannerObj.Claimed
End Property
Public Property Get Enabled() As Boolean
Enabled = ScannerObj.DeviceEnabled
End Property
Public Property Get Ergebnis()

Ergebnis = ScannerObj.ScanDataLabel
'Debug.Print ScannerObj.BinaryConversion
'Debug.Print ScannerObj.DataCount

End Property

'##### Main Routines #####
Public Function EnableScanner(Optional ByVal bAutoDisable As Boolean = True) As Long
Dim lErg As Long
ScannerObj.ClearInput
If Not Claimed Then
If OpenScanner <> 0 Then
lErg = 1
End If
Call ClaimScanner
End If
If Claimed Then
ScannerObj.DeviceEnabled = True
ScannerObj.DataEventEnabled = True
ScannerObj.FreezeEvents = False
ScannerObj.DecodeData = True
ScannerObj.AutoDisable = bAutoDisable
lErg = 2
Else
lErg = 3
End If

RaiseEvent StatusDisplayUpd(ScannerObj.Claimed, ScannerObj.DeviceEnabled)

EnableScanner = lErg
End Function
Public Sub DisableScanner()
ScannerObj.DeviceEnabled = False
RaiseEvent StatusDisplayUpd(ScannerObj.Claimed, ScannerObj.DeviceEnabled)
End Sub

Public Function OpenScanner() As Long
OpenScanner = ScannerObj.Open(DeviceName)
End Function
Public Function ClaimScanner(Optional ByVal lTimeout As Long = 1000) As Long
Dim lErg As Long
lErg = ScannerObj.ClaimDevice(lTimeout)
RaiseEvent StatusDisplayUpd(ScannerObj.Claimed, ScannerObj.DeviceEnabled)
ClaimScanner = lErg
End Function



Dann die AnzeigeKlasse:
clsProgScannerGlobalAnzeige
Option Compare Database
Option Explicit

Private WithEvents m_oScanner As clsProgScannerGlobal

Private m_bAutoDisable As Boolean
Private m_bEnabled As Boolean
Private WithEvents m_oBtnEnable As Access.CommandButton

Private m_lSenderWindow As Long

Private m_oTextBoxStatusOnline As Access.TextBox
Private m_oTextBoxStatusEnabled As Access.TextBox

Public Event DataEvent()

Public Sub Dispose()
Call DisposeFormControls
Call DisposeScanner
End Sub

'##### Scanner Objekt #####
Private Property Get ScannerObj() As clsProgScannerGlobal
If (m_oScanner Is Nothing) Then
Set m_oScanner = GlobalScanner
m_bEnabled = m_oScanner.Enabled
End If
Set ScannerObj = m_oScanner
End Property
Public Property Let ScannerObj(ByRef oScanner As clsProgScannerGlobal)
Set m_oScanner = oScanner
End Property
Private Sub DisposeScanner()
Set m_oScanner = Nothing
End Sub

Private Sub m_oScanner_DataEvent(lSenderWindow As Long)
If (lSenderWindow = SenderWindow) Then RaiseEvent DataEvent
End Sub
Private Sub m_oScanner_StatusDisplayUpd(bStatusOnline As Boolean, bStatusEnabled As Boolean)
Call SetStatusOnlineDisplay(bStatusOnline)
Call SetStatusEnabledDisplay(bStatusEnabled)
End Sub

Public Property Get Ergebnis() As String
Ergebnis = ScannerObj.Ergebnis
End Property

Public Property Get Claimed() As Boolean
Claimed = ScannerObj.Claimed
End Property

'##### Main Functions #####
Public Property Get SenderWindow() As Long
SenderWindow = m_lSenderWindow
End Property
Public Property Let SenderWindow(ByVal lSenderWindow As Long)
ScannerObj.SenderWindow = lSenderWindow
If Enabled Then
Call ScannerObj.EnableScanner(AutoDisable)
Else
Call ScannerObj.DisableScanner
End If
m_lSenderWindow = lSenderWindow
End Property

Public Property Get Enabled() As Boolean
Enabled = m_bEnabled
End Property
Private Property Let Enabled(ByVal bEnabled As Boolean)
m_bEnabled = bEnabled
End Property
Public Property Get AutoDisable() As Boolean
AutoDisable = m_bAutoDisable
End Property
Public Property Let AutoDisable(ByVal bAutoDisable As Boolean)
m_bAutoDisable = bAutoDisable
End Property

Public Function EnableScanner(Optional ByVal bAutoDisable As Boolean = True) As Long
Dim lErg As Long
lErg = ScannerObj.EnableScanner(bAutoDisable)
m_bEnabled = (lErg = 2)
EnableScanner = lErg
End Function
Public Sub DisableScanner()
m_bEnabled = False
Call ScannerObj.DisableScanner
End Sub

'##### Form Controls #####
Private Sub DisposeFormControls()
Set m_oBtnEnable = Nothing
Set m_oTextBoxStatusOnline = Nothing
Set m_oTextBoxStatusEnabled = Nothing
End Sub

Public Function InnitFormControls(Optional ByRef oBtnEnable As Access.CommandButton, Optional ByRef oDisplayOnline As TextBox, Optional ByRef oDisplayEnabled As TextBox)
If Not (oBtnEnable Is Nothing) Then
Set m_oBtnEnable = oBtnEnable
m_oBtnEnable.OnClick = "[Event Procedure]"
End If
If Not (oDisplayOnline Is Nothing) Then
Set m_oTextBoxStatusOnline = oDisplayOnline
End If
If Not (oDisplayEnabled Is Nothing) Then
Set m_oTextBoxStatusEnabled = oDisplayEnabled
End If
Call SetStatusOnlineDisplay(ScannerObj.Claimed)
Call SetStatusEnabledDisplay(ScannerObj.Enabled)
End Function

Private Sub m_oBtnEnable_Click()
On Error GoTo ErrorHandler

If ScannerObj.Enabled Then
Call DisableScanner
Else
Call EnableScanner
End If

ExitMethod:
On Error GoTo 0
Exit Sub

ErrorHandler:
Call ErrorHandling(Err.Description, Err.Number, "m_oBtnEnable_Click", "Klassenmodul", "clsProgScannerGlobalAnzeige")
Resume ExitMethod
End Sub

'##### Display #####
Private Sub SetStatusOnlineDisplay(ByVal bOnline As Boolean)
If Not m_oTextBoxStatusOnline Is Nothing Then
If bOnline Then
m_oTextBoxStatusOnline.Value = "Online"
m_oTextBoxStatusOnline.BackColor = 65280
Else
m_oTextBoxStatusOnline.Value = "Offline"
m_oTextBoxStatusOnline.BackColor = 255
End If
End If
End Sub
Private Sub SetStatusEnabledDisplay(ByVal bEnabled As Boolean)
If Not m_oTextBoxStatusEnabled Is Nothing Then
If bEnabled Then
m_oTextBoxStatusEnabled.Value = "Enabled"
m_oTextBoxStatusEnabled.BackColor = 65280
Else
m_oTextBoxStatusEnabled.Value = "Disabled"
m_oTextBoxStatusEnabled.BackColor = 255
End If
End If
End Sub


In einem einfachen Modul modScanner oder so:
Private m_oScanner As clsProgScannerGlobal
'##### Scanner #####
Public Property Get GlobalScanner() As clsProgScannerGlobal
If m_oScanner Is Nothing Then
Set m_oScanner = New clsProgScannerGlobal
m_oScanner.DeviceName = GetScannerDevice
End If
Set GlobalScanner = m_oScanner
End Property

'##### Scanner (Optional) #####
Public Function ScannerOpen(ByRef oScanner As OposScanner_CCO.OPOSScanner, _
Optional ByVal sDeviceName As String = "GetFromDB", _
Optional ByVal lTimeout As Long = 1000) As Long

If sDeviceName = vbNullString Or sDeviceName = "GetFromDB" Then
sDeviceName = GetScannerDevice
End If
'Debug.Print sDeviceName
ScannerOpen = oScanner.Open(sDeviceName)
ScannerOpen = oScanner.Claim(lTimeout)
End Function

Public Function ScannerEnable(ByRef oScanner As OposScanner_CCO.OPOSScanner, _
Optional bAutoDisable As Boolean = True, _
Optional bAutoOpen As Boolean, _
Optional bSilent As Boolean = False) As Long

Dim bTry As Boolean
bTry = False
Start:
'Debug.Print "ScannerEnable"
If (oScanner.Claimed = False) Then
If (bAutoOpen = True) And (bTry = False) Then
If ScannerOpen(oScanner) = 0 Then
bTry = True
GoTo Start
Else
ScannerEnable = vbObjectError
'Debug.Print "Fehler, Scanner konnte nicht aktiviert werden"
End If
Else
'If bSilent = False Then Call MsgBox("Scanner hat keine Verbindung." & vbCrLf & "Bitte erst Open und Claim durchführen!", vbInformation Or vbOKOnly)
Debug.Print "Fehler, Scanner konnte nicht aktiviert werden."
ScannerEnable = vbObjectError
End If
Else
With oScanner
.DeviceEnabled = True
.DataEventEnabled = True
.FreezeEvents = False
.DecodeData = True 'Enable or Disable to see Decoded or orinal data
.AutoDisable = bAutoDisable
End With
ScannerEnable = 0
End If
End Function



In jedem Form welches mit der Scannerfunktionalität ausgerüstet werden soll:
Private WithEvents m_oScanner As clsProgScannerGlobalAnzeige


Private Sub Form_Open(Cancel As Integer)
Call Scanner.EnableScanner
End Sub
Private Sub Form_Unload(Cancel As Integer)
If (Cancel = False) Then Call DisposeScanner
End Sub
Private Sub Form_Activate()
Scanner.SenderWindow = Me.hwnd
End Sub

'##### Scanner #####
Private Property Get Scanner() As clsProgScannerGlobalAnzeige
If (m_oScanner Is Nothing) Then
Set m_oScanner = New clsProgScannerGlobalAnzeige
Call m_oScanner.InnitFormControls(Me.btnEnableScanner, Me.txtStatusScanner, Me.txtScannerEnabled)
End If
Set Scanner = m_oScanner
End Property
Private Sub DisposeScanner()
Set m_oScanner = Nothing
End Sub
Private Sub m_oScanner_DataEvent()
If Not (Scanner.Claimed) Then
Call MsgBoxEx("Claimed = False: Verbindung zum Scanner verloren, bitte erneut scannen")
Else
'Irgendetwas mit Scanner.ergebnis anstellen
debug.print scanner.ergebnis
End If
End Sub

Wie immer, Zeit um allzuviele Fragen zu beantworten habe ich keine. Sollte aber nicht allzu schwer umzusetzen sein. Verbesserungsvorschläge können gerne gemacht werden.

quark
13.11.2012, 16:48
Super Dank für deine neue Umsetzung. Auch wenn der Thread schon älter ist ;)

Ich war nun an dem Punkt das ich es doch mal fest einbauen sollte.

Nur bekomme ich jedesmal beim aufruf der Form den folgenden Bereich als Fehler angezeigt. Verweise sind auch alle gesetzt...

Laufzeitfehler 424 "Objekt erforderlich
in dem Bereich
If (m_oScanner Is Nothing) Then



'##### Scanner #####
Private Property Get Scanner() As clsProgScannerGlobalAnzeige
If (m_oScanner Is Nothing) Then
Set m_oScanner = New clsProgScannerGlobalAnzeige
Call m_oScanner.InnitFormControls(Me.btnEnableScanner, Me.txtStatusScanner, Me.txtScannerEnabled)
End If
Set Scanner = m_oScanner
End Property

Würde mich für Hilfe freuen..

quark
13.11.2012, 16:56
Fehler gefunden ich Esel....

Private WithEvents m_oScanner As clsProgScannerGlobalAnzeige

das fehlte....