Dieser Text informiert über den Aufzählungstyp in VB, insbesondere über einige 'unerwartete' Eigentümlichkeiten. 1. Abkürzungen Public Enum enmFrüchte Apfel Birne Erdbeere Himbeere Kirsche Andere End Enum Dim Frucht as enmFrüchte Im Abschnitt 'Einführung' wird eine kurze Übersicht für Einsteiger gegeben. Fortgeschrittene lesen ab 'DETAILS'. 2. Einführung Explizit ( = ausdrücklich) Qualifizierung: Definition Aufzählung ( = Enumeration): Die Elemente einer Aufzählung sollten eindeutig gegeneinander abgrenzbar sein (d.h. keine 'Mischtypen', Zweifels- oder Sonderfälle einbeziehen). Die Aufzählungs-Liste sollte zudem vollständig sein, d.h. alle möglichen Elemente umfassen. Falls man eine unvollständige Aufzählung definiert, ist es sinnvoll (oder notwendig), zusätzlich eine 'Restkategorie' für die nicht benannten Elemente einzuführen (z.B. Bezeichner 'sonstiges', 'andere'). Beim Bezug auf hierarchische Klassifikationen ist darauf zu achten, dass die Aufzählung innerhalb einer Ebene angesiedelt ist. In der sachlich fehlerhaften Aufzählung <Säugetier, Vogel, Fisch, Delphin, ...> gehört die Bezeichnung 'Delphin' zu einer niedrigeren Ebene. Obwohl üblicherweise Aufzählungen 'nominal' sind, d.h. nur Benennungen umfassen (sachlich zulässige Vergleichs-Operationen: =, <>), können aufgrund der 'intern' numerischen Ausprägung der AKn auch 'ordinale' Aufzählungen ( = Rangreihen) definiert werden (z.B. sehr_klein, klein, mittel, groß, sehr_groß), die dann im Programm die Verwendung aller Vergleichs-Operatoren ( <, <=, =, =>, >, <> ) zulassen (natürlich nur, falls die AKn in der korrekten [ = ansteigenden] Reihenfolge deklariert worden sind). Um eindeutige Bezeichner für AKn zu erhalten, ist es üblich, den Bezeichnern ein Kürzel voranzustellen, aus dem hervorgeht, zu welcher Aufzählung die Konstante gehört. Im obigen Beispiel wird man statt 'Apfel', 'Birne' ... vielleicht 'fru_Apfel', 'fru_Birne' usw. wählen, um die Zugehörigkeit zur Aufzählung 'enmFrüchte' deutlich zu machen. Manchmal wird es nötig sein zu erkennen, ob einer AV eine gültige Bezeichnung zugewiesen worden ist oder nicht. In diesem Fall nennt man die erste AK in der ENUM-Anweisung 'undefiniert' ( d.h. = 0 = AV-Initialwert). Zum Erkennen fehlerhafter Zuweisungen wird oft eine AK 'ungültig' eingefügt, der explizit ein negativer Wert (z.B. -1) zugeordnet ist. Die ENUM-Anweisung darf nicht in einer Sub- oder Function-Prozedur auftreten, sondern nur im Deklarationsteil eines Moduls oder eines Formulars. 3. Details: Innerhalb eines Standard-Exe-Projekts können im Deklarationsteil von Klassenmodulen ENUM-Anweisungen mit dem Schlüsselwort 'Public' deklariert und als Parameter oder Rückgabetyp in Methoden und Eigenschaften verwendet werden. Will man Enumerationen allerdings global in ActiveX-Komponenten verwenden, muss die Deklaration in einem ActiveX-DLL-Projekt erfolgen und zwar am besten in einer öffentlich erstellbaren Klasse, deren Instancing-Eigenschaft = GlobalMultiUse eingestellt ist - mit den Schlüsselwörtern 'Public Enum'. Details zu Aufzählungs-Konstanten (AK):
Details zu Aufzählungs-Variablen (AV):
Man sollte in SELECT .. CASE .. und in IF .. THEN .. Konstruktionen prinzipiell eine ELSE-Bedingung einführen, die angesprungen wird, falls die verzweigende AV einen Wert enthält, dem keine AK entspricht (evt. einen Fehler in der ELSE-Bedingung auslösen). In vielen Fällen wird es zweckmäßig sein, die Zuweisung auf eine AV prinzipiell über eine Funktion vorzunehmen, die zunächst überprüft, ob der Wert des zuzuweisenden Arguments gleich dem Wert einer der AKn ist. 4. Aufzählungs-Typ mit 'Mehrfachauswahl' Die Kombination von solchen AKn in einer AV geschieht durch Verwendung des bitweisen Operators 'OR' bei der Zuweisung: AV = AK1 Or AK2 Or AK6 Die Abfrage, ob eine bestimmte AK in einer AV enthalten ist, erfolgt durch den bitweisen 'AND'-Operator: If AV And AK1 Then ... Bei Zuweisung von -1 werden alle 32 Bits in einer LONG-Variable gesetzt, bei der Zuweisung von 0 alle gelöscht. Des 32.Bit wird gesetzt - wegen der LONG-Skalierung - durch Zuweisung von -2^31 ( = -2147483648). Man darf sích dabei nicht davon irritieren lassen, wenn die IDE bei diesem Wert im Code automatisch die DOUBLE-Kennung (#) an die Zahl anhängt. Ein bekanntes Beispiel für Mehrfachauswahl-ATn enthält das CommonDialog-Steuerelement (Komponente: 'Microsoft Common Dialog Control 6.0'). Die 'Flags'-Eigenschaft dieses Controls kann durch eine Kombination von AKn belegt werden. Weil der erforderliche AT dialogspezifisch ist, kann die IDE die AKn bei der Zuweisung zur Flags-Eigenschaft nicht anzeigen. Will man die automatische Auflistung sehen, muss man die jeweils für den Dialog benötigte AV deklarieren und sie - nach der Belegung mit der gewünschten AKn-Kombination - der 'Flags'-Eigenschaft zuweisen: Dim AV_FOS As MSComDlg.FileOpenConstants Dim AV_COC As MSComDlg.ColorConstants Dim AV_FOC As MSComDlg.FontsConstants Dim AV_HEC As MSComDlg.HelpConstants Dim AV_PRC As MSComDlg.PrinterConstants Dim AV_PROC As MSComDlg.PrinterOrientationConstants 5. Ergänzende Hinweise: Die folgende ENUM-Deklaration ist zulässig: Public Enum enmTest [@] = 1000 ' Sonderzeichen --> Klammern notwendig [*******] ' =1001 (Wert wird automatisch hochgesetzt) [#####] ' =1002 [sowas aber auch] ' =1003 Leerzeichen --> Klammern notwendig [2005] = 2005 ' Bezeichnung beginnt mit einer Ziffer --> Klammern notwendig xxx = [@] ' =1000 / Doublette !! [Int] = vbInteger ' =2 (Klammern sind notwendig, weil 'INT' sonst als Schlüsselwort betrachtet wird) [ ] = -1 ' einfaches Leerzeichen --> Klammern notwendig [] = -2 ' die beiden Klammern funktionieren als Enum-Konstante End Enum Nach dieser Deklaration ist die folgende Zuweisung auf eine Variable des Typs 'enmTest' oder auf eine beliebige LONG-Variable möglich: Dim y As Long y = [sowas aber auch] If y = [sowas aber auch] Then MsgBox "sowas aber auch" End If y = [Int] If y <> 2 Then MsgBox "Y <> 2 !" End If y = [ ] If y <> - 1 then MsgBox "Y <> -1 !" End If Auch bei der vollständigen Qualifizierung einer AK müssen die eckigen Klammern geschrieben werden (z.B. a = enmTest.[sowas aber auch] ), sonst meldet die IDE evt. ein ungültiges Zeichen. Die VB-IDE schreibt die eckigen Klammern bei Wert-Zuweisungen, die durch einen Maus-Click auf die 'Mitglieder-Auflistung' in den Code eingefügt werden, nur, wenn sie syntaktisch notwendig sind. (Das funktioniert aber nicht, wenn die Konstante wie eine VB-Funktion benannt ist - vgl. Beispiel). Die eckigen Klammern werden in der IDE-Auflistung der AKn eines AT nicht angezeigt, bei der direkten Eingabe in den Code aber ggf. von der IDE ergänzt (erforderliche Editor-Option: 'Mitglieder automatisch auflisten'). Durch die Verwendung eckiger Klammern ist es möglich, in Aufzählungen auch E-Mail-Adressen, komplexe (z.B. gruppierte) Bestellnummern, Typenbezeichnungen, Währungskennzeichen u.v.a. in korrekter Schreibweise einschließlich Sonderzeichen als Aufzählungs-Konstanten zu deklarieren. Das kann zu einem besser lesbaren Quellcode beitragen. VB6 akzeptiert solche Bezeichner bis zu einer Länge von 255 Zeichen. Die Verwendung von Enumerations-Konstanten scheint - im Vergleich zur direkten Verwendung von LONG-Variablen - die Programm-Ausführung nicht zu verlangsamen. Beliebig wählbar sind die Zeichenfolgen auch in eckigen Klammern allerdings nicht. Die Bezeichnung [local] wird akzeptiert, [global] löst einen Fehler aus. Viele VB-Schlüsselwörter sind ausgeschlossen - aber z.B. die VB-Funktionsbezeichner und die VB-Operatoren nicht. Zugelassen als Bezeichner für AKn sind z.b. [sin], [round], [/]. Die Groß-/Kleinschreibung in Bezeichnern wird von der IDE - wie auch sonst gewohnt - automatisch vereinheitlicht. Falls eine AK durch eine gleichnamige lokale Variable überschrieben worden ist, nützt es nichts, wenn man den Namen der AK in eckige Klammern setzt. Der VB-Compiler akzeptiert dies zwar, der Bezeichner bezieht sich aber immer noch auf die lokale Variable! 6. Fazit: 7. Vorschlag mit Beispiel Die Klasse 'clsGröße' kapselt die ordinale Aufzählung 'enmGröße' (winzig --> riesig). Die Eigenschaft 'Fehler_Auslösen' bestimmt, ob bei einer ungültigen Zuweisung ein Fehler ausgelöst wird - sonst wird nur der Wert 'ungültig' gesetzt. Die Eigenschaft 'Größe' weist kontrolliert einen Aufzählungs-Wert zu bzw. fragt ihn ab. Die Eigenschaft 'Größe_CM' demonstriert, wie man durch eine Eigenschaft metrische Werte (im Beispiel: Größen-Angabe in Zentimetern) in eine ordinale Aufzählung transformieren kann. Die AV werden in diesem Fall als Instanzen der Klasse deklariert. ' ============================================================ ' Start Quellcode Klasse 'clsGröße' ' Kapselung einer Aufzählung für kontrollierte Zuweisungen ' zu 'Aufzählungs-Variablen' = Instanzen der Klasse 'clsGröße' ' ============================================================ Option Explicit ' Die Werte der Aufzählungs-Konstanten werden ab -1 hochgezählt Public Enum enmGröße ungültig = -1 unbekannt ' = 0 = Initialwert [winzig] ' =1 [sehr klein] klein mittel groß [sehr groß] [riesig] ' =7 End Enum ' Skalierungs-Obergrenzen ' belegt bei Initialisierung der Instanz Dim gSkalierung() As Variant ' gespeicherte Aufzählungs-Konstante Dim gGröße As enmGröße ' Fehler bei ungültiger Zuweisung auslösen? Dim gError As Boolean Private Sub Class_Initialize() ' Obergrenzen bei der Skalierung von Zentimeterangaben ' zu Aufzählungskonstanten ' für Eigenschaft 'Größe_CM' ' winzig ---> 120 < x <= 140 ' .... ... < x <= ... ' riesig ---> 200 < x <= 220 gSkalierung = Array(120, 140, 150, 165, 180, 190, 200, 220) End Sub Public Property Let Fehler_Auslösen(f_a As Boolean) ' Fehler bei ungültiger Zuweisung auslösen? gError = f_a End Property Public Property Let Größe(g As enmGröße) ' kontrollierte Zuweisung ' einer Aufzählungs-Konstanten If g < 0 Or g > [riesig] Then ' Zuweisung ausserhalb des gültigen Bereichs gGröße = ungültig If gError Then Err.Raise 6 'Überlauf Else gGröße = g End If End Property Public Property Get Größe() As enmGröße ' Abfrage der aktuell zugewiesenen ' Aufzählungs-Konstante Größe = gGröße End Property Public Property Let Größe_CM(g As Double) ' Skalierung einer metrischen Zuweisung (in Zentimeter) ' auf zulässige Werte der 'ordinalen' Aufzählung 'Größe' Dim i As Long ' Loop ' Gültiger (=skalierbarer) Zentimeter-Wert in 'g' ? If g <= gSkalierung(0) Or _ g > gSkalierung(UBound(gSkalierung)) Then gGröße = ungültig If gError Then Err.Raise 6 ' Überlauf Exit Property End If ' Skalierung durchführen For i = 1 To UBound(gSkalierung) If g <= gSkalierung(i) Then gGröße = i: Exit For Next i End Property ' ============================================================ ' Ende Quellcode Klasse 'clsGröße' ' ============================================================ Dieser Tipp wurde bereits 42.377 mal aufgerufen.
Anzeige
![]() ![]() ![]() Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
Neu! sevDTA 3.0 Pro ![]() SEPA mit Kontonummernprüfung Erstellen von SEPA-Dateien mit integriertem BIC-Verzeichnis und Konto- nummern-Prüfverfahren, so dass ungültige Bankdaten bereits im Vorfeld ermittelt werden können. Tipp des Monats ![]() Dieter Otter sevTabStrip: Rechtsklick auf Reiter erkennen Eine Funktion, mit der sich prüfen lässt, auf welchen Tab-Reiter ein Mausklick erfolgte TOP Entwickler-Paket ![]() TOP-Preis!! Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1866.50 EUR... |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |