Benutzer Attribute / Rechte / Flags berechnen

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    Benutzer Attribute / Rechte / Flags berechnen

    Hallo allerseits,

    also ich versuche gerade etwas aber ich komme einfach nicht weiter.
    Ich erklärte mal das Problem .. :s


    Benutzerrechte:

    Zugriff auf Form 1 (Wert: 64)
    Zugriff auf Form 2 (Wert: 128)
    Zugriff auf Form 3 (Wert: 256)
    Zugriff auf Form 4 (Wert: 512)
    Zugriff auf Form 5 (Wert: 1024)


    wenn ich den Benutzer nun die Rechte gebe das er Form 1 und Form 3 öffnen darf dann habe ich eine Summe von (320)... dieses zu berechnen ist ja an sich kein Problem :D...

    aber wie kann ich nun aus der Summe 320 heraus ablesen das der Benutzer das Recht hat Form 1 und Form 3 zu öffnen ...?

    Man könnte nun natürlich eine "Banale" Abfrage machen aber bei mehreren "Rechten"(Attributen) wäre dies eine unendlich lange abfrage..


    ich hoffe man konnte mir soweit folgen :)

    LG.
    Marvin
    Imperiums - Fortschritt in ein neues Zeitalter (Remake 2021)

    virus schrieb:

    Benutzerrechte
    Mach es so:

    VB.NET-Quellcode

    1. <Flags()>
    2. Public Enum Werte
    3. Wert0 = 0
    4. Wert1 = 1
    5. Wert2 = 2
    6. Wert3 = 4
    7. Wert4 = 8
    8. Wert5 = 16
    9. End Enum
    10. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    11. Dim ww As Werte = Werte.Wert1 Or Werte.Wert2 Or Werte.Wert5
    12. End Sub
    Bilder
    • Enum.png

      9,21 kB, 476×213, 161 mal angesehen
    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!
    Ja ok, aber nehmen wir an ich lese nun den Wert 19 aus der DB aus, woher weiß ich denn nun das es die Werte 1,2 und 5 sind ?
    bzw Woher weiß es das Programm ?

    edit:

    VB.NET-Quellcode

    1. Select Case ww
    2. Case Werte.Wert0
    3. Case Werte.Wert1
    4. Case Werte.Wert2
    5. Case Werte.Wert3
    6. Case Werte.Wert4
    7. Case Werte.Wert5
    8. End Select


    warum geht das denn so nicht ? oder habe ich nen fehler im code ?
    Imperiums - Fortschritt in ein neues Zeitalter (Remake 2021)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „virus“ ()

    virus schrieb:

    Woher weiß es das Programm ?
    Sag es ihm:

    VB.NET-Quellcode

    1. Public Class Form1
    2. <Flags()>
    3. Public Enum Werte
    4. Wert0 = 0
    5. Wert1 = 1
    6. Wert2 = 2
    7. Wert3 = 4
    8. Wert4 = 8
    9. Wert5 = 16
    10. myWert9 = Wert5 Or Wert2 Or Wert1
    11. End Enum
    12. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    13. Dim ww As Werte = Werte.Wert1 Or Werte.Wert2 Or Werte.Wert5
    14. Select Case ww
    15. Case Werte.Wert0
    16. Case Werte.Wert1
    17. Case Werte.Wert2
    18. Case Werte.Wert3
    19. Case Werte.Wert4
    20. Case Werte.Wert5
    21. Case Werte.myWert9
    22. End Select
    23. End Sub
    24. End Class
    Klick mal auf das Flags und drück dann auf F1 = Hilfe, da öffnet sich die MSDN und sagt Dir, was sonst noch so los ist.
    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!
    Edit by ErfinderDesRades: unnötiges Vollzitat entfernt


    Also wenn ich das so machen würde wie du mir sagtest dann müsste ich alle möglichen kombinationen in der Abfrage bei schreiben..

    wenn ich den wert 1 + Wert 5 habe ergibt dies = 17 der "filtert" diese nicht einzeln .. sonder in der Case Abfrage muss diese Kombination hinterlegt sein .. :S

    MSDN bin ihc mir gerade nicht sicher wie ichs machen sollte ... hab mir den code mal angeschaut der dort ist, und habe auch noch etwas versucht aber alles ohne erfolg ....

    Lg
    Marvin
    Imperiums - Fortschritt in ein neues Zeitalter (Remake 2021)

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

    virus schrieb:

    dann müsste ich
    mal mein Problem an einem einfachen Beispiel und ohne Vorgabe einer Lösung beschreiben.
    Den kompletten Post fein säuberlich zu zitieren nützt nix, lies lieber in der MSDN.
    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!

    virus schrieb:

    wenn ich den wert 1 + Wert 5 habe ergibt dies = 17 der "filtert" diese nicht einzeln .. sonder in der Case Abfrage muss diese Kombination hinterlegt sein .
    Doch, der filtert das einzeln (wenn gewünscht).
    Nur ist gut möglich, dass statt eines Select Cases mehrere If-Abfragen besser wären .

    Aber wie RFG sagt: Son abstraktes um den heißen Brei Herum-Gerede bringt keinen Fortschritt
    Du könntest auch in einer Schleife bei dem höchsten Wert anfangen (1024) und dann prüfen, ob dieser Wert kleiner als deine Summe ist. Wenn ja, dann weißt du, dass du dieses Attribut besitzt (z.B. 256). Anschließend ziehst du diesen Wert von deiner Summe ab und prüfst diese Summe dann auf den nächst kleineren Wert (also ob 128 < 64 ist) usw.
    hmm - da empfehle ich auch dir, in dieses Buch lesen (hingegen das Galileio-Openbook ist Mist) (kostenloser Download), das hervorragende Kapitel zu Enumerationen nachzulesen, und auch die bitweisen Operatoren, v.a. And und Or
    So wie du vorschlägst, geht man höchstwahrscheinlich nicht damit um.
    Enums verwendet man üblicherweise mit bitweisen Operatoren, oder man nutzt gleich die HasFlag-Methode.
    Also um das mal eben aufzu lösen ^^

    Also ich habe es bis jetzt so gelöst... so funktioniert es derweil ... nur ist die frage ob es so die "optimale" lösung ist, wobei ich natürlich auch das ganze mit den IF abfragen machen könnte.. was meint ihr denn dazu ?


    Spoiler anzeigen

    VB.NET-Quellcode

    1. <Flags()> Enum Werte
    2. Wert0 = 0
    3. Wert1 = 1
    4. Wert2 = 2
    5. Wert3 = 4
    6. Wert4 = 8
    7. Wert5 = 16
    8. Wert6 = 32
    9. wert7 = 64
    10. wert8 = 128
    11. wert9 = 256
    12. wert10 = 512
    13. End Enum
    14. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    15. Dim Valdyn As Werte = value
    16. For i As Integer = 0 To value
    17. Select Case True
    18. Case (Valdyn And Werte.Wert1) = Werte.Wert1
    19. MsgBox("1")
    20. Valdyn -= Werte.Wert1
    21. Case (Valdyn And Werte.Wert2) = Werte.Wert2
    22. MsgBox("2")
    23. Valdyn -= Werte.Wert2
    24. Case (Valdyn And Werte.Wert3) = Werte.Wert3
    25. MsgBox("3")
    26. Valdyn -= Werte.Wert3
    27. Case (Valdyn And Werte.Wert4) = Werte.Wert4
    28. MsgBox("4")
    29. Valdyn -= Werte.Wert4
    30. Case (Valdyn And Werte.Wert5) = Werte.Wert5
    31. MsgBox("5")
    32. Valdyn -= Werte.Wert5
    33. Case (Valdyn And Werte.Wert6) = Werte.Wert6
    34. MsgBox("6")
    35. Valdyn -= Werte.Wert6
    36. Case (Valdyn And Werte.wert7) = Werte.wert7
    37. MsgBox("7")
    38. Valdyn -= Werte.wert7
    39. Case (Valdyn And Werte.wert8) = Werte.wert8
    40. MsgBox("8")
    41. Valdyn -= Werte.wert8
    42. Case (Valdyn And Werte.wert9) = Werte.wert9
    43. MsgBox("9")
    44. Valdyn -= Werte.wert9
    45. Case (Valdyn And Werte.wert10) = Werte.wert10
    46. MsgBox("10")
    47. Valdyn -= Werte.wert10
    48. End Select
    49. Next
    50. end sub
    Imperiums - Fortschritt in ein neues Zeitalter (Remake 2021)
    Hi
    schon mal über Bitshifts versucht?

    VB.NET-Quellcode

    1. Dim value As Integer = 0
    2. For i As Integer = 0 To 31
    3. MessageBox.Show(String.Format("Bitwert {0}: {1}", i, ((value >> i) And 1).ToString())
    4. Next


    1 << i entspricht 2^i, >> ist die umgekehrte Operation (also ((1 << i) >> i) = 1) und And sollte selbsterklärend sein (einfach alle Bits, außer dem 0-ten entfernen)
    x And Not (1 << i) würde btw. das i-te Bit auf False setzen.

    Gruß
    ~blaze~

    VB.NET-Quellcode

    1. 'konventionelle Schreibe
    2. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. If (value And Werte.Wert1) <> 0 Then MessageBox.Show("1")
    4. If (value And Werte.Wert2) <> 0 Then MessageBox.Show("2")
    5. If (value And Werte.Wert3) <> 0 Then MessageBox.Show("3")
    6. If (value And Werte.Wert4) <> 0 Then MessageBox.Show("4")
    7. If (value And Werte.Wert5) <> 0 Then MessageBox.Show("5")
    8. If (value And Werte.Wert6) <> 0 Then MessageBox.Show("6")
    9. If (value And Werte.wert7) <> 0 Then MessageBox.Show("7")
    10. If (value And Werte.wert8) <> 0 Then MessageBox.Show("8")
    11. If (value And Werte.wert9) <> 0 Then MessageBox.Show("9")
    12. If (value And Werte.wert10) <> 0 Then MessageBox.Show("10")
    13. End Sub
    14. 'hasFlag-Schreibe
    15. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    16. If value.HasFlag(Werte.Wert1) Then MessageBox.Show("1")
    17. If value.HasFlag(Werte.Wert2) Then MessageBox.Show("2")
    18. If value.HasFlag(Werte.Wert3) Then MessageBox.Show("3")
    19. If value.HasFlag(Werte.Wert4) Then MessageBox.Show("4")
    20. If value.HasFlag(Werte.Wert5) Then MessageBox.Show("5")
    21. If value.HasFlag(Werte.Wert6) Then MessageBox.Show("6")
    22. If value.HasFlag(Werte.wert7) Then MessageBox.Show("7")
    23. If value.HasFlag(Werte.wert8) Then MessageBox.Show("8")
    24. If value.HasFlag(Werte.wert9) Then MessageBox.Show("9")
    25. If value.HasFlag(Werte.wert10) Then MessageBox.Show("10")
    26. End Sub

    Die Abfrage auf <> 0 funktioniert btw. nur bei unabhängigen Flags:

    VB.NET-Quellcode

    1. Public Enum SomeEnum
    2. Bla = 1
    3. BlaXY = &H101
    4. LowMask = &HFF
    5. HighMask = &HFF00
    6. End Enum

    Hier würde eine Abfrage auf (SomeEnum And Bla) eben auch bei BlaXY wahr sein. Sowas kann man ganz gut brauchen, wenn man die Werte des Enums "codiert". Ist teilweise aus Performancegründen oder zur Verminderung der Programmkomplexität sehr elegant.

    Gruß
    ~blaze~
    ja - unabhängige Flags sind hier ja gegeben, und um die (unabhängig voneinander) abzufragen gehts ja.
    Andernfalls hätte man etwas umständlicher konventionell coden müssen:

    VB.NET-Quellcode

    1. Private Sub Button_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. If (value And Werte.Wert1) = Werte.Wert1 Then MessageBox.Show("1")
    3. If (value And Werte.Wert2) = Werte.Wert2 Then MessageBox.Show("2")
    4. If (value And Werte.Wert3) = Werte.Wert3 Then MessageBox.Show("3")
    5. If (value And Werte.Wert4) = Werte.Wert4 Then MessageBox.Show("4")
    6. If (value And Werte.Wert5) = Werte.Wert5 Then MessageBox.Show("5")
    7. If (value And Werte.Wert6) = Werte.Wert6 Then MessageBox.Show("6")
    8. If (value And Werte.wert7) = Werte.wert7 Then MessageBox.Show("7")
    9. If (value And Werte.wert8) = Werte.wert8 Then MessageBox.Show("8")
    10. If (value And Werte.wert9) = Werte.wert9 Then MessageBox.Show("9")
    11. If (value And Werte.wert10) = Werte.wert10 Then MessageBox.Show("10")
    12. End Sub
    Das ist jetzt die exakte Entsprechung der HasFlags-Funktion

    Die HasFlags-Funktion mag ich nicht so recht, weil da hilft Intellisense bisserl weniger mit, sodass man problemlos auch folgenden Unfug hinschreiben kann:

    VB.NET-Quellcode

    1. Dim value As Werte
    2. If value.HasFlag(DockStyle.Fill) Then MessageBox.Show("1")
    Also buntes Mischen verschiedener Enumse :thumbdown:

    diesen Unfug Kann man konventionell auch, aber Intellisense bringt nur typ-korrekte Vorschläge - daher muss man den Unfug schon mit Fleiß betreiben ;)

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