Möchte PictureBox neues Bild zuweisen aber bekomme: "Der name wurde nicht deklariert"

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Dragonfly.

    Möchte PictureBox neues Bild zuweisen aber bekomme: "Der name wurde nicht deklariert"

    Hallo allerseits,

    bin neu in diesem Forum und auch in VB-Sachen nicht wirklich erfahren.

    Ich erzeuge zur Laufzwit mehrere PictureBox-Elemente und möchte durch Klick darauf oder auf deren Label das Bild darin ändern

    VB.NET-Quellcode

    1. '20 ist mal so festgelegt, ist aber eigentlich dynamisch
    2. Dim element(20) As Panel
    3. Dim mitarbeiterbild(20) As PictureBox
    4. Dim mitarbeitername(20) As Label
    5. For i As Integer = 1 To menge
    6. element(i) = New Panel
    7. 'größen und positionen lass ich mal raus, weil die eher uninteressant sind
    8. parentpanel.Controls.Add(element(i))
    9. elementbild(i) = New PictureBox
    10. element(i).Controls.Add(elementbild(i))
    11. AddHandler elementbild(i).Click, AddressOf bild_aendern
    12. elementlabel(i) = New Label
    13. element(i).Controls.Add(elementlabel(i))
    14. AddHandler elementlabel(i).Click, AddressOf bild_aendern
    15. Next

    Soweit zur Erzeugung. Klappt auch alles so, wie ich es mir vorstelle.

    VB.NET-Quellcode

    1. Public Sub bild_aendern(ByVal sender As Object, ByVal e As System.EventArgs)
    2. 'statt 5 wird normalerweise eine ID ermittelt und die ist auch korrekt, ebenso der bildpfad als string
    3. elementbild(5).Image = Image.FromFile(bildpfad)
    4. End Sub

    Jetzt bekomme ich aber die Meldung 'Der name 'elementbild' wurde nicht deklariert'.

    In allen Beispielen in die ich gesehen habe, wurden die bereits im Fomular bestehenden PictureBoxen auch nie neu deklariert, daher weiß ich nicht, was zu tun ist, um das entsprechende Element neu anzusprechen.

    Ist wirklich sehr fragmentarisch die Code-Asuschnitte oben, aber alles relevante ist eigentlich drin. Alles wie Positions- oder ID-ermittlung, Pfad- oder Größen-angaben hab ich rausgenommen.

    Hoffe mir kann jemand helfen.

    Vielen Dank schonmal.
    Hi und Willkommen im Forum! :)
    ich kenn die meldung zwar so nicht, weil ich die englische Version hab aber kann es sein dass du "elementbild" nicht deklariert hast? Also dass in deinem Code nicht

    VB.NET-Quellcode

    1. Private elementbild(20) As PictureBox
    steht? Wenn das eigentlich nicht beabsichtigt war, sondern du die PictureBox5 ansprechen möchtest würde ich die PictureBox direkt ansprechen.

    Gruß
    ~blaze~
    danke schonmal,

    ja sie steht in einer eigenen sub, und da möchte ich sie auch lassen. Gibt es eine Möglichkeit der anderen sub 'bild_aendern' dennoch zugriff darauf zu verschaffen?

    Die 5 war nur ein Beispiel für ein element aus dem Array mit 20 Elementen. Ich wäre natürlich gern in der Lage auf alle Elemente aus dieser sub zuzugreifen.

    Würde

    VB.NET-Quellcode

    1. Private elementbild(20) As PictureBox


    das Problem schön lösen?

    Ich hatte

    VB.NET-Quellcode

    1. Dim elementbild(20) As PictureBox


    probiert, aber wie gesagt bin ich was VB angeht nicht sehr vertraut mit allem und stückel mir meinen Code so zusammen und versuche es zu verstehen, während ich dran sitze...
    Also lokale Variablen (die welche innerhalb einer Sub stehen) kannst du nicht mit Public deklarieren.
    Ich würde den Programmcode an deiner Stelle so umbauen das die Variable Elementbild in den öffentlichen Bereich kommt.
    Du könntest die Variable auch in ein Modul packen, falls du in deinem öffentlichen Bereich Platz sparen willst.
    Was es da sonst für Möglichkeiten gibt weiss ich nicht, aber das dürfte auch das einfachste sein.
    Also die Elemente sollen nicht auf jeden Fall erzeugt werden, sondern erst unter einer bestimmten Bedingung, daher führe ich die Funktion in dem Moment aus. Da da noch einige ähnliche Sachen dazu kommen sollen hätte ich das ungern alles im Public Bereich.

    Jetzt würde ich das mit Modulen gern machen, allerdings hab ich keinen Plan davon. Nach kurzem Googlen hab ich auch noch nix anständiges gefunden. Könnt ihr mir ein gutes Tutorial empfehlen, oder mir kurz zeigen, wie man eine Funktion in ein Modul umwandeln kann? Ich müsste auch Variablen übergeben...

    Danke bisher!
    Hai !
    Schau mal deine Variablen Deklarationen an, hast du wörklcih alles Ordnungsgemäß deklariert !
    Eine Funktion in ein Modul kannst du nicht umwandeln, du kannst in Modul deine Funktionen rein schreiben, am besten würde ich empfehlen eine Classe verwenden statt ein Modul.

    Mfg Alex
    Leider bin ich noch nicht so erfahren mit VB und trau mich noch nicht so recht an Klassen ran.

    Ist es möglich mir ein Minibeispiel dazu zu posten oder auf ein gutes Tutorial zu verweisen?

    Die Deklaration in der Funktion sieht derzeit so aus:

    VB.NET-Quellcode

    1. Dim elementbild(menge) As PictureBox
    2. elementbild(i) = New PictureBox

    Ich hoffe schon, dass das so stimmt.
    Hilft mir leider nicht. Ich habe daraus jetzt verschiedene Abschnitte gelesen, aber wenn man nicht einmal annähernd weiß, wo man suchen soll ist das als hättest du mir www.google.de empfohlen.

    Das ich in einer Funktion keine Publics deklarieren kann hab ich jetzt ja verstanden, aber wie man ich es?

    Ich erzeuge eine Klasse und darin eine Funktion? Die darin erzeugten Elemente sind doch dann global genauso wenig ansprechbar, wie die aus der ursprünglichen Funktion, oder nicht?
    In Klasse oder im Modulen kannst du deine Variablen mit DIM, Private,Public, Static deklarieren !
    Schau dir die Grundlagen an, wie man mit die Variablen, Arrays arbeitet, fang zuerst mit einfachen Sachen an, den Link hab im meinen letzten Beitrag. Dort steht alles über Variablen,Arrays, Funktionen,Prozeduren, Classen usw..........

    Mfg Alex

    by by
    Das Openbook was Alex2000 empfohlen hat dürfte das beste und umfangreichste sein was es derzeit in diesem Bereich frei erhältlich gibt.

    Ansonsten kann ich dir aus eigener Erfahrung noch ein anderes openbook empfehlen, es ist von daher für den Anfang ziemlich gut geeignet weil es viele Beispiele hat und der Quellcode vollständig erklärt wird.
    Openbook von Thomas Theis
    Würde dann etwas derartiges funktionieren?



    VB.NET-Quellcode

    1. Class Itembild
    2. Public bild As PictureBox
    3. Public bildname As Label
    4. Public Sub Bild_wechseln()
    5. ' Anweisungen
    6. End Sub
    7. End Class


    Dann lege ich die Eigenschaften so fest:

    VB.NET-Quellcode

    1. Dim Icon As New Itermbild
    2. Icon.bild.Image = Image.FromFile("bilder\1.jpg")
    3. Icon.bild.Left = 10
    4. Icon.bild.Top = 10
    5. Icon.bild.Width = 100
    6. Icon.bild.Height = 100
    7. Icon.bildname.Text = "TEST"


    Wie bringe ich dann das Objekt aber in das Formular?

    VB.NET-Quellcode

    1. Me.Controls.Add(Icon.bild)


    hab ich erstmal probiert (Im Edneffekt würde ich das ganze (Bild & Name) in einem Panel zusammenfassen, aber zum Testen...
    Allerdings passiert dann nix...

    Ich wär wirklich für einen Codeschnipsel dankbar, da ich dieses Problem in kürzerer Zeit lösen muss. Und wenn ich anfange die Bücher durchzuarbeiten, dauert das ja recht lange. Noch dazu, ist es vermutlich wieder recht speziell eine PictureBox in einer Klasse zu haben. Hab jedenfalls kein Beispiel in der Art finden können.

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

    Ok, hab jetzt eine Klasse und erzeuge über einen Aufruf dann auch das Bild und klappt soweit wie meine vorherige Funktionslösung nur wenn ich jetzt aus der durch addhandler angesprochenen Sub die sub innerhalb der Klasse ansprechen will, geht das trotzdem nicht.

    also das Objekt der Klasse heißt Icon un der Aufruf Icon.bild_wechseln funktioniert auch aus der Public Class Form1, aber aus der Public Sub Test funktioniert dieser Aufruf nicht:

    'Bild_wechseln' ist kein Member von "System.Drawing.Icon"

    EDIT: Habs

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

    Deklariere die Picturebox doch ganz einfach ausserhalb der einzelnen Private Sub.
    So in etwa:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public bild As PictureBox
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. End Sub
    5. End Class


    Dann kannst du problemlos in allen Private Subs darauf zugreifen.
    Eine eigene Klasse (Class Itembild) hätte ich glaube ich nicht extra erstellt.