Bilder Galarie

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Bilder Galarie

    Hallo zusammen.
    Ich komme direkt zum Thema.
    Ich habe einen Button und eine Picturebox.
    Mit dem Button möchte ich bei jedem klick da nächste bild aus meinem Ordner (d:\bilder) laden.
    Hänge gerade ein bischen, was mach ich falsch.

    VB.NET-Quellcode

    1. ​Dim directory As New IO.DirectoryInfo("D:\Bilder")
    2. If directory.Exists Then
    3. Dim jpgFiles() As IO.FileInfo = directory.GetFiles("*.jpg")
    4. For Each jpgFile As IO.FileInfo In jpgFiles
    5. If jpgFile.Exists Then
    6. Dim image = Drawing.Image.FromFile(jpgFile.FullName)
    7. Using image
    8. PictureBox1.Image = image.Clone
    9. End Using
    10. End If
    11. Next
    12. End If


    Danke im Vorfeld
    Joa. Mit dem Code schiebst Du jedes Bild des Ordners in die PicBox und das letzte wird dann am Ende angezeigt. Nicht ganz, wie geplant. Mehrere Möglichkeiten: Du haust alle Bilder in eine List(Of Image) namens ListOfImages* und nimmst ne zusätzliche Zählvariable CurrentImageIndex* her. Im Button-Click-EventHandler erhöhst Du diese mit jedem Click um 1 und packst das Bild ListOfImages(CurrentImageIndex) in die PicBox.
    Oder Du lässt das ListOfImages weg und holst das Bild mit dem entsprechenden Zählindex direkt aus dem Verzeichnis.
    Oder alle Bilder in ne ListBox und daher das entsprechende Image ziehen. Wie Du willst.

    * Name natürlich frei wählbar.
    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.
    @VaporiZednull
    und holst das Bild mit dem entsprechenden Zählindex direkt aus dem Verzeichnis.

    Ich habe ja unterschiedlich viele Bilder, es können mal 7 oder auch mal 30 Bilder sein, klappt es denn dann überhaupt.
    Habe mich vielleicht auch falsch ausgedrückt.

    Einfach gesagt eine kleine Bilder Galrie mit unterschiedlich vielen Bildern.
    @Otti Wie @VaporiZed schon schrieb: lies alle Bilder in eine List(Of Bitmap), da ist die Anzahl egal, Du kannst sogar die Bilder mehrerer Verzeichnisse da reinpacken,
    und klickere die per Button_Click durch.
    Wenn Du am Ende der Liste angelangt bist, setze den Zähler auf 0, sonst kommt ne IndexOutOfRange-Exception.
    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!
    @VaporiZed
    So habe nun meine Bilder in einer ListView, klappen tut es , ob es allerdings ganz elegant ist, da bin ich mir nicht sicher.
    Wie soll es denn nun weiter gehen bzw bekomme die in meiner Picturebox?

    VB.NET-Quellcode

    1. ​Dim meinebilder() As String = System.IO.Directory.GetFiles("D:\Bilder", "*.jpg")
    2. Dim i As Integer = 0
    3. For Each File As String In meinebilder
    4. ImageList1.Images.Add(i, Image.FromFile(File))
    5. ListView1.Items.Add(File, i)
    6. i += 1
    7. Next File
    Bitte Post#2 richtig lesen und anwenden: ListBox. Aber es geht hier nicht um die ListBox an sich, sondern darum, was man dann mit der ListBox macht. Und das steht in dem Thread, den ich dort verlinkt habe.
    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.
    @VaporiZed

    Sorry, leider habe ich nicht das perfekte Wissen, wie vielleicht andere Leute hier im Forum, daher muss ich gestehen das ich nicht weiß was du meinst.
    Da soll absolut nicht böse gemeint sein, ich versuche lediglich dem ganzen langsam nähr zu kommen, sofern es meine Krankheit zu lässt.
    Es wäre schön wenn du mir es et. ein bischen mehr für dumme erklären würdest.
    Danke für dein / euer Verständniss
    Kein Problem. Es geht nur darum, dass man in ne ListBox nicht nur - wie bei nem ListView - Strings reinhauen kann, sondern eben Dateiinfos (FileInfo). Und dann kann man mit nem Klick auf einen ListBox-Eintrag gleich quasi ne Datei in die Griffel kriegen und diese gleich in ne PicBox hauen. Aber lassen wir die ListBox erstmal beiseite. Du willst Buttons. Also wie geschrieben: Alle Dateinamen oder FileInfos oder Images in ne entsprechende List(Of) reinzimmern. Und dann per Index drauf zugreifen. Und bei Button-Click Index ändern und PicBox aktualisieren.

    Übernommen und minimal modifiziert aus Post#1:

    VB.NET-Quellcode

    1. Class Form1
    2. Private DeineBilderliste As New List(Of Image)
    3. Private AktuellerBilderIndex = -1
    4. Private Sub DateienEinlesen()
    5. Dim directory As New IO.DirectoryInfo("D:\Bilder")
    6. If Not directory.Exists Then Return
    7. Dim jpgFiles() As IO.FileInfo = directory.GetFiles("*.jpg")
    8. For Each jpgFile In jpgFiles
    9. If Not jpgFile.Exists Then Return 'trifft diese Bedingung denn jemals zu?
    10. DeineBilderliste.Add(Drawing.Image.FromFile(jpgFile.FullName).Clone) 'ggf. ohne Clone probieren
    11. Next
    12. End Sub

    Alles ungetestet. Und dann eben im Button_Click:

    VB.NET-Quellcode

    1. AktuellerBilderIndex += 1 'Prüfen, dass AktuellerBilderIndex < DeineBilderliste.Length sein muss
    2. PictureBox1.Image = DeineBilderliste(AktuellerBilderIndex)

    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.
    @VaporiZed
    Danke schön, denke auch das ich es bereits teilweise verstanden habe.
    Allerdings weis ich nicht was du mit
    'Prüfen, dass AktuellerBilderIndex < DeineBilderliste.Length sein muss​
    meinst.
    Hat das damit zutuen das ich nach dem letzten Bild folgende Meldung erhalte??

    System.ArgumentOutOfRangeException: "Der Index lag außerhalb des Bereichs. Er darf nicht negativ und kleiner als die Sammlung sein. Parametername: index"​
    Ja. Das war das, was RfG erwähnte:

    RodFromGermany schrieb:

    Wenn Du am Ende der Liste angelangt bist, setze den Zähler auf 0, sonst kommt ne IndexOutOfRange-Exception.

    =>

    VB.NET-Quellcode

    1. AktuellerBilderIndex += 1
    2. If AktuellerBilderIndex = DeineBilderliste.Length Then AktuellerBilderIndex = 0


    Man kann das auch noch kompakter schreiben (AktuellerBilderIndex = (AktuellerBilderIndex + 1) Mod DeineBilderliste.Length), aber dann geht v.a. für Leute, die das nicht so häufig machen, schnell die Klarheit verloren.

    @Otti
    btw: Du musst mich nicht mit der @-Funktion anpingen, wenn mein Post direkt vor Deinem kam. Das ist nur sinnvoll, wenn Du jemanden ansprechen willst, der noch gar nicht beim Thema dabei war oder vor mehreren Posts was geschrieben hat. Oder wenn Du den letzten Post editierst und sicherstellen willst, dass der Post - obwohl er schon etwas älter ist - von demjenigen nochmal gelesen wird, eben weil Du noch was danach reingeschrieben hast, so wie ich jetzt.
    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.

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

    Ups. Dann Count.
    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.
    Sobald Du Deinen Code fertig hast, kannst Du ihn ja posten. Und wenn dann noch Fragen offen sind, immer her damit.
    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.
    Der fertige Code, falls mal einer wie ich dumm da steht :/

    VB.NET-Quellcode

    1. ​Public Class Galarie
    2. Private DeineBilderliste As New List(Of Image)
    3. Private AktuellerBilderIndex = -1
    4. Private Sub Galarie_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. Dim directory As New IO.DirectoryInfo("D:\Bilder")
    6. If Not directory.Exists Then Return
    7. Dim jpgFiles() As IO.FileInfo = directory.GetFiles("*.jpg")
    8. For Each jpgFile In jpgFiles
    9. If Not jpgFile.Exists Then Return
    10. DeineBilderliste.Add(Drawing.Image.FromFile(jpgFile.FullName).Clone) ' funktion auch ohne CLONE
    11. Next
    12. End Sub
    13. Private Sub Bildtimer_Tick(sender As Object, e As EventArgs) Handles Bildtimer.Tick
    14. AktuellerBilderIndex += 1
    15. If AktuellerBilderIndex = DeineBilderliste.Count Then AktuellerBilderIndex = 0
    16. PictureBox.Image = DeineBilderliste(AktuellerBilderIndex)
    17. End Sub
    18. End Class


    Mit ​clone verstehe ich nicht ganz, klappt mit und ohne.
    Kleine Anmerkungen:
    • Zeile#11 habe ich falsch vorgemacht: nicht Then Return, sondern Then Continue For
    • ggf. noch an der Benennung der Variablennamen arbeiten. DeineBilderliste sollte abgeändert werden
    • der Bilder-Ladecode sollte nicht in den Form_Load-EventHandler (EH), sondern ggf. in den Form_Shown-EH. Wenn Fehler auftreten sollten, werden die nämlich gern in Form_Load verschluckt und man steht doof da und weiß nicht, warum Blödsinn entsteht.
    • Galerie, nicht Galarie
    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.
    Die kannst Du so nennen wie Du willst*. Sie sollten nur so benannt werden, dass dem Hauptcodeleser (das bist Du!) immer wieder schnell klar wird, was jene Variable beinhaltet/macht/welchen Zweck sie hat und hoffentlich auch erfüllt.

    VB.NET-Quellcode

    1. 'm.E. gut:
    2. Dim TimeInSeconds As Integer = 1000
    3. 'eher schlecht:
    4. Dim Time As Integer = 1000 'Einheit unklar
    5. 'richtig doof:
    6. Dim t As Integer = 1000 'wofür steht t
    7. Dim Knusperhaus As Integer = 1000 'bitte was?
    8. Dim Buchtitel As Integer = 1000 'verwirrend, da "Buchtitel" einen Text/String impliziert

    siehe auch Beispiele für guten und schlechten Code (Stil)

    * es gibt Einschränkungen: z.B.: Darf nicht mit einer Zahl beginnen, keine krassen Sonderzeichen, VB-Schlüsselwörter müssen mit [] gerahmt sein (z.B.: Dim End As String geht nicht, da End ein Schlüsselwort in VB ist, aber Dim [End] As String geht.
    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.