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.07.2000

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

Namentliche Bekanntschaften

Zurück...


Anzeige

(-hg) mailto:hg_formbyname@aboutvb.de

Forms haben zwar eine Name-Eigenschaft. Doch da diese zur Laufzeit schreibgeschützt ist, können Sie damit in Ihrem Code nicht mehr anfangen, als diese auszulesen. Immerhin können Sie so ein bestimmtes Form aus der Forms-Collection herausfischen, falls Sie den Namen als String vorliegen haben und eine Referenz fehlt, um mit dem Is-Operator vergleichen zu können:

Dim nForm As Form

For Each nForm In Forms
  If nForm.Name = GesuchterName Then
    Exit For
  End If
Next

Setzen Sie die Einstellung "Option Compare Text" zum Stringvergleich ohne Berücksichtigung der Groß-/Kleinschreibung, können Sie zum Vergleich den Like-Operator verwenden. Damit nicht auch andere Like-Vergleiche im gleichen Modul unter Umständen unbeabsichtigterweise diese Einstellung verwenden, lagern Sie die Suchschleife in eine Funktion eines eigenen Standard-Moduls aus:

Option Compare Text

Public Funktion FindForm(Name As String) As Form
  Dim nForm As Form

  For Each nForm In Forms
    If nForm.Name Like GesuchterName Then
      Set FindForm = nForm
      Exit For
    End If
  Next
End Function

Ein Problem ist hierbei allerdings, dass Sie so nur die erste Instanz finden, falls von einem Form mehrere Instanzen (etwa eines MDI-Child-Forms) geladen sein sollten. Sie sollten die Forms-Collection also auch im Rückwärtsgang durchsuchen. Dies ermöglicht die Funktion FormByName.

Option Compare Text

Public Enum OccuranceConstants
  occAny
  occFirst
  occLast
End Enum

Public Function FormByName(Name As String, _
 Optional ByVal Occurance As OccuranceConstants) As Form

  Dim i As Integer
  
  Select Case Occurance
    Case occFirst
      For i = 0 To Forms.Count - 1
        If Forms(i).Name Like Name Then
          Set FormByName = Forms(i)
          Exit Function
        End If
      Next
    Case occLast
      For i = Forms.Count - 1 To 0 Step -1
        If Forms(i).Name Like Name Then
          Set FormByName = Forms(i)
          Exit Function
        End If
      Next
  End Select
End Function

Falls Sie noch nicht gewusst haben sollten, dass Sie ein Form auch durch Hinzufügen zur Forms-Collection unter Angabe des Form-Names laden können, dann wissen Sie es jetzt -zum Beispiel:

Forms.Add "Form1"

Aber auch hier gilt, dass die Forms-Collection sich nicht für mehrere Instanzen interessiert. Sollte die Forms.Collection bereits ein Form1 enthalten, würde so eine zweite Instanz geladen. Die Funktion LoadFormByName erlaubt Ihnen nun, ein Form per Namen entweder ausdrücklich nur dann zu laden, wenn noch keine Instanz existieren sollte, oder in jedem Fall eine neue Instanz zu laden.

Public Enum LoadConstants
  loadIfNotExists
  loadNewInstance
End Enum

Public Function LoadFormByName(Name As String, _
 Optional ByVal LoadMode As LoadConstants) As Form

  Dim nForm As Form
  
  Select Case LoadMode
    Case loadIfNotExists
      For Each nForm In Forms
        If nForm.Name Like Name Then
          Exit Function
        End If
      Next
      Forms.Add Name
      Set LoadFormByName = Forms(Forms.Count - 1)
    Case loadNewInstance
      Forms.Add Name
      Set LoadFormByName = Forms(Forms.Count - 1)
  End Select
End Function

Der Rückwärtsgang, nämlich das Entladen von Forms, lässt sich über Form-Namen ebenfalls spezifischer gestalten. So können Sie etwa alle Instanzen eines Forms, die ja alle den gleichen Namen haben, heraus sieben und entladen. Auch hier können Sie gegebenenfalls nur die erste oder die letzte Instanz entladen, oder eben alle Instanzen.

Public Sub UnloadByName(Name As String, _
 Optional ByVal Occurance As OccuranceConstants)

  Dim nForm As Form
  Dim i As Integer
  
  Select Case Occurance
    Case occAny
      For Each nForm In Forms
        If nForm.Name Like Name Then
          Unload nForm
        End If
      Next
    Case occFirst
      For i = 0 To Forms.Count - 1
        If Forms(i).Name Like Name Then
          Unload Forms(i)
          Exit Function
        End If
      Next
    Case occLast
      For i = Forms.Count - 1 To 0 Step -1
        If Forms(i).Name Like Name Then
          Unload Forms(i)
          Exit Function
        End If
      Next
  End Select
End Sub

In Anbetracht der Mehrfachinstanzierungen von Forms stellt sich natürlich die Frage, wie man die einzelnen Instanzen auf Namens-Ebene unterscheiden könnte. Auf Objekt-Ebene ist das kein ja Problem - die Referenzen von zwei verschiedenen Instanzen unterscheiden sich und können mit dem Is-Operator verglichen werden:

If meineForm1 Is meineForm2 Then ...

Zur Unterscheidung anhand eines Strings könnten Sie der Tag-Eigenschaft jeder einzelnen Instanz einen unterschiedlichen Namen zuweisen. Doch falls Sie die Tag-Eigenschaft einmal für andere Zwecke benötigen, geht das nicht. Sie könnte Ihre Form-Module auch mit einer eigenen Eigenschaft nachrüsten, etwa einer Eigenschaft InstanzName:

Public InstanceName As String

Falls Sie allerdings in der heutigen Zeit der Kommunikation von Anwendungen untereinander auf ActiveX/COM setzen und die "steinzeitliche" DDE-Technik vielleicht schon gar nicht mehr kennen, steht eine dann unbenutzte Eigenschaft eines Forms zur Verfügung, die LinkTopic-Eigenschaft. Diese enthält nach dem ersten Anlegen eines Forms auch den Form-Namen. Danach sind die beiden Eigenschaften jedoch völlig unabhängig voneinander. Die LinkTopic-Eigenschaft können Sie beliebig ändern und somit für jede Instanz eines Forms individuell belegen.

Verwenden Sie nun die LinkTopic-Eigenschaft in den drei vorangegangenen Funktionen, sehen diese wie folgt aus:

Public Function FormByLinkName(LinkName As String, _
 Optional ByVal Occurance As OccuranceConstants, _
 Optional ByVal NewName As String) As Form

  Dim i As Integer
  
  Select Case Occurance
    Case occFirst
      For i = 0 To Forms.Count - 1
        If Forms(i).LinkTopic Like LinkName Then
          Set FormByLinkName = Forms(i)
          Exit Function
        End If
      Next
    Case occLast
      For i = Forms.Count - 1 To 0 Step -1
        If Forms(i).LinkTopic Like LinkName Then
          Set FormByLinkName = Forms(i)
          Exit Function
        End If
      Next
  End Select
End Function

Public Function LoadFormByLinkName(LinkName As String, _
 Optional ByVal LoadMode As LoadConstants, _
 Optional ByVal NewName As String) As Form

  Dim nForm As Form
  
  Select Case LoadMode
    Case loadIfNotExists
      For Each nForm In Forms
        If nForm.LinkTopic Like LinkName Then
          Exit Function
        End If
      Next
      Forms.Add NewName
      Set nForm = Forms(Forms.Count - 1)
      nForm.LinkTopic = LinkName
      Set LoadFormByLinkName = nForm
    Case loadNewInstance
      Forms.Add NewName
      nForm = Forms(Forms.Count - 1)
      nForm.LinkTopic = LinkName
      Set LoadFormByLinkName = nForm
  End Select
End Function

Public Sub UnloadByLinkName(LinkName As String, _
 Optional ByVal Occurance As OccuranceConstants)

  Dim nForm As Form
  Dim i As Integer
  
  Select Case Occurance
    Case occAny
      For Each nForm In Forms
        If nForm.LinkTopic Like LinkName Then
          Unload nForm
        End If
      Next
    Case occFirst
      For i = 0 To Forms.Count - 1
        If Forms(i).linktopis Like LinkName Then
          Unload Forms(i)
          Exit Sub
        End If
      Next 'i
    Case occLast
      For i = Forms.Count - 1 To 0 Step -1
        If Forms(i).linktopis Like LinkName Then
          Unload Forms(i)
          Exit Sub
        End If
      Next 'i
  End Select
End Sub

Sollten Sie einmal eine Collection aller Instanzen eines Forms benötigen, können Sie diese so zusammenstellen:

Public Function FormsCollectionByName(Name As String) _
 As Collection

  Dim nForms As Collection
  Dim nForm As Form
  
  Set nForms = New Collection
  For Each nForm In Forms
    If nForm.Name Like Name Then
      nForms.Add nForm
    End If
  Next
  Set FormsCollectionByName = nForms
End Function

Eine Collection der Forms, denen Sie den gleichen Namen in der LinkTopic-Eigenschaft gegeben haben, erhalten Sie auf ähnliche Weise:

Public Function FormsCollectionByLinkName(LinkName As String) _
 As Collection

  Dim nForms As Collection
  Dim nForm As Form
  
  Set nForms = New Collection
  For Each nForm In Forms
    If nForm.Name Like LinkName Then
      nForms.Add nForm
    End If
  Next
  Set FormsCollectionByLinkName = nForms
End Function

Jetzt kommen Sie aber bloß nicht auf die Idee, völlig verschiedenen Forms einen gleichen Namen der LinkTopic-Eigenschaft zuzuweisen - oder könnte es gar doch sinnvoll sein, auf diese Weise verschiedene, separat identifizierbare Forms-Gruppen innerhalb einer Anwendung anzulegen...?


Modul modFormByName (modFormByName.bas - ca. 5,4 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