Forum: PC-Programmierung ocx Datei in VBA verwenden


von Tobi (Gast)


Lesenswert?

Hallo,

ich würde gerne einen USB-AD-Wandler auslesen. Dieser wird über die 
"libadx.ocx" angesprochen. Für Visual Basic ist nachfolgendes 
Beispielprogramm enthalten. Ich hab die "libadx.ocx" Datei bereits über 
regsvr32.exe registriert.
Jetzt wäre meine Frage, wie kann ich die Funktionen dieser Datei auch in 
VBA verwenden? Wie initalisiere ich die Datei?

Gruß Tobi


Object = "{FFE1D535-EC3C-40CF-B51D-A9F23819E524}#1.0#0"; "libadx.ocx"
Begin VB.Form MainForm
   Begin LIBADX.LIBADX LIBADX1
      Height          =   225
      Left            =   3840
      TabIndex        =   2
      Top             =   600
      Width           =   240
      _Version        =   65536
      _ExtentX        =   423
      _ExtentY        =   397
      _StockProps     =   0
   End
End

Option Explicit

Const SAMPLES As Integer = 1000
Const PATH As String = "scan1.lfx"

Private Sub Start_Click()

    If Not LIBADX1.Open(Device.Text) Then
        MsgBox "Konnte Messsystem " & Device.Text & " nicht öffnen"
        Exit Sub
    End If

    Start.Enabled = False

    '100Hz abtastrate, 1000 samples (= 1 sec.)
    LIBADX1.ScanPrepare 0.01, SAMPLES

    'kanal 1 & 2 speichern
    LIBADX1.ScanAnalogIn 1, 0
    LIBADX1.ScanAnalogIn 2, 0

    'Scan durchführen
    LIBADX1.Scan

    'Scan speichern
    If Not LIBADX1.ScanSave(PATH) Then
        MsgBox "Messdatei " & PATH & " konnte nicht angelegt werden"
        Exit Sub
    End If

    MsgBox "Scan unter " & PATH & " gespeichert"

    Start.Enabled = True
End Sub

von thom (Gast)


Lesenswert?

Mahlzeit, prinzipiell ist das möglich, gibt aber eventuell einige Hürden 
wegen der Datenumwandlung.

Möglichkeit 1, du verwendest eine Form in vba, der darfst du auch OCX'n 
aufpinseln (Steuerelemente), ggf muß dies mittels zusätzliche 
Steuerelemente deinem Projekt bekannt gemacht werden. Dies währe der 
leichteste Weg.
Vorteil - Eigenschaften/Aufzählungen/Funktionen sind in der 
Autoverfollständigung enthalten
Nachteil - kann Ärger bei neuer OCX (neuerer Version) geben, eventuell 
lässt sich das Projekt nicht mehr öffnen

Möglichkeit 2, dynamisch erstellen,
Vorteil : gibt den Versionsärger nicht, ist in allen Modulen einbindbar
Nachteil : da es ein dynamisches Objekt ist (late bind), muß man die 
Funktionen und variablen / parameter kennen.

Beispiel
Dim oObject As Object
set oObject = 
CreateObject("{FFE1D535-EC3C-40CF-B51D-A9F23819E524}#1.0#0")
' Teilweise haben die auch richtige Namen, eventuell mal in der registry
'nach dem Schlüsselwert suchen
' Name ist meist sowas wie LIBADX.LIBADX1 oder ähnlich
' Createobject erzeugt ein com Objekt mit dem übergebenen Namen bzw. der 
ID
If Not oObject Is Nothing Then
    oObject.ScanAnalogIn 1, 0
End If

set oObject = nothing

von Exce(l)ntriker (Gast)


Lesenswert?

Hi Thom,

kannst du mehr zu dem Thema sagen, das würde mich auch interessieren?
In deinem Beispiel werden ja keine Objekteigenschaften angefasst. Wenn 
ich jetzt unter VS2008 ein .Net Klassenmodul als OCX erstelle, kann ich 
das dann als Objekt unter VBA instanzieren? (ist das so richtig 
ausgedrückt?)
Wie sehen die Objekteigenschatfen dann aus?

Grüße,
Stefan

von Exce(l)ntriker (Gast)


Lesenswert?

>In deinem Beispiel werden ja keine Objekteigenschaften angefasst.

Sorry, muss mich korrigieren - du hast ja mit
1
    oObject.ScanAnalogIn 1, 0

einen Zugriff auf eine Objekteigenschaft dargestellt. Sind die denn der 
IntelliSense bekannt?

von thom (Gast)


Lesenswert?

@Exce(l)ntriker

Mal soviel, eine OCX ist eigentlich eine Unterart eines COM Objektes, 
welche aus Kompatibilitätsgründen noch unterstützt wird, wenn man aber 
gezielt für neuere Plattformen entwickelt, sollte man sich den Einsatz 
gut überlegen. Soweit die Teile nun mal vorhanden sind, kann man Sie 
noch benutzen. Deshalb werden die auch noch in VS2008 unterstützt.
Prinzipiell kannst Du deine mit VS2008 (das muß nicht NET sein) 
erstellte OCX auch in VBA verwenden. Einige Dinge sind aber zu beachten:
Variablen / Datenübergaben auf einfache Datentypen beschränken, Long, 
Double, String, Funktionen eindeutig benennen, auf Überladungen 
verzichten (kleinster gemeinsamer Nenner gibt die wenigsten Probleme)
(Außer er ist ein C Guru, dann gilt das nicht)
Nichts komplexes verwenden (nach aussen), da VBA komplexere Daten nicht 
unterstützt, gilt im wesentlichen für alle Script Sprachen bzw. 
Interpreter.
Die Intellisense funktioniert nur bei early bind, also wenn eine OCX 
direkt eingebunden wird. Bei komplett dynamischem erstellen kennt Sie 
die Aufrufe nicht. Zwischenschritt davon kann auch ein einbinden eines 
Verweises sein, dann kann as Object durch as Type ersetzt werden, ist 
dann aber auch nicht wirklich mehr dynamisch (Intellisense erkennt dies 
dann).

Hoffe, dies trägt ein wenig zum Verständniss bei.

von Exce(l)ntriker (Gast)


Lesenswert?

Hallo Thom,

danke für die Erklärung, die ich sehr gelungen finde.

Eine Frage habe ich aber noch, du schreibst ja:

>das muß nicht NET sein

Ok, ich dachte halt es wäre evtl. sinnvoll da Windows ja seit XP(oder?) 
das Framework sowieso mitbringt. Spricht denn was dagegen?

Grüße,
Stefan

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.