Hallo zusammen,
ich habe in einem 2spaltigem ListView 15 MP3-Titel mit Größe dargestellt. Dies Einträge möchte ich mit drag&drop sortieren. Also nich alphabetisch. Da in der Liste nur der Titel selbst angezeigt wird, habe ich Pfad und Titel in einem Array gespeichert. Ich muß also bei einer Änderung im ListView diese in das Array übertragen.
Dabei passiert nun folgendes:
1. Ich ziehe Item1 (001.mp3) auf Item15(015.mp3) -> ListView klappt, Prüfung des Array - auch i.O.
2. Ich ziehe Item1 (002.mp3) auf Item15(001.mp3) -> ListView klappt, Prüfung des Array - auch i.O
3. Ich ziehe Item1 (003.mp3) auf Item14(001.mp3) -> ListView klappt manchmal, Prüfung des Array > Item1 ist nicht an Stelle von Item14, sondern auf Item13. Und manchmal nimmt er optisch das Item1, verschiebt aber dann das Item2
Ich sitz nun schon ein paar Stunden an dem Problem und finde keine Lösung.
Hier das Script zur Funktion ... lauffähig...
Spoiler anzeigen
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUIListView.au3>
#include <Array.au3>
Global $aDateien[0], $iDropItem
[/autoit] [autoit][/autoit] [autoit]$vScrHoehe=@DesktopHeight-100
$h_GUI = GUICreate(" Der DateiZufäller - Sortieren",500,$vScrHoehe,@DesktopWidth-500,5,-1,$WS_EX_ACCEPTFILES)
$Text=GUICtrlCreateLabel("Wähle die Dateien aus, die Du nutzen möchtest !"&@CR&"Ziehe sie einfach von Deiner Dateiverwaltung in die Tabelle.",20,10,660,50)
GUICtrlSetFont(-1,14,"","","Times New Roman")
GUICtrlSetColor(-1,0xFF0000)
$Liste=GUICtrlCreateListView ("",20,60,460,$vScrHoehe-155,Default,BitOR($WS_EX_CLIENTEDGE,$LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER)) ;$LVS_EX_HEADERDRAGDROP
GUICtrlSetFont(-1,14,"","","Times New Roman")
_GUICtrlListView_AddColumn($Liste, "Musikdatei", 373) ; Spaltenkopf & Breite festlegen
_GUICtrlListView_AddColumn($Liste, "Größe", 75)
GUICtrlSendMsg($Liste, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES,$LVS_ICON-1)
GUICtrlSetState($Liste, $GUI_DROPACCEPTED)
GUICtrlSetState($Liste,$LVS_EX_TRACKSELECT)
$Gesamt=GUICtrlCreateLabel("gesamt: ",20,830,52,20)
GUICtrlSetFont(-1,14,"","","Times New Roman")
$gesGB=GUICtrlCreateLabel("",250,830,145,30)
GUICtrlSetFont(-1,14,"","","Times New Roman")
$Auswahl=GUICtrlCreateButton("Auswahl vollständig ?",20,$vScrHoehe-60,170,40)
GUICtrlSetFont(-1,14,"","","Times New Roman")
GUICtrlSetState($Auswahl,$GUI_DISABLE)
$Start=GUICtrlCreateButton("Start",255,$vScrHoehe-60,100,40)
GUICtrlSetFont(-1,16,"","","Times New Roman")
GUICtrlSetState(-1,$GUI_HIDE)
$Ende=GUICtrlCreateButton("Beenden",375,$vScrHoehe-60,100,40)
GUICtrlSetFont(-1,12,"","","Times New Roman")
GUISetState()
[/autoit] [autoit][/autoit] [autoit]GUICtrlSetData($Text,"Sortiere jetzt Deine dateien !"&@CR&"Einfach anklicken und an die richtige Stelle ziehen.")
GUICtrlDelete($Auswahl)
GUICtrlSetState($Start,$GUI_SHOW)
; eigentlich Funktion zum Befüllen von ListView per d&d - hier eine Schleife zum Befüllen mit 15 Werten
[/autoit] [autoit][/autoit] [autoit]For $vI= 0 to 14
$vText=StringFormat("%03s",$vI+1)&".mp3"
GUICtrlCreateListViewItem($vText&"|"&StringFormat("%.2f",($vI+1)*Random(1.3,2.9))&"MB", $Liste)
_ArrayAdd($aDateien,$vText)
Next
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_PRIMARYUP
_LVDrop()
case $GUI_EVENT_PRIMARYDOWN
_LVDrag()
Case $GUI_EVENT_MOUSEMOVE
_LVMove()
Case $Start
ExitLoop
Case $GUI_EVENT_CLOSE, $Ende
Exit
EndSwitch
WEnd
Exit
;-----------------------------------------------------------------------------------------------------------------------------------------------
; LiestView sortieren mit d&d
Func _LVDrop()
Local $aItem = _GUICtrlListView_HitTest(GUICtrlGetHandle($Liste))
;_ArrayDisplay($aItem)
If $aItem[0] <> $iDropItem Then
If $aItem[0] >-1 And $iDropItem >-1 Then
Local $vText=$aDateien[$iDropItem]
If $aItem[0]=UBound($aDateien)-1 Then
_ArrayAdd($aDateien,$aDateien[$iDropItem])
Else
_ArrayInsert($aDateien,$aItem[0],$aDateien[$iDropItem])
EndIf
_ArrayDelete($aDateien,$iDropItem)
;_ArrayDisplay($aDateien,"$aDateien")
EndIf
Local $aItemText = _GUICtrlListView_GetItemTextArray($Liste, $iDropItem)
;_ArrayDisplay($aItemText,"$aItemText")
_GUICtrlListView_DeleteItem(GUICtrlGetHandle($Liste), $iDropItem)
Local $InsItem = _GUICtrlListView_InsertItem($Liste, $aItemText[1], $aItem[0])
_GUICtrlListView_SetItemText($Liste, $InsItem, $aItemText[2], 1)
_GUICtrlListView_SetItemSelected($Liste, $InsItem)
_GUICtrlListView_SetItemFocused($Liste, $InsItem)
EndIf
_ArrayDisplay($aDateien,"$aDateien")
EndFunc ;==>_LVDrop
Func _LVDrag()
Local $aItem = _GUICtrlListView_HitTest(GUICtrlGetHandle($Liste))
$iDropItem = $aItem[0] ;das angeklickte Item
EndFunc ;==>_LVDrag
Func _LVMove()
Local $aInfo = GUIGetCursorInfo($h_Gui)
If Not IsArray($aInfo) Then Return
If $aInfo[2] Then
Local $aItem = _GUICtrlListView_HitTest(GUICtrlGetHandle($Liste))
_GUICtrlListView_SetItemSelected($Liste, -1, False)
_GUICtrlListView_SetItemSelected($Liste, $aItem[0])
EndIf
EndFunc ;==>_LVMove
Hat Jemand ne Idee, wo hier der Wurm drin ist ???
Vorab schon mal Danke.....