$exception error BC30451: '"$exception" wurde nicht deklariert. Aufgrund der Schutzstufe ist unter Umständen kein Zugriff möglich.

  • VB.NET

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    $exception error BC30451: '"$exception" wurde nicht deklariert. Aufgrund der Schutzstufe ist unter Umständen kein Zugriff möglich.

    Ich habe vor ein programm zu schreiben wo ich verwarnungen speichern kann und die auomatisch nach 30 tagen gelöscht werden. Dafür will ich das jetzige datim mit Microsoft.VisualBasic.DateAndTime.Day(Now) speichern. Wenn ich das in ein my.settings array (system.collection.specilized.stringcollection) speichern möchte und bekomme dann immer den Error "der objektverweis wurde nicht auf eine objektinstanz festgelegt"


    VB.NET-Quellcode

    1. Public Class Hinzufügen
    2. Dim oldDate As Date
    3. Dim thisDay As Integer = Microsoft.VisualBasic.DateAndTime.Day(Now)
    4. Dim month As Integer = Microsoft.VisualBasic.DateAndTime.Month(Now)
    5. Dim num As Integer = Form1.start + Form1.anzahl + 1
    6. Dim nummer As String
    7. Dim i As Integer
    8. Dim anzahl As Integer
    9. Dim hi(5) As Integer
    10. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    11. My.Settings.tag(num) = thisDay.ToString
    12. My.Settings.monat(num) = month
    13. My.Settings.grund(num) = TextBox2.Text
    14. My.Settings.Nummer(num) = nummer
    15. Form1.anzahl = Form1.anzahl + 1
    16. My.Settings.anzahl = Form1.anzahl
    17. My.Settings.Save()
    18. My.Settings.Reload()
    19. While i < Form1.anzahl
    20. If nummer = My.Settings.Nummer(i + Form1.start) Then
    21. anzahl = anzahl + 1
    22. End If
    23. i = i + 1
    24. End While
    25. MsgBox(nummer & " hat seine " & anzahl & " Verwarnung")
    26. End Sub
    27. Private Sub Hinzufügen_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    28. nummer = InputBox(Prompt:="Nummer")
    29. TextBox2.Text = nummer
    30. End Sub
    31. End Class
    32. Und Form1 sieht so aus
    33. Public Class Form1
    34. Public Grund(1000000) As String
    35. Public nummer(1000000) As String
    36. Public tage(1000000) As Integer
    37. Public monat(1000000) As Integer
    38. Public anzahl As Integer
    39. Public anzahlAnVerwarnungen As Integer
    40. Public start As Integer
    41. Public safed As Boolean
    42. Public check As Boolean
    43. Dim i As Integer = 1
    44. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    45. End Sub
    46. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    47. Hinzufügen.Show()
    48. End Sub
    49. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    50. End Sub
    51. End Class




    Ich hoffe jemand kann mir helfen.

    *Topic verschoben, Code-Tag eingefügt*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Willkommen im Forum.
    Ich hatte beim Einfügen des Codes bei mir und Lauffähigmachen des Projektes tatsächlich die Hoffnung, dass Du Option Strict On hast - leider wohl nur ein Zufall, denn bei My.Settings.monat(num) = month wird klar: Du versuchst einen Integer in ein String-Array zu packen. Daher, bevor Du weitermachst, bitte die empfohlenen VS-Einstellungen verwenden.

    Zu Deinem Problem: Der Fehler sagt schon viel der Compiler wird konkret: z.B. mit

    Dein Array in den Settings ist einfach noch nix und kann daher auch keine Werte aufnehmen. Nur zur Klarheit: Es ist nicht leer, sondern es ist nicht vorhanden. In einen leeren Luftballon kann man Wasser reinfüllen. In einen nichtvorhandenen Ballon nicht. Daher müsstest Du es erstmal initialisieren, z.B. mit

    VB.NET-Quellcode

    1. If My.Settings.Tag Is Nothing Then My.Settings.Tag = New Collections.Specialized.StringCollection

    Der nächste Fehler tritt aber gleich im Anschluss auf, da jetzt zwar ein Feld existiert, dies aber leer ist und somit weder (großartig) Platz im RAM einnimmt noch Platz bietet, um etwas in ihm zu speichern. Daher kannst Du nicht einfach sagen: "An Position num soll etwas stehen." Ein Feld ist initial nicht unendlich groß, wo man dann einfach sagt: "An Platz Nummer 3 kommt dies hin, an Platz Nummer 99 das und der Rest ist erstmal unbesetzt." Ein leerer Ballon kann keinen Liter Wasser aufnehmen und dabei seine kleine Form behalten. Wenn man Platz braucht, muss man ihn reservieren, indem man dem Feld Elemente hinzufügt. Dadurch wird der Ballon größer, passt sich also dem Inhalt an. Dies erfolgt bei Dir durch My.Settings.Tag.Add(), um ein einzelnes Element hinzuzufügen oder mit My.Settings.Tag.AddRange(), um mehrere gleichzeitig hinzuzufügen. Wenn Du 20 Plätze brauchen würdest, wäre eine (ineffiziente, aber funktionierende) Variante, 20 Plätze, alle einzeln nacheinander dem Feld hinzuzufügen:

    VB.NET-Quellcode

    1. For i = 0 To 19
    2. My.Settings.Tag.Add(Nothing)
    3. Next

    Nun stehen 20 Plätze zur Verfügung ("nummeriert" von 0 bis 19), um insgesamt 20 Strings aufzunehmen.

    Das zur Erklärung des Problems.

    Falls Dir das reicht, hör auf zu lesen. Wenn Du wichtige Hinweise zu Deinem Code haben willst, geht es gleich weiter. Ich glaube zu wissen, in welcher Programmierkenntnisphase Du Dich befindest, daher werden Dir viele Punkte wahrscheinlich neu sein und das ein oder andere wird Dir sauer aufstoßen, aber Schonung ist bei Programmierung kein sinnvoller Weg.



    Sobald der Microsoft.VisualBasic raus ist, kannst Du, um an Now zu kommen, einfach schreiben: Date.Now. Wenn Du nicht den momentanen Zeitpunkt, sondern nur den heutigen Tag brauchst, geht auch Date.Today.
    MsgBox -> MessageBox.Show
    InputBox: ja, ok, für den Anfang geht schon Microsoft.VisualBasic.InputBox. Ich hab mir da was eigenes gebastelt, was flexibler ist, aber belassen wir es erstmal bei der VB6-InputBox.
    Dim num As Integer = Form1.start + Form1.anzahl + 1 und Hinzufügen.Show(): siehe Dialoge richtig instanziieren

    Schenk Dir die Reload-Zeile in

    VB.NET-Quellcode

    1. My.Settings.Save()
    2. My.Settings.Reload()

    Sowas wie anzahl = anzahl + 1 kannst Du zusammenfassen zu anzahl += 1
    Arbeite an den Variablennamen und an der Benennung der CEs. TextBox2? Damit hat man keine Ahnung, was da drinnen stehen könnte.
    Public Grund(1000000) As String: Das sollte genügend Platz für Gründe bieten, ist aber die falsche Herangehensweise. Nimm eine List(Of String), die Du flexibel erweitern kannst, siehe oben mit den Settings.
    Public-Variablen sind ein code smell. Wer sowas zu brauchen glaubt, kennt es nicht anders. Warum verwendest Du es in Form1 (auch schlecht benannt, bzw. gar nicht selber), wenn Du es anscheinend nur in Hinzufügen (selber benannt, ok; aber schlecht benannt. Was denn hinzufügen?) brauchst?
    Das Abspeichern von Arrays in den Settings ist nochmal ein Thema, was man später angeht, aber das hiesige reicht erstmal für den Anfang.

    Das für den Anfang.

    btw: falsches Unterforum - Du hast im VBA-Forum, also für Probleme bei der Verwendung von Makros in Excel, Word und Co. gepostet.
    und: bitte CodeTags verwenden
    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.