Bei Picturebox Klick -> Bild ändern (bestimmtes Verzeichnis durchblättern)

  • VB.NET

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

    Bei Picturebox Klick -> Bild ändern (bestimmtes Verzeichnis durchblättern)

    Hallo,

    folgendes Problem:

    Ich habe eine Picturebox und möchte,dass bei jedem Klick auf diese das Bild geändert wird (aus bestimmten Ordner). Kriege es aber irgendwie nicht hin..

    Es sind immer ca. 15 Bilder in dem Ordner (jpg & png)

    Kann man den Ordner der Reihe nach durchgehen?

    PS: Habe schon in Google gesucht, hat aber nichts geklappt. Bräuchte es für ein kleines Programm was ich in der Arbeit für mich verwende :)

    Ich bedanke mich im Voraus für jegliche Hilfe :thumbsup:

    Grüße, Markus
    An sich recht simpel. Man braucht einen Liste mit den Pfaden. Dann einen fortlaufenden Index der die aktuelle Stelle in der Liste repräsentiert und das Klick Event der PictureBox.

    Pfade in Liste laden
    beim klick index um eins erhöhen
    Bild aus der Liste laden
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

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

    Willkommen im Forum.

    Da gibt's verschiedene Möglichkeiten. Bevor jemand den Vorschlag bringt: Programmieren wäre ein Weg.
    Du hast: den PictureBox_Click-EventHandler, die Picture_Image-Property, Deinen Ordner
    Es fehlt: ein Codevorschlag Deinerseits, was Du schon in der Richtung probiert hast.

    Sollen die Bilder immer in gleicher Reihenfolge kommen oder brauchst Du noch nen Zufallsgenerator?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @VaporiZed

    Die Bilder sollen immer in einer Reihenfolge kommen (Ähnlich wie bei Mobile / Autoscout mit den Fahrzeugbildern) - Nur ohne den Slider :D

    Ehrlich gesagt könnte ich dir nur einen angepassten (nicht funktionierenden) Copy&Paste Code geben, brauche das wirklich nur für die Arbeit, da das Programm im allgemeinen sehr viel lästige Arbeit abnimmt...
    Immer her damit. Wollen doch mal sehen, was Du hast, damit man darauf aufbauen kann.
    Was soll geschehen, wenn das Ende der Bilderliste erreicht ist? Nix mehr oder von Neuem beginnen?
    Ich habe in der von mir geschriebenen Datei nun 11 Zeilen*, um das Problem** komplett zu stemmen. Unter Abzug der Klassen- und Prozedurrümpfe sind es 3. Wer bekommt weniger hin?***

    *ohne :, also ohne mehrere Codezeilen in einer
    **unter der Vorraussetzung, dass am Ende der Bilderliste Schluss ist. Mit Zurückspulen ist es eine mehr.
    ***mit kleiner Trickserei in der Form.Designer.vb sind es sogar nur 2.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

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

    @ILLEX hast du schonmal was porgrammiert oder ist das dein erstes Projekt?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @ILLEX Kleiner Zwei Hinweise:
    • Wenn Du ein Bild lädtst, dann nutze den Bitmap-Konstruktor mit dem Stream: msdn.microsoft.com/de-de/libra…cs-lang=vb#code-snippet-1
      da wird die Bitmap nicht von einem anderen Prozess festgehalten.
    • Wenn Du Deiner PictureBox ein Bild zuweist, solltest Du das vorhandene zunächst disposen, um kein Memory-Leak zu erzeugen:

      VB.NET-Quellcode

      1. If PictureBox1.Image IsNot Nothing Then
      2. PictureBox1.Image.Dispose()
      3. End If
      4. PictureBox1.Image = DEIN_BILD

    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    @VaporiZed

    Werde heute nach der Arbeit mal nen Code posten

    Wenn das letzte Bild erreicht wurde, soll er wieder von vorne anfangen.

    Vielen Dank für die Hilfe


    @mrMo Ist nicht mein erstes Programm, ich kann Code (bis zu einem gewissen Grad) lesen und verstehen, bin aber kein Profi - Habe in meinem Programm teilweise zu langen Code, den man bestimmt auch viel kürzer gestalten könnte .

    Mir reicht es aber wenn es auf der Arbeit funktioniert :P (Klar wär es besser wenn mans gleich richtig machen würde, jedoch fehlt mir dazu einfach die Zeit).

    @RodFromGermany Werd mir das ganze nach der Arbeit mal durchlesen - Vielen Dank

    ILLEX schrieb:

    Klar wär es besser wenn mans gleich richtig machen würde, jedoch fehlt mir dazu einfach die Zeit
    Falsche Herangehensweise.
    Überleg, wann die nächste Änderung / Erweiterung / Fehlerbehebung ansteht und wie oft das Programm von wie vielen Leuten genutzt wird.
    Wenn das abzusehen ist, ist es gut, wenn Du Dich (gelegentlich) mit dem Projekt beschäftigst, und da sind solche "Ordentlich-Machungen" eine gute Fingerübung.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    @VaporiZed @RodFromGermany

    Habe es soweit mit dem Zufallsgenerator hinbekommen

    Quellcode

    1. Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click
    2. Dim Zufallsbild As New Random
    3. Dim fzgbilder() As String = IO.Directory.GetFiles("C:\Users\****\", "*.jpg", IO.SearchOption.TopDirectoryOnly)
    4. Dim jpg As New Bitmap(fzgbilder(Zufallsbild.Next(0, fzgbilder.Count - 1)))
    5. PictureBox1.Image = jpg
    6. End Sub
    7. End Class


    Weiß nur nicht wie ich es hin bekomme, dass er der Reihe nach durchgeht und beim letzten wieder von vorne anfängt.. Kann mir jemand auf die Sprünge helfen?

    Danke für eure Tipps!

    ** Die Bilder sind leider oft groß (2-6mb) - Kann ich diese irgendwie komprimieren bevor ich Sie lade?

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

    Zieh die Zeile 4 aus der Sub raus. Das brauchst Du nur 1x. Den Zufallsgenerator kannst Du entsorgen. Brauchst und willst Du ja nicht.
    Dann noch eine Zählvariable, die Du bei jedem Klick erhöhst:

    VB.NET-Quellcode

    1. Dim CurrentPictureIndex As Integer = 0
    2. Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click
    3. CurrentPictureIndex = (CurrentPictureIndex + 1) Mod fzgbilder.Count()
    4. PictureBox1.ImageLocation = fzgbilder(CurrentPictureIndex)
    5. End Sub

    Disposen nicht vergessen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Quellcode

    1. Dim CurrentPictureIndex As Integer = 0
    2. Dim fzgbilder() As String = IO.Directory.GetFiles("C:\Users\Markus\Desktop\Neuer Ordner\", "*.jpg", IO.SearchOption.TopDirectoryOnly)
    3. Dim jpg As New Bitmap(fzgbilder(fzgbilder.Count - 1))
    4. Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click
    5. CurrentPictureIndex = (CurrentPictureIndex + 1) Mod fzgbilder.Count()
    6. PictureBox1.ImageLocation = fzgbilder(CurrentPictureIndex)
    7. PictureBox1.Image = jpg
    8. End Sub


    So korrekt?

    Funktioniert soweit, aber wenn ich schnell klicke zeigt er für gefühlte 0,2 Sekunden ein anderes Bild an..

    Liegt das an der Bildgröße? Kann ich die Bilder vor dem laden komprimieren?

    @VaporiZed
    Lass Zeile#3 und #10 weg. Ohne die kann ich sehr schnell klicken. Aber ich verwende auch nur kleine Bilder. Wenn Du große hast, würde Dir eine Komprimierung nix bringen, da die zur Anzeige dekomprimiert werden müssten. Kommt natürlich drauf an, was Du Dir unter Komprimierung vorstellst. Dann wäre es wohl sinnvoller, mit 2-3 PicBoxen zu arbeiten, wobei immer nur eine angezeigt wird, aber die nächsten beiden Bilder in den anderen Boxen schon "vorgeladen" werden. Beim Klicken wird dann einfach nur die anzuzeigende PicBox geändert.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @ILLEX Die Zeilen #2 und #3 stehen im leeren Raum, pack die die Instanziierung des String-Arrays und der Bitmap in die Form_Shown.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!