ABOUT Visual Basic Programmieren Programmierung Download Downloads Tips & Tricks Tipps & Tricks Know-How Praxis VB VBA Visual Basic for Applications VBS VBScript Scripting Windows ActiveX COM OLE API ComputerPC Microsoft Office Microsoft Office 97 Office 2000 Access Word Winword Excel Outlook Addins ASP Active Server Pages COMAddIns ActiveX-Controls OCX UserControl UserDocument Komponenten DLL EXE
Diese Seite wurde zuletzt aktualisiert am 21.11.2000

Diese Seite wurde zuletzt aktualisiert am 21.11.2000
Aktuell im ABOUT Visual Basic-MagazinGrundlagenwissen und TechnologienKnow How, Tipps und Tricks rund um Visual BasicActiveX-Komponenten, Controls, Klassen und mehr...AddIns für die Visual Basic-IDE und die VBA-IDEVBA-Programmierung in MS-Office und anderen AnwendungenScripting-Praxis für den Windows Scripting Host und das Scripting-ControlTools, Komponenten und Dienstleistungen des MarktesRessourcen für Programmierer (Bücher, Job-Börse)Dies&Das...

Themen und Stichwörter im ABOUT Visual Basic-Magazin
Code, Beispiele, Komponenten, Tools im Überblick, Shareware, Freeware
Ihre Service-Seite, Termine, Job-Börse
Melden Sie sich an, um in den vollen Genuss des ABOUT Visual Basic-Magazins zu kommen!
Informationen zum ABOUT Visual Basic-Magazin, Kontakt und Impressum

Zurück...

Misstrauensanträge

Zurück...


Anzeige

(-hg) mailto:hg_componenttest@aboutvb.de

Den Fall, dass sich eine von einer Anwendung benötigte ActiveX-DLL oder -EXE nicht auf einem System befinden oder nicht ordnungsgemäß registriert sein sollte, können Sie mit einer einfachen Fehlerprüfung in den Griff bekommen:

Dim nMyClass As MyClass

On Error Resume Next
Set nMyClass = New MyClass
If Err.Number = 429 Then
  ' Objekt nicht gefunden
End If
On Error GoTo 0

Doch statt sich darauf zu verlassen, dass Sie schon irgendwo im Code Ihrer Anwendung eine solche Prüfung vornehmen werden, können Sie bereits beim Programmstart eine solche Prüfung für alle Fälle vornehmen.

Ebenso sollten Sie externe Steuerelemente auf ihre tatsächliche Existenz und Verfügbarkeit hin prüfen. Diese Prüfung ist etwas komplizierter. Denn beim Laden eines Forms, wenn Visual Basic ein Steuerelement zu laden versucht, wird keinerlei Code ausgeführt, in den Sie eine eigene Fehlerprüfung einbauen könnten. Sie müssen daher den Ladevorgang gezielt per Code provozieren, um eine gegebenenfalls abfangbare Reaktion zu erhalten.

In Visual Basic 5 können Sie dazu vor dem Laden und Anzeigen eines Forms in einer selbstdefinierten Methode dieses Forms versuchen, auf eine Eigenschaft oder auf eine Methode eines auf dem Form platzierten Steuerelements zuzugreifen. Den hierbei ausgelösten Fehler (339), falls das Steuerelement nicht verfügbar sein sollte, können Sie abfangen und auswerten. Visual Basic lädt zwar dazu das Form, aber da Sie eine Fehlerbehandlung eingeschaltet haben, bleibt das unter Ihrer Kontrolle. Um ein Form so testen zu können, kann es nicht das Hauptform sein, das beim Anwendungsstart automatisch geladen wird. Sie sollten das Form aus einer Sub Main-Prozedur heraus starten, nachdem Sie den Test durchgeführt haben.

Public Function TestControl() As Boolean
  Dim nTest As String

  On Error Resume Next
  nTest = MyControl.Tag
  If Err.Number = 339 Then
    ' Steuerelement nicht verfügbar
    ' ggfs. Unload Me
  Else
    TestControl = True
  End If
End Sub

Unter Visual Basic 6 bietet sich eine allgemeinere Lösung an. Während Sie Objekte aus ActiveX-DLLs oder -EXEs schon immer dynamisch per CreateObject und Angabe der ProgId laden und instanzieren konnten, geht das ähnlich erst ab Visual Basic 6 auch bei Steuerelementen. So können Sie ein eigenständiges Test-Form anlegen und über Methoden dieses Forms die notwendigen Tests durchführen. Dieses Form braucht ansonsten keine weitere Funktion in der Anwendung zu haben - es ist klein und unscheinbar genug.

Der Methode TestForCtl übergeben Sie die ProgId des zu testenden externen Steuerelements (die Verfügbarkeit in VB eingebauter Steuerelemente brauchen Sie ja nie zu prüfen). Konnte das Steuerelement erfolgreich geladen werden, gibt die Methode True zurück. Wenn Sie mehrere Steuerelemente hintereinander testen möchten, können Sie das sofortige Entladen des Forms unterdrücken, indem Sie im optionalen Parameter UnloadNow False übergeben (Voreinstellung ist True). Allerdings sollten Sie diesen Test nicht mit Steuerelementen veranstalten, die wider jede Vernunft gleich beim ersten Initialisieren umfangreichere Operationen durchführen - etwa eine Datenbank laden, oder gar eine Verbindung zum Internet herstellen (mit so etwas sollte ein Steuerelement erst nach ausdrücklichem Aufruf einer Methode loslegen).

Public Function TestForCtl(ProgId As String, _
 Optional ByVal UnloadNow As Boolean = True) As Boolean

  Dim nCtl As Control
  
  On Error Resume Next
  Set nCtl = Controls.Add(ProgId, "test")
  TestForCtl = CBool(Err.Number = 0)
  If UnloadNow Then
    Unload Me
  End If
End Function

Die zweite Methode des Testforms, TestForDLL, arbeitet ähnlich. Sie übergeben ihr ebenfalls die ProgId der Komponente und erhalten True zurück, wenn die Komponente erfolgreich geladen werden konnte. Die Kontrolle des Entladens des Forms entfällt hier, da das Form bei diesem Aufruf gar nicht erst geladen wird, sondern sich einfach wie eine simple Klasse verhält. Auch für Komponenten gilt, dass sie sich bei der Initialisierung zahm und unauffällig verhalten sollten (Bei Komponenten, die dem zuwider handeln, sollten Sie generell deren Einsatz überdenken - womöglich bergen sie noch mehr solche undurchdachten Schwachpunkte. Sollten Sie jedoch selbst der Autor einer solchen Komponente sein - nun, was soll ich Ihnen noch erzählen...?).

Public Function TestForDLL(ProgId As String) As Boolean
  Dim nObj As Object
  
  On Error Resume Next
  Set nObj = CreateObject(ProgId)
  TestForDLL = CBool(Err.Number <> 429)
End Function

Hier noch ein Beispiel für einen Start-Test, den Sie mit dem herunterladbaren Beispiel-Projekt ausprobieren können. Starten Sie einfach avbComponentTest.exe im Test-Verzeichnis und sie werden entsprechende Fehlermeldungen erhalten, da die beiden benötigten Komponenten zunächst noch nicht registriert sind. Registrieren Sie erst eine und dann die andere der beiden Komponenten und starten Sie die Test-EXE einmal zwischendurch. Erst wenn beide Komponenten registriert sind, wird das Hauptform der Test-Anwendung tatsächlich geöffnet, anderenfalls wird die Anwendung beendet.

Public Sub Main()
  Dim nTestAll As Boolean
  Dim nTest As Boolean
  
  With frmTestComponents
    nTest = .TestForDLL("avbComponentTestDLL.Class1")
    If Not nTest Then
      MsgBox "avbComponentTestDLL.Class1 nicht gefunden"
    End If
    nTestAll = nTest
    nTest = .TestForCtl("avbComponentTestOCX.UserControl1")
    If Not nTest Then
      MsgBox "avbComponentTestOCX.UserControl1 nicht gefunden"
    End If
    nTestAll = nTestAll And nTest
  End With
  If nTestAll Then
    frmTest.Show
  Else
    MsgBox "Anwendung wird nicht gestartet"
  End If
End Sub

Beispiel-Projekt avbComponentTest (componenttest.zip - ca. 16,5 KB)


Artikel
Zum Download-Bereich dieses Artikel
Mail an den Autor dieses Artikels

KnowHow
Zur KnowHow-Übersicht

KnowHow-Themen
Themen - Allgemeines
Themen - Entwicklungsumgebung (VB-IDE)
Themen - Forms
Themen - Steuerelemente (Controls)
Themen - Grafik
Themen - Dateien
Themen - UserControls
Themen - Einsteiger-Tipps
Themen - Wussten Sie...?

Übersicht nach Titeln in alphabetischer Reihenfolge
Übersicht nach Erscheinungsdatum

Schnellsuche



Zum Seitenanfang

Copyright © 1999 - 2017 Harald M. Genauck, ip-pro gmbh  /  Impressum

Zum Seitenanfang

Zurück...

Zurück...

Download Internet Explorer