Diashow macht Probleme

  • VB.NET

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

    Diashow macht Probleme

    Hallo an alle,

    habe gerade erst angefangen in Visual Basic was zu machen.
    Nun habe ich für meinen Sportverein (Rollhockey) eine Anzeigetafel gemacht, die auch sehr gut funktioniert
    nun wollte ich in einer Picture Box Bilder ablaufen lassen wie eine Diashow.
    Die Bilder holt er sich aus einem Ordner wo alle Bilder abgelegt sind, das funktioniert auch alles
    nur wenn er beim letzten Bild angekommen ist hängt sich das Programm auf
    Ich finde den Fehler nicht und langsam sehe ich den Wald vor lauter Bäumen nicht

    Hoffe ihr könnt mir helfen


    Hier mal der Code für die Bilder

    Public Class Form1
    Private Pfad As String = "C:\Diashow"
    Dim Bildnr As Integer = -1




    Private Sub Timer12_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer12.Tick
    Timer12.Interval = 1000
    Bildnr += 1
    Dim files As ObjectModel.ReadOnlyCollection(Of String) = My.Computer.FileSystem.GetFiles(Pfad)
    Dim fileExtension As String = My.Computer.FileSystem.GetFileInfo(files(0)).Extension.ToLower
    While Not fileExtension = ".jpg" And Not fileExtension = ".png" And Not fileExtension = ".gif" And Not fileExtension = ".bmp"
    If Bildnr > files.Count - 1 Then
    Bildnr = 0
    End If
    End While
    PictureBox3.Load(files(Bildnr))
    End Sub
    End Class


    vielen Dank jetzt schon mal
    Peter
    Du solltest die ganze Sache etwas anders angehen. Statt bei jedem Timer-Tick die Bilder neu zu laden, solltest du dir die Pfade gleich bei Programmstart holen und bereits filtern. Dann kommst du nicht in irgendwelche Verwirrungen.

    Und pack deinen Code bitte in einen VB-Tag, damit man ihn besser lesen kann.
    Hallo,

    hoffe so kann man es nun besser lesen
    der Code an sich funktioniert ja, und mit dem Ordner "Diashow" kann ich immer die Bilder laufen lassen die ich will
    nur wenn das letzte Bild in dem Ordner kommt funktioniert das Programm nicht

    wie kann ich nun dem Programm sagen das es beim ersten Bild wieder anfangen soll und das endlos??

    Gruß
    Peter

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Pfad As String = "C:\Diashow"
    3. Dim Bildnr As Integer = -1
    4. Private Sub Timer12_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer12.Tick
    5. Timer12.Interval = 1000
    6. Bildnr += 1
    7. Dim files As ObjectModel.ReadOnlyCollection(Of String) = My.Computer.FileSystem.GetFiles(Pfad)
    8. Dim fileExtension As String = My.Computer.FileSystem.GetFileInfo(files(0)).Extension.ToLower
    9. While Not fileExtension = ".jpg" And Not fileExtension = ".png" And Not fileExtension = ".gif" And Not fileExtension = ".bmp"
    10. If Bildnr > files.Count - 1 Then
    11. Bildnr = 0
    12. End If
    13. End While
    14. PictureBox3.Load(files(Bildnr))
    15. End Sub
    16. End Class
    Timer12?!
    Nun gut, ich würde das mal ganz anders machen. Erstens IO statt My verwenden. Zweitens eine List(Of String) erstellen, wo du beim start des Programms alle Bilder hinzufügst. Dann halt ne Variable Bildnr anlegen und bei jedem TimerTick die um 1 erhöhen und mit ner If-Abfrage checken, ob die Bildnr nicht zu hoch ist (dann auf 0 setzten).
    Mfg
    Vincent

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VincentTB“ ()

    So, hier jetzt mal die Codeumsetzung von dem, was VincentTB und ich dir vorgeschlagen haben:

    VB.NET-Quellcode

    1. Private imagePaths As List(Of String)
    2. Private imageIndex As Integer
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. Dim extensions() = {".jpg", ".png", ".gif", ".bmp"}
    5. imagePaths = New List(Of String)(From file In (New DirectoryInfo("Pfad")).GetFiles Where extensions.Contains(file.Extension) Select file.FullName)
    6. End Sub
    7. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    8. PictureBox1.ImageLocation = imagePaths(imageIndex)
    9. imageIndex += 1
    10. If imageIndex = imagePaths.Count Then imageIndex = 0
    11. End Sub


    Edit: jetzt auch getestet und läuft tadellos.

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

    Ich würde es so machen:


    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.IO
    3. Public Class Form1
    4. Dim bildnr As Integer = 0
    5. Dim lst As New List(Of String)
    6. Dim path As New DirectoryInfo("Dein Pfad")
    7. Dim WithEvents tmr As New Timer With {.Interval = 1000, .Enabled = False}
    8. Dim pic As New PictureBox
    9. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    10. For Each File As FileInfo In path.GetFiles
    11. If File.Extension = ".png" OrElse File.Extension = ".jpg" OrElse File.Extension = ".bmp" Then
    12. lst.Add(File.FullName)
    13. End If
    14. Next
    15. tmr.Start()
    16. End Sub
    17. Private Sub tmr_Tick(sender As Object, e As EventArgs) Handles tmr.Tick
    18. bildnr += 1
    19. If bildnr < lst.Count - 1 Then
    20. pic.Image = Image.FromFile(lst(bildnr))
    21. Else
    22. bildnr = 0
    23. pic.Image = Image.FromFile(lst(0))
    24. End If
    25. End Sub
    26. End Class



    Bitte guck dir den Code so lange an, bis du ihn verstehst.


    EDIT: Wieso musste ich wieder so langsam sein...
    Mfg
    Vincent

    Hallo nochmal,

    langsam glaube ich wirklich das ich zu blöde für das ganze bin, habs immer noch nicht kopiert
    hier mal fast der ganze Code, hat nicht alles Platz, fehlen noch ein paar Timer für die ganzen Strafminuten
    bin immer noch nicht draufgekommen was falsch ist
    bin für jede Hilfe dankbar
    Peter

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Pfad As String = "C:\Diashow"
    3. Dim Bildnr As Integer = 0
    4. Private Sub Form1_keyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    5. If e.Shift AndAlso e.KeyCode = Keys.Z Then
    6. Me.WindowState = FormWindowState.Minimized
    7. End If
    8. If e.KeyCode = Keys.L Then
    9. Label3.Text += 1
    10. End If
    11. If Label3.Text < 0 Then
    12. Label3.Text = "0"
    13. End If
    14. If e.KeyCode = Keys.K Then
    15. Label3.Text -= 1
    16. Private Sub Timer12_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer12.Tick
    17. Timer12.Interval = 1000
    18. Bildnr += 1
    19. Dim files As ObjectModel.ReadOnlyCollection(Of String) = My.Computer.FileSystem.GetFiles(Pfad)
    20. Dim fileExtension As String = My.Computer.FileSystem.GetFileInfo(files(0)).Extension.ToLower
    21. While Not fileExtension = ".jpg" And Not fileExtension = ".png" And Not fileExtension = ".gif" And Not fileExtension = ".bmp"
    22. If Bildnr > files.Count - 1 Then
    23. Bildnr = 0
    24. End If
    25. End While
    26. PictureBox3.Load(files(Bildnr))
    27. End Sub
    28. End Class

    simonela80 schrieb:

    VB.NET-Quellcode

    1. If e.KeyCode = Keys.L Then
    2. Label3.Text += 1
    3. End If
    4. If Label3.Text < 0 Then
    5. Label3.Text = "0"
    6. End If
    1. Option Strict On, damit Du die Bemerkung von @Artentus: richtig verstehen kannst. Wir rechnen nicht mit Strings, das geht nämlich immer vor die Hose.
    2. lies die Datei-Liste bei Programmstart aus.
    3. Setze also eine Integer-Variable als Schrittweite entsprechend der Tastendrücke und rechne mit dieser.
    4. Das Timer-Intervall wird beim Start oder einem Button-Click gesetzt, nicht in der Timer-Tick-Prozedur.
    5. Mach die Tasten-Auswertung in einem Select Case.
    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!