ENUM und deren Werte

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    ENUM und deren Werte

    Moin!

    bei uns wird sehr viel mit Werten gearbeitet und deshalb habe ich für einzelne ENMU's angelegt in einer gesonderten DLL um diese auch vielseitig nutzen zu können.

    Hier die Definition:

    VB.NET-Quellcode

    1. Public Class Systemvariablen
    2. '------ http://ms-wiki-1/eblwiki/index.php?title=Systemvariablen_(Klasse_von_EBL.Parameter) ------
    3. ''' <summary>
    4. ''' welche FeatureClass ist anzulegen
    5. ''' </summary>
    6. Public Enum OSMODE As Integer
    7. Keiner = 0
    8. Ende = 1 'END geht nicht wegen VB.net
    9. Mittel = 2
    10. Zentrum = 4
    11. Punkt = 8
    12. Quadrant = 16
    13. Schnitt = 32
    14. Basis = 64
    15. Lot = 128
    16. Tangente = 256
    17. Nächster = 512
    18. Löscht_Alle = 1024
    19. Schnitt_angenommen = 2048
    20. Hilfslinie = 4096
    21. Parallel = 8192
    22. ' Kombinationen
    23. ZenEndSchnitt = 16421
    24. End Enum
    25. End Class


    Nun greife ich in einer anderen DLL darauf zu:

    VB.NET-Quellcode

    1. Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("OSMODE", EBL.Global.Systemvariablen.OSMODE.Nächster)


    und bekomme folgende Meldung:


    ************** Ausnahmetext **************
    System.ArgumentException: Der Wert liegt außerhalb des erwarteten Bereichs.
    bei Autodesk.AutoCAD.DatabaseServices.ResultBuffer.ObjectToResbuf(Object o, resbuf** rb)
    bei Autodesk.AutoCAD.Runtime.Marshaler.ObjectToResbuf(Object o, IntPtr rb)
    bei Autodesk.AutoCAD.ApplicationServices.Core.Application.SetSystemVariable(String name, Object value)
    bei EBL.Bearbeiten.Siel.BearbeitenSiel_CreateAL.Create(CmdType Type) in C:\VSProjects\2022\EBL.Bearbeiten.Siel\EBL.Bearbeiten.Siel\cls_BearbeitenSiel_CreateAL.vb:Zeile 588.
    bei EBL.Bearbeiten.Siel.BearbeitenSiel_Cmd.EBL_CreateAL() in C:\VSProjects\2022\EBL.Bearbeiten.Siel\EBL.Bearbeiten.Siel\cls_BearbeitenSiel_Cmd.vb:Zeile 1222.
    bei Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorker(MethodInfo mi, Object commandObject, Boolean bLispFunction)
    bei Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorkerWithExceptionFilter(MethodInfo mi, Object commandObject, Boolean bLispFunction)
    bei Autodesk.AutoCAD.Runtime.CommandClass.CommandThunk.Invoke()


    Verwende ich stattdessen den Wert 512 ist alles ok!

    Habe ich einen Gedankenfehler?

    Gruß Jan
    @jan99 Nach über 1100 Posts im Forum solltest Du wissen, dass Du Dich davon überzeugst, dass dort der richtige Wert ankommt, bevor Du hier postest.
    Also:
    Welcher (numerische) Wert kommt dort an?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Moin!

    erst einmal danke für die Rückmeldungen.

    @ErfinderDesRades: hier muss ich erst einmal nachfragen, weil im Kontext das "value__" nicht angeboten wird.



    Wenn ich dann wiedrum

    VB.NET-Quellcode

    1. Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("OSMODE", EBL.Global.Systemvariablen.OSMODE.Nächster.value__)


    eintrage erfolgt keine Anmerkung. Was ist das Spezielle davon??

    Im übrigen hat es damit funktioniert.

    @RodFromGermany: ich habe schon geschaut was ankommt und zumal ich das ENUM als Integer deklariert habe. Es wurde Nächster {512} angegeben. War bisher immer der Auffassung, dass der Name nur eine Art "Ansprechung" ist. Die Werte werden forlaufend der Definition festgelegt es sei denn mit "=" wird ein Wert zugewiesen.

    War wohl ein Irrtum.

    Jan

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „jan99“ ()

    jan99 schrieb:

    Es wurde Nächster {512} angegeben
    Das müsste ja wohl stimmen.
    Was passiert, wenn Du da oben direkt 512 eingibst?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    ErfinderDesRades schrieb:

    probierma

    VB.NET-Quellcode

    1. Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("OSMODE", EBL.Global.Systemvariablen.OSMODE.Nächster.value__)


    Moin!

    hatte ich ja schon einleitend geschrieben, dass es mit dem Wert 512 funktionert.

    Mit dem Weg vom "ErfinderDesRades" und dem "value__" hat es hingegegen funktionert. Ich verstehe nur die Wirkung von "value__" nicht, da value selber nicht im Kontext vorgeschlagen wird.

    Jan

    ErfinderDesRades schrieb:

    ich sach ja immermawieda: Guckt in den ObjectBrowser.
    Ich finde den dort auch nicht. :(
    Und in C# kennt er value__ gar nicht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das Teil ist da auch nicht zu finden. Aber es klappt trotzdem …
    Bilder
    • Foo.png

      13,04 kB, 374×708, 57 mal angesehen
    • EnumValue.png

      9,87 kB, 613×227, 65 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @jan99
    Das Problem bei Enums ist, dass bei einer Konvertierung in String/Object der Name herauskommt.
    Autodesk.AutoCAD.ApplicationServices.Core.Application.SetSystemVariable(String name, Object value)
    In deinem Fall also "Nächster".

    Es sollte ausreichen, wenn du die Explizite Umwandlung einfügst. CInt(EBL.Global.Systemvariablen.OSMODE.Nächster)

    ErfinderDesRades schrieb:

    value__
    Wo ist der dokumentiert?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo,
    value__ ist ein vom Compiler generiertes Feld, um intern Metadaten über das Enum (für sich) bereitzustellen. Das Verwenden dieses Feldes kann ich nicht empfehlen. Ein Enum hat zur Grundlage einen integralen numerischen Typ - Standardmäßig ist dies Integer. Ein Cast von Enum zu einem Integer kann und wird vom Compiler optimiert. Bedeutet,
    Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("OSMODE", CInt(EBL.Global.Systemvariablen.OSMODE.Nächster)) wird zu
    Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("OSMODE", 512), und somit zu einem konstanten Wert, während der Wert über value__ erst zur Laufzeit ermittelt wird.
    Kurzes Beispiel

    Die Antwort von @HenryV ist mMn. die korrekte Herangehensweise.
    Moin!

    danke erst einmal für die Informationen.

    ISliceUrPanties schrieb:

    Hallo,
    value__ ist ein vom Compiler generiertes Feld, um intern Metadaten über das Enum (für sich) bereitzustellen. Das Verwenden dieses Feldes kann ich nicht empfehlen. Ein Enum hat zur Grundlage einen integralen numerischen Typ - Standardmäßig ist dies Integer. Ein Cast von Enum zu einem Integer kann und wird vom Compiler optimiert. Bedeutet,
    Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("OSMODE", CInt(EBL.Global.Systemvariablen.OSMODE.Nächster)) wird zu
    Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("OSMODE", 512), und somit zu einem konstanten Wert, während der Wert über value__ erst zur Laufzeit ermittelt wird.
    Kurzes Beispiel
    vb-paradise.de/index.php/Attac…7f024c7fcb7a85cbf73165b70
    Die Antwort von @HenryV ist mMn. die korrekte Herangehensweise.


    Was bedeutet das hier mit den eckigen Klammern bei den Daten in dem ENUM?

    Ich werde für die OSMODE angelegenheit dann eine Funktion schreiben, die die Konvertierung gleich beinhaltet.

    Den letzten Tagen habe ich mehrere Konstanten in ENUM überführt und befürchte nun "böses".

    Dachte immer der Vorteil von ENUM ist, dass man lesbare Namen für Werte hat und somit "zielgerichteter" und "fehlerunanfälliger" Werte zuweisen kann.

    In Word und anderen Programmen wird auch mit solch lesbaren Konstanten gearbeitet.

    Oder mache ich vom Grundsatz hier etwas falsch?

    Hier noch ein weitere Beispiel:

    Ich habe einen ENUM -Wert "EBL.Global.TBD.Disposition.inBetrieb" mit dem Wert 6 und den numerischen Wert 6 will ich als Zeichenkette haben.

    Dann hatte ich bis Dato immer

    VB.NET-Quellcode

    1. EBL.Global.TBD.Disposition.inBetrieb.ToString


    verwendet. Daraus wird aber jetzt "inBetrieb".

    Gibt es darfür einen besseren Weg als

    VB.NET-Quellcode

    1. cint(EBL.Global.TBD.Disposition.inBetrieb).ToString


    ???

    Mit einer eigenen Klasse und dann das "ToString" überschreiben oder .... keine Idee ?



    Gruß Jan

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „jan99“ ()

    Ich frage mich schon die ganze Zeit was hier abgeht.
    Ein Enum ist im Prinzip ein benutzerdefinerter Datentyp, das heißt, will ich eine Enumeration verwenden, dann benötige ich auch eine Variable von diesem Typ,
    oder z.B. in einer Klasse "Kontakte" ein entsprechendes Property.
    Wenn ich Enums für Anredeodes habe, dann spreche ich den Anredecode als typof AnredecodeEnum an.

    Um bei deinen Enums zu bleiben:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub EnumTest()
    3. Dim myEnum As EnumLib.Systemvariablen.OSMODE
    4. myEnum = EnumLib.Systemvariablen.OSMODE.Nächster
    5. If myEnum = EnumLib.Systemvariablen.OSMODE.Nächster Then
    6. End If
    7. End Sub
    8. End Class



    Bei all dem frage ich mich dann, warum ich einen Datentyp bei ENUM mitgeben kann.

    Folgendes Beispiel habe mir gemacht:

    VB.NET-Quellcode

    1. Public Enum Fitting
    2. EntwRinneZuAblauf = 9
    3. End Enum
    4. Public Enum Hydraulik As Integer
    5. undefiniert = -1
    6. Druckrohr = 1
    7. End Enum
    8. MessageBox.Show("normal:= " & EBL.Global.TBD.Fitting.AbzweigerLinks.ToString & Environment.NewLine & "integer:= " & EBL.Global.TBD.Hydraulik.Druckrohr.ToString)


    Von meiner Seite hätte ich erwartet das bei as Integer und ToString zumindest der Wert kommt als String. Es werden aber immer die Klartexte ausgegeben!

    Warum ist das ansonsten definierbar?

    Gruß Jan

    jan99 schrieb:

    Es werden aber immer die Klartexte ausgegeben!
    Klar. Das ist ein eigener Type mit einem eigenen .ToString().
    Wenn Du die numerischen Werte haben willst, musst Du nach numerisch casten oder .value__ verwenden, was ich nicht tun werde / kann, da das in C# nicht vorkommt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    jan99 schrieb:

    Von meiner Seite hätte ich erwartet das bei as Integer und ToString zumindest der Wert kommt als String.
    Ja, tuterdoch

    jan99 schrieb:

    Es werden aber immer die Klartexte ausgegeben!
    wie denn sonst? .ToString ergibt immer (Klar)Text.

    jan99 schrieb:

    Warum ist das ansonsten definierbar?
    Was ist wann definierbar?