Picturebox Präsentation

  • VB.NET

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

    Picturebox Präsentation

    Hallo Miteinander,

    Ich würde gerne ein kleines Programm schreiben, das alle Bilder von einem Ordner in die Picturebox lädt (Nacheinander mit einem Timer oder so)

    Die "Schwierigkeit":
    Die Bildernamen und die Anzahl der Bilder kann Variieren.
    Zuerst musst du beim Programmstart alle Dateien im Ordner auslesen.
    Danach erstellst du dir eine Liste (List Of String), in welcher alle diese Pfade gespeichert werden.
    Suchwort: "io.directory.getfiles"

    Nun einen Timer, welcher in dem Rythmus tickt, in welcher du die Bilder gewechselt haben möchtest.
    Im Tick-Event des Timers zählst du eine Variable hoch. Danach holst du dir das x-te Element (also den Pfad) aus der Liste und zeigst das Bild an.

    Tipp: Beim hochzählen überprüfen, ob der Counter höher ist, als es Dateien im Ordner gibt.
    Ansonsten wird das Proramm irgendwann abstürzen.

    Greez
    Dancger
    MESS WITH THE BEST, DIE LIKE THE REST! :evil:
    n'paar Links: DNS Tools, Steal WA DB, Droidsheep...
    Als erstes müsste man mit einer Schleife den Ordner durchlaufen (for each) und alle Bilddateien finden und die Dateinamen (mit endung) in eine Liste laden.
    Anschließend kannst du die Anzahl der gefundenen Bilder in eine Zählvariable laden.
    Im Timer gehst du anschließend die Liste deiner Bilder durch. Die Zählvariable bestimmt nach wievielen Durchgängen der Time stoppen soll.

    edit: zu spät :(
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Hey,

    nutze hier DataBinding mit Hilfe einer BindingSource. Die BindingSource-Klasse hat den Vorteil, dass Du hier einfach ".MoveNext()", ".MovePrevious()" nutzen kannst, um durch die verschiedenen Elemente zu navigieren. Hier entfällt dann das Gefummel mit Zählervariablen usw.

    Zum filtern der Bilder aus einem Verzeichnis nutze die "DirectoryInfo"-Klasse und deren Funktion ".GetFiles()". Um mehrere Filter anzuwenden, kannst Du auf LINQ, bzw. auf die entsprechenden Extensions zurückgreifen. Das Ergebnis dieser Abfrage legst Du als DataSource für die BindingSource fest. Für die PictureBox setzt Du entsprechend die DataBindings-Property.

    Bei jedem "Tick-Event" des Timers rufst Du nun einfach "BindingSource.MoveNext()" auf. Hier gilt es nur noch eine Überprüfung einzubauen, ob das Ende der Liste erreicht wurde => Fertig.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    ich habe es jetzt mal so gelöst:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. For Each dateien As String In My.Computer.FileSystem.GetFiles("P:\PK\Datenbank\Alles Neu\Bilder")
    3. Me.ListBox1.Items.Add(dateien)
    4. Next
    5. Timer1.Start()
    6. End Sub
    7. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    8. Me.ListBox1.SelectedIndex += 1
    9. Me.PictureBox1.Image = Image.FromFile(Me.ListBox1.SelectedItem)
    10. End Sub


    Ist dies keine saubere lösung?
    Du prüfst nicht, ob der Counter größer ist als die anzahl der Pfade bzw. Dateien. Mach eine If-Abfrage wo geprüft wird ob der index kleiner als die Anzahl der Dateien ist. Wenn ja, bild anzeigen/wechseln, wenn nicht dann den counter wieder auf 0 setzen.

    schnibli schrieb:


    Ist dies keine saubere lösung?


    Nein, das ist somit das Schlechteste, was Du machen kannst. In jeder Hinsicht.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Private _bS As New BindingSource()
    4. Private _sourcePath As New DirectoryInfo("d:\downloads")
    5. Private WithEvents _t As New Timer() With {.Interval = 1000}
    6. Public Sub New()
    7. InitializeComponent()
    8. _bS.DataSource = _sourcePath.GetFiles("*.jpg*")
    9. PictureBox1.DataBindings.Add(New Binding("ImageLocation", _bS, "FullName"))
    10. End Sub
    11. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    12. _t.Enabled = Not _t.Enabled
    13. End Sub
    14. Private Sub _t_Tick(sender As Object, e As EventArgs) Handles _t.Tick
    15. If _bS.Position + 1 > _bS.Count - 1 Then
    16. _t.Enabled = False
    17. MessageBox.Show("Done")
    18. Else
    19. Me.Text = _bS.Position & "/" & _bS.Count - 1
    20. _bS.MoveNext()
    21. End If
    22. End Sub
    23. End Class
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Hab es mal so angepasst

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Private _bS As New BindingSource()
    4. Private _sourcePath As New DirectoryInfo("\\192.168.61.5\projekte\PK\Datenbank\Alles Neu\Bilder")
    5. Private WithEvents _t As New Timer() With {.Interval = 1000}
    6. Public Sub New()
    7. Call start()
    8. End Sub
    9. Private Sub Button1_Click(sender As Object, e As EventArgs)
    10. _t.Enabled = Not _t.Enabled
    11. End Sub
    12. Private Sub _t_Tick(sender As Object, e As EventArgs) Handles _t.Tick
    13. If _bS.Position + 1 > _bS.Count - 1 Then
    14. _t.Enabled = False
    15. Call start()
    16. _bS.Position = 0
    17. Else
    18. Me.Text = _bS.Position & "/" & _bS.Count - 1
    19. _bS.MoveNext()
    20. End If
    21. End Sub
    22. Sub start()
    23. InitializeComponent()
    24. _bS.DataSource = _sourcePath.GetFiles("*.jpg*")
    25. PictureBox1.DataBindings.Add(New Binding("ImageLocation", _bS, "FullName"))
    26. _t.Start()
    27. End Sub


    Funktioniert nun einwandfrei... die Frage währe noch, ist es möglich einblendeffekte hinzuzufügen.
    Dabei soll das neue Bild über das alte kommen und nicht zwischendurch ein schwarzer oder weisser hintergrund.

    schnibli schrieb:

    einblendeffekte hinzuzufügen.
    Mach eine PowerPoint-Show.
    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!

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Private _bS As New BindingSource()
    4. Private _sourcePath As New DirectoryInfo("\\192.168.61.5\projekte\PK\Datenbank\Alles Neu\Bilder")
    5. Private WithEvents _t As New Timer() With {.Interval = 1000}
    6. Public Sub New()
    7. Call start()
    8. End Sub
    9. Private Sub Button1_Click(sender As Object, e As EventArgs)
    10. _t.Enabled = Not _t.Enabled
    11. End Sub
    12. Private Sub _t_Tick(sender As Object, e As EventArgs) Handles _t.Tick
    13. If _bS.Position + 1 > _bS.Count - 1 Then
    14. _t.Enabled = False
    15. Call start()
    16. _bS.Position = 0
    17. Else
    18. Me.Text = _bS.Position & "/" & _bS.Count - 1
    19. _bS.MoveNext()
    20. End If
    21. End Sub
    22. Sub start()
    23. InitializeComponent()
    24. _bS.DataSource = _sourcePath.GetFiles("*.jpg*")
    25. PictureBox1.DataBindings.Add(New Binding("ImageLocation", _bS, "FullName"))
    26. _t.Start()
    27. End Sub


    Ich arbeite mit diesem Code um Bilder in eine Picturebox zu laden, jedoch habe ich das Problem, wenn ich diesen eindlos laufen lasse, das dieser den Arbeitsspeicher füllt und das Programm irgendwann abkackt.

    Hat jemand eine idee wie ich das umgehen könnte
    Was soll das "Call" eigentlich?

    Wozu lädst du dir die Daten jedes Mal neu?

    Es reicht doch, wenn du nach dem Erreichen des letzten Bildes einfach die Position auf 0 setzt und den Timer weiterlaufen lässt. Lass das erneute Aufrufen von "start()" weg. Alle Daten sind ja vorhanden.

    Bau dir aber einen Stopp-Button, bei dem du die Präsentation beenden kannst.
    Und lass "InitializeComponents()" in "New()".

    Vor allem, brauchst du bei neuen Bildern auch nicht das Ganze neu machen, sondern nur die _bs.DataSource zu aktualisieren.

    @ErfinderDesRades
    Was meinst du genau? Im OB oder MSDN habe ich nichts gefunden, außer, dass es halt der Pfad zum Bild ist.