Listboxeintrag nach Mehrfachauswahl von OpenFile

  • Guten Abend

    Als Einstieg wollte ich mir einen recht simplen Musikplayer bauen. Dieser funktioniert soweit auch, bis auf die Darstellungsfehler in der Listbox die mich stören.
    Wenn ich mit FileOpen mehrere Sounddateien auswähle, werden diese mit dem Dateinamen in die Listbox eingetragen. Doch es wird jedesmal noch ein weiterer Eintarg erstellt mit dem Pfad.
    Bei der Einzelauswahl wird jeweils direkt der ganze Pfad an den Eintrag angehängt.

    Ist es möglich, bei Einzel- und Mehrfachauswahl jeweils nur den Dateinamen eingetragen zu bekommen und man diese Dateien trotzdem abspielen kann?

    Habe noch einen Screenshot angehängt, damit ihr auch genau seht was ich mein ;)

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <Sound.au3>
    #include <string.au3>
    #include <array.au3>
    #Include <GuiStatusBar.au3>
    #include <GUIConstants.au3>
    #Include <GuiListBox.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $Listbox1
    global $file, $WS_HSCROLL, $Sound, $Button5, $soundFile

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Player", 365, 316, 652, 187)
    GUISetBkColor(0xC8C8C8)
    $filemenu = GUICtrlCreateMenu("Datei")
    $fileitem1 = GUICtrlCreateMenuItem("Öffnen...", $filemenu)
    $fileitem = GUICtrlCreateMenuItem("Beenden", $filemenu)
    $helpmenu = GUICtrlCreateMenu("?")
    $aboutitem = GUICtrlCreateMenuItem("About", $helpmenu)
    $ListBox1 = GUICtrlCreateList("", 8, 32, 249, 201)
    $Button7 = GUICtrlCreateButton("Öffnen...", 272, 40, 81, 25, 0)
    $Label1 = GUICtrlCreateLabel("Musikdateien", 8, 8, 87, 20)
    GUICtrlSetFont(-1, 10, 400, 2, "Century Gothic")
    $Button3 = GUICtrlCreateButton("Play", 56, 248, 70, 41, 0)
    GUICtrlSetImage(-1, "shell32.dll", 246)
    $Button4 = GUICtrlCreateButton("Pause", 136, 248, 70, 41, 0)
    $Button5 = GUICtrlCreateButton("Resume", 136, 248, 70, 41, 0)
    controlhide("Player","",$Button5)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

    Func _fileOpen()
    Local $file = FileOpenDialog("Musikdatei auswählen", "C:", "Song files (*.mp3; *.wma; *.wav)", 2+4)
    If @error Then Return
    GUICtrlSetData($ListBox1,$file)
    EndFunc ;==>_fileOpen

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    exit

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Case $msg = $Button7
    _fileOpen()

    [/autoit] [autoit][/autoit] [autoit]

    Case $msg = $Button3
    _SoundClose($Soundfile)
    $Sound = GUICtrlRead($ListBox1)
    $soundFile = _SoundOpen($Sound)
    _SoundPlay($soundFile)

    [/autoit] [autoit][/autoit] [autoit]

    Case $msg = $Button4
    _SoundPause($soundFile)
    controlhide("Player","",$Button4)
    ControlShow("Player","",$Button5)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Case $msg = $Button5
    _SoundResume($soundFile)
    controlhide("Player","",$Button5)
    ControlShow("Player","",$Button4)

    [/autoit] [autoit][/autoit] [autoit]

    ;Case $msg = $aboutitem
    ; _About()

    [/autoit] [autoit][/autoit] [autoit]

    Case $msg = $fileitem
    exit

    [/autoit] [autoit][/autoit] [autoit]

    Case $msg = $fileitem1
    _fileOpen()

    [/autoit] [autoit][/autoit] [autoit]

    EndSelect
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    #cs
    Func _About()
    Local $Form2, $GroupBox1, $Image1, $Label1, $Label2, $Label3
    Global $WS_GROUP

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ### Form=
    $Form2 = GUICreate("About", 200, 174, 200, 235)
    GUISetIcon("Data\screamer_gray.ico")
    $GroupBox1 = GUICtrlCreateGroup("", 8, 8, 185, 145)
    $Image1 = GUICtrlCreatePic("Data\Personal_picture.jpg", 24, 24, 105, 121)
    $Label1 = GUICtrlCreateLabel("Player", 20, 32, 104, 22, $WS_GROUP)
    GUICtrlSetFont(-1, 11, 400, 2, "Century Gothic")
    $Label2 = GUICtrlCreateLabel("Version 1.0", 20, 64, 83, 22, $WS_GROUP)
    GUICtrlSetFont(-1, 11, 400, 2, "Century Gothic")
    $Label3 = GUICtrlCreateLabel("by Jann Truog", 20, 96, 104, 22)
    GUICtrlSetFont(-1, 11, 400, 2, "Century Gothic")
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ##

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_About()
    #ce

    [/autoit]

    Danke und mfg
    autoit.de/wcf/attachment/5221/

    Einmal editiert, zuletzt von Troin (20. Juni 2009 um 18:49)

  • Hallo Troin,

    am besten siehst du dir mal den Starplayer von Oscar im Forum Scripte an, er verwendet ListViews und lässt auch mehrfaches Einfügen durch über den FileOpendialog zu,

    mfg (Auto)Bert

  • Hallo

    Am besten Du erstellst 2 Array's. Ins erste liest Du die Dateien aus dem OpenFile ein und ins 2. mittels StringTrim nur die Dateinamen, die Du im ListView anzeigen kannst. Da die Dateien den selben Index haben, kannst Du darüber auf die Dateipfade zugreifen.

    Gruß Ralf

    P.s.: habe mir gerade den Rückgabewert des FileOpenDialogs angesehen.
    Gibt den kompletten Pfad der ausgewählten Datei zurück. Rückgabe mehrerer Dateien wie folgt: "Verzeichnis|Datei1|Datei2|..."
    Um im Listview nur die Dateien anzuzeigen brauchst Du nur mittels StringSplit die Rückgabe in ein Array einlesen und im Listview alle bis aufs erste eintragen.

    Einmal editiert, zuletzt von Flarkus (20. Juni 2009 um 00:37)

  • Du kannst auch ein ListView im LIST-Style verwenden und den Pfad als SubItem mitspeichern:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <Sound.au3>
    #include <string.au3>
    #include <array.au3>
    #Include <GuiStatusBar.au3>
    #include <GUIConstants.au3>
    #Include <GuiListView.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $ListView1, $hListView1
    global $file, $WS_HSCROLL, $Sound, $Button5, $soundFile

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Player", 365, 316, 652, 187)
    GUISetBkColor(0xC8C8C8)
    $filemenu = GUICtrlCreateMenu("Datei")
    $fileitem1 = GUICtrlCreateMenuItem("Öffnen...", $filemenu)
    $fileitem = GUICtrlCreateMenuItem("Beenden", $filemenu)
    $helpmenu = GUICtrlCreateMenu("?")
    $aboutitem = GUICtrlCreateMenuItem("About", $helpmenu)
    $ListView1 = GUICtrlCreateListView("Name|Pfad", 8, 32, 249, 201)
    GUICtrlSetStyle(-1, BitOR($LVS_SHOWSELALWAYS, $LVS_SINGLESEL, $LVS_LIST))
    $hListView1 = GUICtrlGetHandle($ListView1)
    $Button7 = GUICtrlCreateButton("Öffnen...", 272, 40, 81, 25, 0)
    $Label1 = GUICtrlCreateLabel("Musikdateien", 8, 8, 87, 20)
    GUICtrlSetFont(-1, 10, 400, 2, "Century Gothic")
    $Button3 = GUICtrlCreateButton("Play", 56, 248, 70, 41, 0)
    GUICtrlSetImage(-1, "shell32.dll", 246)
    $Button4 = GUICtrlCreateButton("Pause", 136, 248, 70, 41, 0)
    $Button5 = GUICtrlCreateButton("Resume", 136, 248, 70, 41, 0)
    $Button6 = GUICtrlCreateButton("Stop", 216, 248, 70, 41, 0)
    controlhide("Player","",$Button5)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

    Func _fileOpen()
    Local $file = FileOpenDialog("Musikdatei auswählen", "C:", "Song files (*.mp3; *.wma; *.wav)", 2+4)
    If @error Then Return
    $file = StringSplit($file, "|")
    Local $iItem
    If $file[0] = 1 Then
    If _GUICtrlListView_FindInText($hListView1, $file[1]) >= 0 Then Return
    Local $fileName = StringRegExp($file[1], "[\\/]([^\\/]+)\Z",1)
    $iItem = _GUICtrlListView_AddItem($hListView1, $fileName[0])
    _GUICtrlListView_AddSubItem($hListView1, $iItem, $file[1], 1)
    Else
    For $i = 2 To $file[0]
    If _GUICtrlListView_FindInText($hListView1, $file[1]& "\" & $file[$i]) >= 0 Then ContinueLoop
    $iItem = _GUICtrlListView_AddItem($hListView1, $file[$i])
    _GUICtrlListView_AddSubItem($hListView1, $iItem, $file[1] & "\" & $file[$i], 1)
    Next
    EndIf
    ;_GUICtrlListView_AddItem($Listbox1, $file)
    ;GUICtrlSetData($ListBox1,$file)
    EndFunc ;==>_fileOpen

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    _SoundClose($soundFile)
    exit

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Case $msg = $Button7
    _fileOpen()

    [/autoit] [autoit][/autoit] [autoit]

    Case $msg = $Button3
    _SoundClose($Soundfile)
    ;$Sound = GUICtrlRead($ListBox1)
    $Sound = _GUICtrlListView_GetItemText($hListView1, _GUICtrlListView_GetSelectedIndices($hListView1, False), 1)
    $soundFile = _SoundOpen($Sound)
    _SoundPlay($soundFile)

    [/autoit] [autoit][/autoit] [autoit]

    Case $msg = $Button4
    _SoundPause($soundFile)
    GUICtrlSetState($Button4, $GUI_HIDE)
    GUICtrlSetState($Button5, $GUI_SHOW)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Case $msg = $Button5
    _SoundResume($soundFile)
    GUICtrlSetState($Button5, $GUI_HIDE)
    GUICtrlSetState($Button4, $GUI_SHOW)

    Case $msg = $Button6
    _SoundStop($soundFile)
    GUICtrlSetState($Button5, $GUI_HIDE)
    GUICtrlSetState($Button4, $GUI_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    ;Case $msg = $aboutitem
    ; _About()

    [/autoit] [autoit][/autoit] [autoit]

    Case $msg = $fileitem
    exit

    [/autoit] [autoit][/autoit] [autoit]

    Case $msg = $fileitem1
    _fileOpen()

    [/autoit] [autoit][/autoit] [autoit]

    EndSelect
    WEnd

    [/autoit]


    //Edit: Hatte tatsächlich nen Copy&Paste-Fehler in Zeile 48 :(

    Einmal editiert, zuletzt von progandy (21. Juni 2009 um 16:38)

  • Hallo

    Erstmal vielen Dank für die Hilfe, doch ein Problem habe ich noch:

    Ich kann mir irgendwie nicht so recht vorstellen wie das Ganze mit der Möglichkeit von progandy auch für die Mehrfachauswahl der Sounddateien im FileOpenDialog klappen soll.

    mfg Troin

  • Hast du es schon ausprobiert?
    Bei der Mehrfachauswahl ist der String so aufgebaut: ORDNERPFAD|Dateiname.1|Dateiname.2|Dateiname.3
    Nach dem StringSplit sieht das so aus:
    $array[0] = 4
    $array[1] = ORDNERPFAD
    $array[2] = Dateiname.1
    $array[3] = Dateiname.3
    $array[4] = Dateiname.3

    Jetzt wird einfach als Item der Name ($array[$i]) angelegt und als SubItem dazu der komplette Pfad ( $array[1] & "\" & $array[$i] )

  • Ja ich habe da jetzt ne ganze Weile rumprobiert ^^
    Danke für den Tip ich werd mal schauen ob ich das allein schaffe ;)

    mfg

  • Hallo

    Da ich auch ein Anfänger bin versuche ich auch dieses Problem zu lösen um dazu zu lernen. Doch ich komme trotz den guten Tipps nicht auf die Lösung.
    Wenn jemand weitere Vorschläge oder Ideen hat und die hier veröffentlich, wäre ich sehr dankbar.

    lg

  • Öhh, probiert eigentlich niemand den code aus Post #4 aus? Da steht doch schon alles drin...

  • Doch klar, mit dem probier ich es ja schon die ganze Zeit ^^
    Aber wie beschrieben funzt der Code nicht wenn man mehrere Files im FileOpen markiert und diese in die Liste eintragen will.
    Binn immernoch am ausprobieren doch komme ned wirklich drauf trotz deinen Tips.

  • Hallo

    in Zeile 51 hat sich (anscheinend durch Copy und Paste) ein Flüchtigkeitsfehler eingeschlichen, müsste so aussehen:

    [autoit]

    _GUICtrlListView_AddSubItem($hListView1, $iItem, $file[$i] & "\" & $file[$i], 1)

    [/autoit]

    nimmt zwar in Liste auf wird aber nicht gespielt,

    so muss die func _fileopen aussehen (Fehler war in 48 :(

    [autoit]

    Func _fileOpen()
    Local $file = FileOpenDialog("Musikdatei auswählen", "C:", "Song files (*.mp3; *.wma; *.wav)", 2+4)
    If @error Then Return
    $file = StringSplit($file, "|")
    Local $iItem
    _arrayDisplay($file)
    If $file[0] = 1 Then
    If _GUICtrlListView_FindInText($hListView1, $file[1]) >= 0 Then Return
    Local $fileName = StringRegExp($file[1], "[\\/]([^\\/]+)\Z",1)
    $iItem = _GUICtrlListView_AddItem($hListView1, $fileName[0])
    _GUICtrlListView_AddSubItem($hListView1, $iItem, $file[1], 1)
    Else
    For $i = 2 To $file[0]
    If _GUICtrlListView_FindInText($hListView1, $file[$i]) >= 0 Then ContinueLoop
    $iItem = _GUICtrlListView_AddItem($hListView1, $file[$i])
    _GUICtrlListView_AddSubItem($hListView1, $iItem, $file[1] & "\" & $file[$i], 1)
    Next
    EndIf
    ;_GUICtrlListView_AddItem($Listbox1, $file)
    ;GUICtrlSetData($ListBox1,$file)
    EndFunc ;==>_fileOpen

    [/autoit]


    mfg (Auto)Bert

    Einmal editiert, zuletzt von AutoBert (20. Juni 2009 um 17:33)