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 05.05.2000

Diese Seite wurde zuletzt aktualisiert am 05.05.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...

Eingebautes Steuerelement?

Zurück...


Anzeige

(-hg) mailto:hg_isintrinsiccontrol@aboutvb.de

Wie kann man eigentlich die in Visual Basic "eingebauten" Steuerelemente (so genannte "Intrinsic Controls") von externen Steuerelementen (OCXe) oder von per UserControl-Modul selbst erstellten Steuerelementen unterscheiden? Die Frage scheint sich auf den ersten Blick nicht so einfach beantworten zu lassen. Aber wie Sie sich denken können, würde ich nie eine solche Frage stellen, wenn ich nicht auch mit der Antwort darauf aufwarten könnte.

Im Prinzip können Sie bei einem gegebenen Steuerelement mit MSDN Library - VB If...Then...ElseTypeOf eine Typprüfung vornehmen - also einfach alle in VB eingebauten Objekt-Typen durchchecken:

If TypeOf IrgendeinControl Is CommandButton Then
  ...ist eingebaut
ElseIf TypeOf IrgendeinControl Is TextBox Then
  ...ist eingebaut
ElseIf ... usw.
Else
  ...ist NICHT eingebaut
End If

Oder Sie verknüpfen anstelle der ElseIf-Konstruktionen die einzelnen Typprüfungen mit Or. Bis einschließlich Visual Basic 5 ist dies wohl auch der einzige gangbare Weg.

Ab Visual Basic 6 gibt es jedoch das MSDN Library - VB VBControlExtenderVBControlExtender-Objekt. Das heißt - eigentlich ist das kein eigenständiges Objekt, sondern lediglich die Definition einer Schnittstelle, über die alle Steuerelemente verfügen, die per Controls.Add dynamisch der Controls-Collection eines Container-Objekts wie Form oder UserControl hinzugefügt wurden. Und das gilt auch nur dann, wenn es sich dabei nicht um eines der VB-eigenen Steuerelemente handelt.

Sie ahnen bereits, worauf das hinausläuft? Genau, ein einfacher Versuch zeigt, dass alle nicht-eingebauten Steuerelemente immer über die VBControlExtender-Schnittstelle verfügen, selbst dann, wenn sie nicht erst zur Laufzeit per Ihrem Code dynamisch geladen worden sind, sondern bereits von Ihnen zur Design-Zeit auf einem Objekt-Container platziert worden sind. Zum einen kann man daraus darauf schließen, dass VB selbst zum Laden nicht-eingebauter Steuerelemente den gleichen, seit VB 6 neuen Mechanismus verwendet, der hinter dem dynamischen Laden steckt.

Zum anderen ergibt sich daraus ein einfaches Verfahren zur Prüfung, ob es sich bei einem Steuerelement entweder um eines der eingebauten handelt, oder ob es sich um ein externes OCX bzw. um ein projektinternes UserControl handelt. So können Sie versuchen, ein Steuerelement einer als VBControlExtender deklarierten Objekt-Variablen zuzuweisen. Ein nicht-eingebautes Steuerelement wird akzeptiert, wohingegen bei einem eingebauten Steuerelement ein Laufzeitfehler ausgelöst wird. Fangen Sie diesen Laufzeitfehler ab, können Sie den gewünschten Schluss über die Natur des betreffenden Steuerelements ziehen - zum Beispiel in einer praktischen Funktion gekapselt:

Public Function IsIntrinsicControl(Ctl As Control) As Boolean
  Dim nVBCtlEx As VBControlExtender
  
  On Error Resume Next
  Set nVBCtlEx = Ctl
  IsIntrinsicControl = CBool(Err.Number)
End Function

Falls Sie aus irgendeinem Grund die in einem Container-Objekt vorhandenen eingebauten bzw. nicht-eingebauten Steuerelemente zählen möchten, übergeben Sie einer der beiden folgenden Funktionen einfach die Controls-Collection dieses Containers:

Public Function CountIntrinsicControls(Ctls As Object) As Integer
  Dim nCtl As Control
  Dim nCtlEx As VBControlExtender
  Dim i As Integer
  
  On Error Resume Next
  For Each nCtl In Ctls
    Set nCtlEx = nCtl
    If Err.Number Then
      Err.Clear
      i = i + 1
    End If
  Next
  CountIntrinsicControls = i
End Function

Public Function CountNonIntrinsicControls(Ctls As Object) As Integer
  Dim nCtl As Control
  Dim nCtlEx As VBControlExtender
  Dim i As Integer
  
  On Error Resume Next
  For Each nCtl In Ctls
    Set nCtlEx = nCtl
    If Err.Number Then
      Err.Clear
    Else
      i = i + 1
    End If
  Next
  CountNonIntrinsicControls = i
End Function

Allerdings mag Sie die tatsächliche Anzahl wohl weniger interessieren, als eher die Antwort auf die Frage, ob sich überhaupt ein eingebautes bzw. ein nicht-eingebautes Steuerelement in einem Container-Objekt befindet. Das Zählverfahren lässt sich dazu abkürzen - bei den folgenden Funktionen gibt jeweils der erste passende Fund True zurück und die Suchschleife wird abgebrochen.

Public Function AnyIntrinsicControls(Ctls As Object) As Boolean
  Dim nCtl As Control
  Dim nCtlEx As VBControlExtender
  
  On Error Resume Next
  For Each nCtl In Ctls
    Set nCtlEx = nCtl
    If Err.Number Then
      AnyIntrinsicControls = True
      Exit Function
    End If
  Next
End Function

Public Function NoIntrinsicControls(Ctls As Object) As Boolean
  Dim nCtl As Control
  Dim nCtlEx As VBControlExtender
  
  On Error Resume Next
  For Each nCtl In Ctls
    Set nCtlEx = nCtl
    If Err.Number Then
      Err.Clear
    Else
      NoIntrinsicControls = True
    End If
  Next
End Function

Modul modIsIntrinsicControl (modIsIntrinsicControl.bas - ca. 1,8 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