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 11.04.2001

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

Zählen und Sammeln

Zurück...


Anzeige

(-hg) mailto:hg_forms@aboutvb.de

Wussten Sie, dass DoEvents tatsächlich keine Anweisung ist, sondern eine Funktion? Sie gibt die Anzahl der gerade sichtbaren Forms einer Anwendung zurück. Die Betonung liegt hier auf "sichtbar", im Gegensatz zu Anzahl der geladenen Forms, die von Forms.Count geliefert wird.

Eine eingängige Hilfsfunktion (damit Sie sich nicht an die DoEvents-Funktion für diesen Fall zu erinnern brauchen), die die Anzahl der sichtbaren Forms zurückgibt, könnte also lauten:

Public Function VisibleFormsCount() As Integer
  VisibleFormsCount = DoEvents
End Function

Allerdings ist die Verwendung von DoEvents mit Vorsicht zu genießen - der ursprüngliche Zweck von DoEvents wird dabei trotzdem ausgeführt, nämlich die zwischenzeitliche Ausführung anderer anstehender Ereignisse oder von anderem Code zu ermöglichen. Wenn Sie diese Funktion unbedacht aufrufen, kann das somit unvorhersehbare und unerwünschte Seiteneffekte haben.

Besser ist also doch noch der "klassische" Weg. Sie prüfen bei jedem einzelnen geladenen und damit in der Forms-Collection enthaltenen Form, ob es sichtbar ist, und zählen einfach mit:

Public Function VisibleFormsCountSafe() As Integer
  Dim nForm As Form
  Dim nCount As Integer
  
  For Each nForm In Forms
    If nForm.Visible Then
      nCount = nCount + 1
    End If
  Next
  VisibleFormsCountSafe = nCount
End Function

Wenn Sie sich nicht mit der bloßen Anzahl zufrieden geben wollen, sondern gleich eine Collection der sichtbaren Forms zur Verfügung haben wollen, sammeln Sie diese gleich in einer Collection, statt nur zu zählen:

Public Function VisibleForms() As Collection
  Dim nForm As Form
  Dim nVisibleForms As Collection
  
  Set nVisibleForms = New Collection
  With nVisibleForms
    For Each nForm In Forms
      If nForm.Visible Then
        .Add nForm
      End If
    Next
  End With
  Set VisibleForms = nVisibleForms
End Function

Da wir nun schon einmal beim Zählen und Sammeln sind, lassen wir noch ein paar weitere nützliche Funktionen dieser Gattung folgen. So etwa das Zählen oder Sammeln von geladenen Instanzen ein und derselben Form-Klasse. Sie können entweder eine gerade greifbare Instanz eines Forms als Parameter übergeben, oder den Namen, der für alle Instanzen in der Forms-Collection gleich lautet. Damit die Groß-/Kleinschreibung keine Probleme bereitet, oder damit Sie auch mittels eines Suchmusters Forms mit verwandten Namen ausfindig machen können, wird der Namensvergleich über den Operator Like durchgeführt. Um damit einen von Schreibweise unabhängigen Vergleich vorzunehmen, muss in dem Modul die Direktive "Option Compare Text" gesetzt sein.

Option Compare Text

Public Function FormInstancesCount(Form As Variant) _
 As Integer

  Dim nFormName As String
  Dim nForm As Form
  Dim nCount As Integer
  
  If IsObject(Form) Then
    If TypeOf Form Is Form Then
      nFormName = Form.Name
    End If
  ElseIf VarType(Form) = vbString Then
    nFormName = Form
  End If
  If Len(nFormName) Then
    For Each nForm In Forms
      If nForm.Name Like nFormName Then
        nCount = nCount + 1
      End If
    Next
  End If
  FormInstancesCount = nCount
End Function

Public Function FormInstances(Form As Variant) _
 As Collection

  Dim nFormName As String
  Dim nForm As Form
  Dim nFormInstances As Collection
  
  Set nFormInstances = New Collection
  If IsObject(Form) Then
    If TypeOf Form Is Form Then
      nFormName = Form.Name
    End If
  ElseIf VarType(Form) = vbString Then
    nFormName = Form
  End If
  If Len(nFormName) Then
    With nFormInstances
      For Each nForm In Forms
        If nForm.Name Like nFormName Then
          .Add nForm
        End If
      Next
    End With
  End If
  Set FormInstances = nFormInstances
End Function

Nun folgen noch ein paar ähnliche Funktionen zum Umgang mit MDI-Child-Forms. Um diese aus der Forms-Collection herauszufiltern, ist eine doppelte Prüfung notwendig. Zum einen wird geprüft, ob bei einem Form die MDIChild-Eigenschaft auf True gesetzt ist. Da aber auch das MDI-Hauptform in der Forms-Collection enthalten ist, muss zuvor der Typ des gerade zu prüfenden Forms untersucht werden. Denn der Versuch, beim MDI-Form eine MDIChild-Eigenschaft abzufragen, würde in einem Laufzeitfehler enden.

Public Function MDIChildFormsCount() As Integer
  Dim nForm As Form
  Dim nCount As Integer
  
  For Each nForm In Forms
    If Not TypeOf nForm Is MDIForm Then
      If nForm.MDIChild Then
        nCount = nCount + 1
      End If
    End If
  Next
  MDIChildFormsCount = nCount
End Function

Public Function MDIChildForms() As Collection
  Dim nForm As Form
  Dim nMDIChildForms As Collection
  
  Set nMDIChildForms = New Collection
  With nMDIChildForms
    For Each nForm In Forms
      If Not TypeOf nForm Is MDIForm Then
        If nForm.MDIChild Then
          .Add nForm
        End If
      End If
    Next
  End With
  Set MDIChildForms = nMDIChildForms
End Function

Public Function MDIChildFormInstancesCount _
 (Form As Variant) As Integer

  Dim nFormName As String
  Dim nForm As Form
  Dim nCount As Integer
  
  If IsObject(Form) Then
    If TypeOf Form Is Form Then
      nFormName = Form.Name
    End If
  ElseIf VarType(Form) = vbString Then
    nFormName = Form
  End If
  If Len(nFormName) Then
    For Each nForm In Forms
      If Not TypeOf nForm Is MDIForm Then
        If nForm.MDIChild Then
          If nForm.Name Like nFormName Then
            nCount = nCount + 1
          End If
        End If
      End If
    Next
  End If
  Set MDIChildFormInstancesCount = nCount
End Function

Public Function MDIChildFormInstances(Form As Variant) _
 As Collection

  Dim nFormName As String
  Dim nForm As Form
  Dim nMDIChildFormInstances As Collection
  
  Set nMDIChildFormInstances = New Collection
  If IsObject(Form) Then
    If TypeOf Form Is Form Then
      nFormName = Form.Name
    End If
  ElseIf VarType(Form) = vbString Then
    nFormName = Form
  End If
  If Len(nFormName) Then
    With nMDIChildFormInstances
      For Each nForm In Forms
        If Not TypeOf nForm Is MDIForm Then
          If nForm.MDIChild Then
            If nForm.Name Like FormName Then
              .Add nForm
            End If
          End If
        End If
      Next
    End With
  End If
  Set MDIChildFormInstances = nMDIChildFormInstances
End Function

Modul modForms (modForms.bas - ca. 4,6 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